ETH Price: $2,293.76 (-2.72%)

Token

Xyxyx (XYXYX)
 

Overview

Max Total Supply

128 XYXYX

Holders

30

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2.581377222148659211 XYXYX
0x3eee3618163a9109be4ec98547e90cfd68949223
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Xyxyx is an ERC404-powered inscription protocol that runs fully on-chain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Xyxyx

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}


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


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

pragma solidity ^0.8.20;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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


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

pragma solidity ^0.8.20;

/**
 * @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: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.20;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        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_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: https://github.com/0xacme/ERC404/blob/main/src/ERC404.sol


pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}
//SPDX-License-Identifier: UNLICENSED
/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}


pragma solidity ^0.8.0;


contract Xyxyx is ERC404 {

    constructor(
    ) ERC404("Xyxyx", "XYXYX", 18, 128, msg.sender) {
        balanceOf[msg.sender] = 128 * 10 ** 18;
        setWhitelist(msg.sender, true);
    }

    function getColorComponentRed(uint256 value)
        internal
        pure
        returns (uint16)
    {
        return uint16((value >> 8) & 0xf);
    }

    function getColorComponentGreen(uint256 value)
        internal
        pure
        returns (uint16)
    {
        return uint16((value >> 4) & 0xf);
    }

    function getColorComponentBlue(uint256 value)
        internal
        pure
        returns (uint16)
    {
        return uint16(value & 0xf);
    }

    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function getColorHexCode(uint256 value)
        internal
        pure
        returns (string memory)
    {
        uint16 red = getColorComponentRed(value);
        uint16 green = getColorComponentGreen(value);
        uint16 blue = getColorComponentBlue(value);

        bytes memory buffer = new bytes(7);

        buffer[0] = "#";
        buffer[1] = _HEX_SYMBOLS[red];
        buffer[2] = _HEX_SYMBOLS[red];
        buffer[3] = _HEX_SYMBOLS[green];
        buffer[4] = _HEX_SYMBOLS[green];
        buffer[5] = _HEX_SYMBOLS[blue];
        buffer[6] = _HEX_SYMBOLS[blue];

        return string(buffer);
    }

    function xyHash(string memory prefix, uint256 tokenId)
        private
        pure
        returns (uint256)
    {
        return uint256(keccak256(abi.encodePacked(prefix, tokenId))) % 4096;
    }

    function getColor1(uint256 tokenId) public pure returns (uint256) {
        return xyHash("1", tokenId);
    }

    function getColor2(uint256 tokenId) public pure returns (uint256) {
        return xyHash("2", tokenId);
    }


    function tokenURI(uint256 tokenId) public pure override returns (string memory) {
        string[5] memory parts;
        uint256 color1 = getColor1(tokenId);
        uint256 color2 = getColor2(tokenId);
        parts[
            0
        ] = '<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg">';

        parts[1] = '<rect width="100%" height="250px" fill="#000" />';

        parts[2] = string(
                abi.encodePacked(
                    '<rect width="50%" height="250px" fill="',
                    getColorHexCode(color1),
                    '" transform="translate(0, 250.000000)" />'
                )
            );

        parts[3] = string(
                abi.encodePacked(
                    '<rect width="50%" height="250px" fill="',
                    getColorHexCode(color2),
                    '" transform="translate(250, 250.000000)" />'
                )
            );

        parts[4] = string(abi.encodePacked(
                '<text xmlns="http://www.w3.org/2000/svg" transform="translate(23.000000,33.000000)" fill="#fff" font-family="Courier New,Courier,Lucida Sans Typewriter,Lucida Typewriter,monospace" font-size="10px" font-weight="bold">',
                toString(tokenId),
                '</text></svg>'
            )
        );

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4])
        );


        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Xyxyx #',
                        toString(tokenId),
                        '", "description": "", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

            return output;

    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c060405234801562000010575f80fd5b506040518060400160405280600581526020017f58797879780000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f58595859580000000000000000000000000000000000000000000000000000008152506012608033805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e9576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350846001908162000194919062000584565b508360029081620001a6919062000584565b508260ff1660808160ff1681525050608051600a620001c69190620007f1565b82620001d3919062000841565b60a0818152505050505050506806f05b59d3b200000060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506200023d3360016200024360201b60201c565b6200088b565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620002c8576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200039c57607f821691505b602082108103620003b257620003b162000357565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003d9565b620004228683620003d9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200046c6200046662000460846200043a565b62000443565b6200043a565b9050919050565b5f819050919050565b62000487836200044c565b6200049f620004968262000473565b848454620003e5565b825550505050565b5f90565b620004b5620004a7565b620004c28184846200047c565b505050565b5b81811015620004e957620004dd5f82620004ab565b600181019050620004c8565b5050565b601f82111562000538576200050281620003b8565b6200050d84620003ca565b810160208510156200051d578190505b620005356200052c85620003ca565b830182620004c7565b50505b505050565b5f82821c905092915050565b5f6200055a5f19846008026200053d565b1980831691505092915050565b5f62000574838362000549565b9150826002028217905092915050565b6200058f8262000320565b67ffffffffffffffff811115620005ab57620005aa6200032a565b5b620005b7825462000384565b620005c4828285620004ed565b5f60209050601f831160018114620005fa575f8415620005e5578287015190505b620005f1858262000567565b86555062000660565b601f1984166200060a86620003b8565b5f5b8281101562000633578489015182556001820191506020850194506020810190506200060c565b868310156200065357848901516200064f601f89168262000549565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115620006f257808604811115620006ca57620006c962000668565b5b6001851615620006da5780820291505b8081029050620006ea8562000695565b9450620006aa565b94509492505050565b5f826200070c5760019050620007de565b816200071b575f9050620007de565b81600181146200073457600281146200073f5762000775565b6001915050620007de565b60ff84111562000754576200075362000668565b5b8360020a9150848211156200076e576200076d62000668565b5b50620007de565b5060208310610133831016604e8410600b8410161715620007af5782820a905083811115620007a957620007a862000668565b5b620007de565b620007be8484846001620006a1565b92509050818404811115620007d857620007d762000668565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620007fd826200043a565b91506200080a83620007e5565b9250620008397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006fb565b905092915050565b5f6200084d826200043a565b91506200085a836200043a565b92508282026200086a816200043a565b9150828204841483151762000884576200088362000668565b5b5092915050565b60805160a051613c9a620008b45f395f6108bc01525f81816111f60152611ca80152613c9a5ff3fe608060405234801561000f575f80fd5b5060043610610156575f3560e01c80636352211e116100c1578063a9059cbb1161007a578063a9059cbb146103d8578063b88d4fde14610408578063c87b56dd14610424578063dd62ed3e14610454578063e985e9c514610484578063f2fde38b146104b457610156565b80636352211e146102f057806370a08231146103205780638da5cb5b1461035057806395d89b411461036e5780639b19251a1461038c578063a22cb465146103bc57610156565b80632b968958116101135780632b96895814610242578063313ce5671461024c57806342842e0e1461026a5780634f02c4201461028657806353d6fd59146102a4578063620f4fa9146102c057610156565b806306fdde031461015a578063081812fc14610178578063095ea7b3146101a857806316a6b151146101d857806318160ddd1461020857806323b872dd14610226575b5f80fd5b6101626104d0565b60405161016f9190612c88565b60405180910390f35b610192600480360381019061018d9190612ce3565b61055c565b60405161019f9190612d4d565b60405180910390f35b6101c260048036038101906101bd9190612d90565b61058c565b6040516101cf9190612de8565b60405180910390f35b6101f260048036038101906101ed9190612ce3565b610873565b6040516101ff9190612e10565b60405180910390f35b6102106108ba565b60405161021d9190612e10565b60405180910390f35b610240600480360381019061023b9190612e29565b6108de565b005b61024a6110d5565b005b6102546111f4565b6040516102619190612e94565b60405180910390f35b610284600480360381019061027f9190612e29565b611218565b005b61028e611347565b60405161029b9190612e10565b60405180910390f35b6102be60048036038101906102b99190612ed7565b61134d565b005b6102da60048036038101906102d59190612ce3565b611429565b6040516102e79190612e10565b60405180910390f35b61030a60048036038101906103059190612ce3565b611470565b6040516103179190612d4d565b60405180910390f35b61033a60048036038101906103359190612f15565b61150e565b6040516103479190612e10565b60405180910390f35b610358611523565b6040516103659190612d4d565b60405180910390f35b610376611546565b6040516103839190612c88565b60405180910390f35b6103a660048036038101906103a19190612f15565b6115d2565b6040516103b39190612de8565b60405180910390f35b6103d660048036038101906103d19190612ed7565b6115ef565b005b6103f260048036038101906103ed9190612d90565b6116e7565b6040516103ff9190612de8565b60405180910390f35b610422600480360381019061041d9190612fa1565b6116fb565b005b61043e60048036038101906104399190612ce3565b611830565b60405161044b9190612c88565b60405180910390f35b61046e60048036038101906104699190613025565b611a95565b60405161047b9190612e10565b60405180910390f35b61049e60048036038101906104999190613025565b611ab5565b6040516104ab9190612de8565b60405180910390f35b6104ce60048036038101906104c99190612f15565b611adf565b005b600180546104dd90613090565b80601f016020809104026020016040519081016040528092919081815260200182805461050990613090565b80156105545780601f1061052b57610100808354040283529160200191610554565b820191905f5260205f20905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561059e57505f82115b15610786575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610695575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156106cc576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516107789190612e10565b60405180910390a350610869565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108609190612e10565b60405180910390a35b6001905092915050565b5f6108b36040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525083611c64565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003548111610f965760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461097c576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e1576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610a9f575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b07575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610b3e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b46611ca5565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b9191906130ed565b92505081905550610ba0611ca5565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610cf691906130ed565b81548110610d0757610d06613120565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610d7357610d72613120565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610dcc57610dcb61314d565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610eb491906130ed565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610f7b611ca5565b604051610f889190612e10565b60405180910390a3506110d0565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110c257818161104591906130ed565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6110cd848484611cd8565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611159576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112238383836108de565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561130b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016112a9939291906131ad565b6020604051808303815f875af11580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e9919061324a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611342576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f6114696040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525083611c64565b9050919050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611509576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461155390613090565b80601f016020809104026020016040519081016040528092919081815260200182805461157f90613090565b80156115ca5780601f106115a1576101008083540402835291602001916115ca565b820191905f5260205f20905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116db9190612de8565b60405180910390a35050565b5f6116f3338484611cd8565b905092915050565b6117068585856108de565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156117f2575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016117909594939291906132af565b6020604051808303815f875af11580156117ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d0919061324a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611829576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b606061183a612bd7565b5f61184484611429565b90505f61185085610873565b9050604051806080016040528060418152602001613be460419139835f6005811061187e5761187d613120565b5b6020020181905250604051806060016040528060308152602001613bb460309139836001600581106118b3576118b2613120565b5b60200201819052506118c482612028565b6040516020016118d49190613415565b604051602081830303815290604052836002600581106118f7576118f6613120565b5b602002018190525061190881612028565b60405160200161191891906134b1565b6040516020818303038152906040528360036005811061193b5761193a613120565b5b602002018190525061194c856123fb565b60405160200161195c9190613655565b6040516020818303038152906040528360046005811061197f5761197e613120565b5b60200201819052505f835f6005811061199b5761199a613120565b5b6020020151846001600581106119b4576119b3613120565b5b6020020151856002600581106119cd576119cc613120565b5b6020020151866003600581106119e6576119e5613120565b5b6020020151876004600581106119ff576119fe613120565b5b6020020151604051602001611a18959493929190613681565b60405160208183030381529060405290505f611a64611a36886123fb565b611a3f84612554565b604051602001611a509291906137cf565b604051602081830303815290604052612554565b905080604051602001611a77919061385d565b60405160208183030381529060405291508195505050505050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b63576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc8576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f6110008383604051602001611c7b92919061389e565b604051602081830303815290604052805190602001205f1c611c9d91906138f2565b905092915050565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a611cd39190613a51565b905090565b5f80611ce2611ca5565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611db291906130ed565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611edc575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611e9b9190613a9b565b8484611ea79190613a9b565b611eb191906130ed565b90505f5b81811015611ed957611ec6896126e4565b8080611ed190613acb565b915050611eb5565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611fb5575f8382611f379190613a9b565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f809190613a9b565b611f8a91906130ed565b90505f5b81811015611fb257611f9f88612929565b8080611faa90613acb565b915050611f8e565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516120129190612e10565b60405180910390a3600193505050509392505050565b60605f61203483612bab565b90505f61204084612bbb565b90505f61204c85612bcb565b90505f600767ffffffffffffffff81111561206a57612069613b12565b5b6040519080825280601f01601f19166020018201604052801561209c5781602001600182028036833780820191505090505b5090507f2300000000000000000000000000000000000000000000000000000000000000815f815181106120d3576120d2613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008461ffff166010811061213857612137613120565b5b1a60f81b816001815181106121505761214f613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008461ffff16601081106121b5576121b4613120565b5b1a60f81b816002815181106121cd576121cc613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008361ffff166010811061223257612231613120565b5b1a60f81b8160038151811061224a57612249613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008361ffff16601081106122af576122ae613120565b5b1a60f81b816004815181106122c7576122c6613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008261ffff166010811061232c5761232b613120565b5b1a60f81b8160058151811061234457612343613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008261ffff16601081106123a9576123a8613120565b5b1a60f81b816006815181106123c1576123c0613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080945050505050919050565b60605f8203612441576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061254f565b5f8290505f5b5f821461247057808061245990613acb565b915050600a826124699190613a9b565b9150612447565b5f8167ffffffffffffffff81111561248b5761248a613b12565b5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b5f8514612548576001826124d591906130ed565b9150600a856124e491906138f2565b60306124f09190613b3f565b60f81b81838151811061250657612505613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125419190613a9b565b94506124c1565b8093505050505b919050565b60605f825190505f81036125795760405180602001604052805f8152509150506126df565b5f60036002836125899190613b3f565b6125939190613a9b565b600461259f9190613b72565b90505f6020826125af9190613b3f565b67ffffffffffffffff8111156125c8576125c7613b12565b5b6040519080825280601f01601f1916602001820160405280156125fa5781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001613c2560409139905060018101602083015f5b8681101561269c5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612623565b5060038606600181146126b657600281146126c6576126d1565b613d3d60f01b60028303526126d1565b603d60f81b60018303525b508484525050819450505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612749576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506127d491906130ed565b815481106127e5576127e4613120565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061283d5761283c61314d565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361298e576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a3a576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612b3791906130ed565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f600f600883901c169050919050565b5f600f600483901c169050919050565b5f600f82169050919050565b6040518060a001604052806005905b6060815260200190600190039081612be65790505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c35578082015181840152602081019050612c1a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612c5a82612bfe565b612c648185612c08565b9350612c74818560208601612c18565b612c7d81612c40565b840191505092915050565b5f6020820190508181035f830152612ca08184612c50565b905092915050565b5f80fd5b5f80fd5b5f819050919050565b612cc281612cb0565b8114612ccc575f80fd5b50565b5f81359050612cdd81612cb9565b92915050565b5f60208284031215612cf857612cf7612ca8565b5b5f612d0584828501612ccf565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d3782612d0e565b9050919050565b612d4781612d2d565b82525050565b5f602082019050612d605f830184612d3e565b92915050565b612d6f81612d2d565b8114612d79575f80fd5b50565b5f81359050612d8a81612d66565b92915050565b5f8060408385031215612da657612da5612ca8565b5b5f612db385828601612d7c565b9250506020612dc485828601612ccf565b9150509250929050565b5f8115159050919050565b612de281612dce565b82525050565b5f602082019050612dfb5f830184612dd9565b92915050565b612e0a81612cb0565b82525050565b5f602082019050612e235f830184612e01565b92915050565b5f805f60608486031215612e4057612e3f612ca8565b5b5f612e4d86828701612d7c565b9350506020612e5e86828701612d7c565b9250506040612e6f86828701612ccf565b9150509250925092565b5f60ff82169050919050565b612e8e81612e79565b82525050565b5f602082019050612ea75f830184612e85565b92915050565b612eb681612dce565b8114612ec0575f80fd5b50565b5f81359050612ed181612ead565b92915050565b5f8060408385031215612eed57612eec612ca8565b5b5f612efa85828601612d7c565b9250506020612f0b85828601612ec3565b9150509250929050565b5f60208284031215612f2a57612f29612ca8565b5b5f612f3784828501612d7c565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612f6157612f60612f40565b5b8235905067ffffffffffffffff811115612f7e57612f7d612f44565b5b602083019150836001820283011115612f9a57612f99612f48565b5b9250929050565b5f805f805f60808688031215612fba57612fb9612ca8565b5b5f612fc788828901612d7c565b9550506020612fd888828901612d7c565b9450506040612fe988828901612ccf565b935050606086013567ffffffffffffffff81111561300a57613009612cac565b5b61301688828901612f4c565b92509250509295509295909350565b5f806040838503121561303b5761303a612ca8565b5b5f61304885828601612d7c565b925050602061305985828601612d7c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806130a757607f821691505b6020821081036130ba576130b9613063565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6130f782612cb0565b915061310283612cb0565b925082820390508181111561311a576131196130c0565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6131985f8361317a565b91506131a38261318a565b5f82019050919050565b5f6080820190506131c05f830186612d3e565b6131cd6020830185612d3e565b6131da6040830184612e01565b81810360608301526131eb8161318d565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613229816131f5565b8114613233575f80fd5b50565b5f8151905061324481613220565b92915050565b5f6020828403121561325f5761325e612ca8565b5b5f61326c84828501613236565b91505092915050565b828183375f83830152505050565b5f61328e838561317a565b935061329b838584613275565b6132a483612c40565b840190509392505050565b5f6080820190506132c25f830188612d3e565b6132cf6020830187612d3e565b6132dc6040830186612e01565b81810360608301526132ef818486613283565b90509695505050505050565b5f81905092915050565b7f3c726563742077696474683d2235302522206865696768743d223235307078225f8201527f2066696c6c3d2200000000000000000000000000000000000000000000000000602082015250565b5f61335f6027836132fb565b915061336a82613305565b602782019050919050565b5f61337f82612bfe565b61338981856132fb565b9350613399818560208601612c18565b80840191505092915050565b7f22207472616e73666f726d3d227472616e736c61746528302c203235302e30305f8201527f303030302922202f3e0000000000000000000000000000000000000000000000602082015250565b5f6133ff6029836132fb565b915061340a826133a5565b602982019050919050565b5f61341f82613353565b915061342b8284613375565b9150613436826133f3565b915081905092915050565b7f22207472616e73666f726d3d227472616e736c617465283235302c203235302e5f8201527f3030303030302922202f3e000000000000000000000000000000000000000000602082015250565b5f61349b602b836132fb565b91506134a682613441565b602b82019050919050565b5f6134bb82613353565b91506134c78284613375565b91506134d28261348f565b915081905092915050565b7f3c7465787420786d6c6e733d22687474703a2f2f7777772e77332e6f72672f325f8201527f3030302f73766722207472616e73666f726d3d227472616e736c61746528323360208201527f2e3030303030302c33332e30303030303029222066696c6c3d2223666666222060408201527f666f6e742d66616d696c793d22436f7572696572204e65772c436f757269657260608201527f2c4c75636964612053616e7320547970657772697465722c4c7563696461205460808201527f7970657772697465722c6d6f6e6f73706163652220666f6e742d73697a653d2260a08201527f313070782220666f6e742d7765696768743d22626f6c64223e0000000000000060c082015250565b5f6135f560d9836132fb565b9150613600826134dd565b60d982019050919050565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000005f82015250565b5f61363f600d836132fb565b915061364a8261360b565b600d82019050919050565b5f61365f826135e9565b915061366b8284613375565b915061367682613633565b915081905092915050565b5f61368c8288613375565b91506136988287613375565b91506136a48286613375565b91506136b08285613375565b91506136bc8284613375565b91508190509695505050505050565b7f7b226e616d65223a2022587978797820230000000000000000000000000000005f82015250565b5f6136ff6011836132fb565b915061370a826136cb565b601182019050919050565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a20225f8201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015250565b5f61376f603a836132fb565b915061377a82613715565b603a82019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6137b96002836132fb565b91506137c482613785565b600282019050919050565b5f6137d9826136f3565b91506137e58285613375565b91506137f082613763565b91506137fc8284613375565b9150613807826137ad565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f613847601d836132fb565b915061385282613813565b601d82019050919050565b5f6138678261383b565b91506138738284613375565b915081905092915050565b5f819050919050565b61389861389382612cb0565b61387e565b82525050565b5f6138a98285613375565b91506138b58284613887565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138fc82612cb0565b915061390783612cb0565b925082613917576139166138c5565b5b828206905092915050565b5f8160011c9050919050565b5f808291508390505b600185111561397757808604811115613953576139526130c0565b5b60018516156139625780820291505b808102905061397085613922565b9450613937565b94509492505050565b5f8261398f5760019050613a4a565b8161399c575f9050613a4a565b81600181146139b257600281146139bc576139eb565b6001915050613a4a565b60ff8411156139ce576139cd6130c0565b5b8360020a9150848211156139e5576139e46130c0565b5b50613a4a565b5060208310610133831016604e8410600b8410161715613a205782820a905083811115613a1b57613a1a6130c0565b5b613a4a565b613a2d848484600161392e565b92509050818404811115613a4457613a436130c0565b5b81810290505b9392505050565b5f613a5b82612cb0565b9150613a6683612e79565b9250613a937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613980565b905092915050565b5f613aa582612cb0565b9150613ab083612cb0565b925082613ac057613abf6138c5565b5b828204905092915050565b5f613ad582612cb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0757613b066130c0565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f613b4982612cb0565b9150613b5483612cb0565b9250828201905080821115613b6c57613b6b6130c0565b5b92915050565b5f613b7c82612cb0565b9150613b8783612cb0565b9250828202613b9581612cb0565b91508282048414831517613bac57613bab6130c0565b5b509291505056fe3c726563742077696474683d223130302522206865696768743d223235307078222066696c6c3d222330303022202f3e3c7376672077696474683d2235303022206865696768743d223530302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200e81590a68d2c0427e7a1f89aa44c3f4e1a2061065293e243ebb647f81b660a664736f6c63430008140033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610156575f3560e01c80636352211e116100c1578063a9059cbb1161007a578063a9059cbb146103d8578063b88d4fde14610408578063c87b56dd14610424578063dd62ed3e14610454578063e985e9c514610484578063f2fde38b146104b457610156565b80636352211e146102f057806370a08231146103205780638da5cb5b1461035057806395d89b411461036e5780639b19251a1461038c578063a22cb465146103bc57610156565b80632b968958116101135780632b96895814610242578063313ce5671461024c57806342842e0e1461026a5780634f02c4201461028657806353d6fd59146102a4578063620f4fa9146102c057610156565b806306fdde031461015a578063081812fc14610178578063095ea7b3146101a857806316a6b151146101d857806318160ddd1461020857806323b872dd14610226575b5f80fd5b6101626104d0565b60405161016f9190612c88565b60405180910390f35b610192600480360381019061018d9190612ce3565b61055c565b60405161019f9190612d4d565b60405180910390f35b6101c260048036038101906101bd9190612d90565b61058c565b6040516101cf9190612de8565b60405180910390f35b6101f260048036038101906101ed9190612ce3565b610873565b6040516101ff9190612e10565b60405180910390f35b6102106108ba565b60405161021d9190612e10565b60405180910390f35b610240600480360381019061023b9190612e29565b6108de565b005b61024a6110d5565b005b6102546111f4565b6040516102619190612e94565b60405180910390f35b610284600480360381019061027f9190612e29565b611218565b005b61028e611347565b60405161029b9190612e10565b60405180910390f35b6102be60048036038101906102b99190612ed7565b61134d565b005b6102da60048036038101906102d59190612ce3565b611429565b6040516102e79190612e10565b60405180910390f35b61030a60048036038101906103059190612ce3565b611470565b6040516103179190612d4d565b60405180910390f35b61033a60048036038101906103359190612f15565b61150e565b6040516103479190612e10565b60405180910390f35b610358611523565b6040516103659190612d4d565b60405180910390f35b610376611546565b6040516103839190612c88565b60405180910390f35b6103a660048036038101906103a19190612f15565b6115d2565b6040516103b39190612de8565b60405180910390f35b6103d660048036038101906103d19190612ed7565b6115ef565b005b6103f260048036038101906103ed9190612d90565b6116e7565b6040516103ff9190612de8565b60405180910390f35b610422600480360381019061041d9190612fa1565b6116fb565b005b61043e60048036038101906104399190612ce3565b611830565b60405161044b9190612c88565b60405180910390f35b61046e60048036038101906104699190613025565b611a95565b60405161047b9190612e10565b60405180910390f35b61049e60048036038101906104999190613025565b611ab5565b6040516104ab9190612de8565b60405180910390f35b6104ce60048036038101906104c99190612f15565b611adf565b005b600180546104dd90613090565b80601f016020809104026020016040519081016040528092919081815260200182805461050990613090565b80156105545780601f1061052b57610100808354040283529160200191610554565b820191905f5260205f20905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561059e57505f82115b15610786575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610695575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156106cc576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516107789190612e10565b60405180910390a350610869565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108609190612e10565b60405180910390a35b6001905092915050565b5f6108b36040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525083611c64565b9050919050565b7f000000000000000000000000000000000000000000000006f05b59d3b200000081565b6003548111610f965760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461097c576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e1576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610a9f575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b07575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610b3e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b46611ca5565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b9191906130ed565b92505081905550610ba0611ca5565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610cf691906130ed565b81548110610d0757610d06613120565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610d7357610d72613120565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610dcc57610dcb61314d565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610eb491906130ed565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610f7b611ca5565b604051610f889190612e10565b60405180910390a3506110d0565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110c257818161104591906130ed565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6110cd848484611cd8565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611159576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b6112238383836108de565b5f8273ffffffffffffffffffffffffffffffffffffffff163b1415801561130b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016112a9939291906131ad565b6020604051808303815f875af11580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e9919061324a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611342576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f6114696040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525083611c64565b9050919050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611509576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461155390613090565b80601f016020809104026020016040519081016040528092919081815260200182805461157f90613090565b80156115ca5780601f106115a1576101008083540402835291602001916115ca565b820191905f5260205f20905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116db9190612de8565b60405180910390a35050565b5f6116f3338484611cd8565b905092915050565b6117068585856108de565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156117f2575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016117909594939291906132af565b6020604051808303815f875af11580156117ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d0919061324a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611829576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b606061183a612bd7565b5f61184484611429565b90505f61185085610873565b9050604051806080016040528060418152602001613be460419139835f6005811061187e5761187d613120565b5b6020020181905250604051806060016040528060308152602001613bb460309139836001600581106118b3576118b2613120565b5b60200201819052506118c482612028565b6040516020016118d49190613415565b604051602081830303815290604052836002600581106118f7576118f6613120565b5b602002018190525061190881612028565b60405160200161191891906134b1565b6040516020818303038152906040528360036005811061193b5761193a613120565b5b602002018190525061194c856123fb565b60405160200161195c9190613655565b6040516020818303038152906040528360046005811061197f5761197e613120565b5b60200201819052505f835f6005811061199b5761199a613120565b5b6020020151846001600581106119b4576119b3613120565b5b6020020151856002600581106119cd576119cc613120565b5b6020020151866003600581106119e6576119e5613120565b5b6020020151876004600581106119ff576119fe613120565b5b6020020151604051602001611a18959493929190613681565b60405160208183030381529060405290505f611a64611a36886123fb565b611a3f84612554565b604051602001611a509291906137cf565b604051602081830303815290604052612554565b905080604051602001611a77919061385d565b60405160208183030381529060405291508195505050505050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b63576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc8576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f6110008383604051602001611c7b92919061389e565b604051602081830303815290604052805190602001205f1c611c9d91906138f2565b905092915050565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a611cd39190613a51565b905090565b5f80611ce2611ca5565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611db291906130ed565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611edc575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611e9b9190613a9b565b8484611ea79190613a9b565b611eb191906130ed565b90505f5b81811015611ed957611ec6896126e4565b8080611ed190613acb565b915050611eb5565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611fb5575f8382611f379190613a9b565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611f809190613a9b565b611f8a91906130ed565b90505f5b81811015611fb257611f9f88612929565b8080611faa90613acb565b915050611f8e565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516120129190612e10565b60405180910390a3600193505050509392505050565b60605f61203483612bab565b90505f61204084612bbb565b90505f61204c85612bcb565b90505f600767ffffffffffffffff81111561206a57612069613b12565b5b6040519080825280601f01601f19166020018201604052801561209c5781602001600182028036833780820191505090505b5090507f2300000000000000000000000000000000000000000000000000000000000000815f815181106120d3576120d2613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008461ffff166010811061213857612137613120565b5b1a60f81b816001815181106121505761214f613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008461ffff16601081106121b5576121b4613120565b5b1a60f81b816002815181106121cd576121cc613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008361ffff166010811061223257612231613120565b5b1a60f81b8160038151811061224a57612249613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008361ffff16601081106122af576122ae613120565b5b1a60f81b816004815181106122c7576122c6613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008261ffff166010811061232c5761232b613120565b5b1a60f81b8160058151811061234457612343613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f30313233343536373839616263646566000000000000000000000000000000008261ffff16601081106123a9576123a8613120565b5b1a60f81b816006815181106123c1576123c0613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080945050505050919050565b60605f8203612441576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061254f565b5f8290505f5b5f821461247057808061245990613acb565b915050600a826124699190613a9b565b9150612447565b5f8167ffffffffffffffff81111561248b5761248a613b12565b5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b5f8514612548576001826124d591906130ed565b9150600a856124e491906138f2565b60306124f09190613b3f565b60f81b81838151811061250657612505613120565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125419190613a9b565b94506124c1565b8093505050505b919050565b60605f825190505f81036125795760405180602001604052805f8152509150506126df565b5f60036002836125899190613b3f565b6125939190613a9b565b600461259f9190613b72565b90505f6020826125af9190613b3f565b67ffffffffffffffff8111156125c8576125c7613b12565b5b6040519080825280601f01601f1916602001820160405280156125fa5781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001613c2560409139905060018101602083015f5b8681101561269c5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612623565b5060038606600181146126b657600281146126c6576126d1565b613d3d60f01b60028303526126d1565b603d60f81b60018303525b508484525050819450505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612749576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506127d491906130ed565b815481106127e5576127e4613120565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061283d5761283c61314d565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361298e576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a3a576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050612b3791906130ed565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f600f600883901c169050919050565b5f600f600483901c169050919050565b5f600f82169050919050565b6040518060a001604052806005905b6060815260200190600190039081612be65790505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c35578082015181840152602081019050612c1a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612c5a82612bfe565b612c648185612c08565b9350612c74818560208601612c18565b612c7d81612c40565b840191505092915050565b5f6020820190508181035f830152612ca08184612c50565b905092915050565b5f80fd5b5f80fd5b5f819050919050565b612cc281612cb0565b8114612ccc575f80fd5b50565b5f81359050612cdd81612cb9565b92915050565b5f60208284031215612cf857612cf7612ca8565b5b5f612d0584828501612ccf565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d3782612d0e565b9050919050565b612d4781612d2d565b82525050565b5f602082019050612d605f830184612d3e565b92915050565b612d6f81612d2d565b8114612d79575f80fd5b50565b5f81359050612d8a81612d66565b92915050565b5f8060408385031215612da657612da5612ca8565b5b5f612db385828601612d7c565b9250506020612dc485828601612ccf565b9150509250929050565b5f8115159050919050565b612de281612dce565b82525050565b5f602082019050612dfb5f830184612dd9565b92915050565b612e0a81612cb0565b82525050565b5f602082019050612e235f830184612e01565b92915050565b5f805f60608486031215612e4057612e3f612ca8565b5b5f612e4d86828701612d7c565b9350506020612e5e86828701612d7c565b9250506040612e6f86828701612ccf565b9150509250925092565b5f60ff82169050919050565b612e8e81612e79565b82525050565b5f602082019050612ea75f830184612e85565b92915050565b612eb681612dce565b8114612ec0575f80fd5b50565b5f81359050612ed181612ead565b92915050565b5f8060408385031215612eed57612eec612ca8565b5b5f612efa85828601612d7c565b9250506020612f0b85828601612ec3565b9150509250929050565b5f60208284031215612f2a57612f29612ca8565b5b5f612f3784828501612d7c565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612f6157612f60612f40565b5b8235905067ffffffffffffffff811115612f7e57612f7d612f44565b5b602083019150836001820283011115612f9a57612f99612f48565b5b9250929050565b5f805f805f60808688031215612fba57612fb9612ca8565b5b5f612fc788828901612d7c565b9550506020612fd888828901612d7c565b9450506040612fe988828901612ccf565b935050606086013567ffffffffffffffff81111561300a57613009612cac565b5b61301688828901612f4c565b92509250509295509295909350565b5f806040838503121561303b5761303a612ca8565b5b5f61304885828601612d7c565b925050602061305985828601612d7c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806130a757607f821691505b6020821081036130ba576130b9613063565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6130f782612cb0565b915061310283612cb0565b925082820390508181111561311a576131196130c0565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6131985f8361317a565b91506131a38261318a565b5f82019050919050565b5f6080820190506131c05f830186612d3e565b6131cd6020830185612d3e565b6131da6040830184612e01565b81810360608301526131eb8161318d565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613229816131f5565b8114613233575f80fd5b50565b5f8151905061324481613220565b92915050565b5f6020828403121561325f5761325e612ca8565b5b5f61326c84828501613236565b91505092915050565b828183375f83830152505050565b5f61328e838561317a565b935061329b838584613275565b6132a483612c40565b840190509392505050565b5f6080820190506132c25f830188612d3e565b6132cf6020830187612d3e565b6132dc6040830186612e01565b81810360608301526132ef818486613283565b90509695505050505050565b5f81905092915050565b7f3c726563742077696474683d2235302522206865696768743d223235307078225f8201527f2066696c6c3d2200000000000000000000000000000000000000000000000000602082015250565b5f61335f6027836132fb565b915061336a82613305565b602782019050919050565b5f61337f82612bfe565b61338981856132fb565b9350613399818560208601612c18565b80840191505092915050565b7f22207472616e73666f726d3d227472616e736c61746528302c203235302e30305f8201527f303030302922202f3e0000000000000000000000000000000000000000000000602082015250565b5f6133ff6029836132fb565b915061340a826133a5565b602982019050919050565b5f61341f82613353565b915061342b8284613375565b9150613436826133f3565b915081905092915050565b7f22207472616e73666f726d3d227472616e736c617465283235302c203235302e5f8201527f3030303030302922202f3e000000000000000000000000000000000000000000602082015250565b5f61349b602b836132fb565b91506134a682613441565b602b82019050919050565b5f6134bb82613353565b91506134c78284613375565b91506134d28261348f565b915081905092915050565b7f3c7465787420786d6c6e733d22687474703a2f2f7777772e77332e6f72672f325f8201527f3030302f73766722207472616e73666f726d3d227472616e736c61746528323360208201527f2e3030303030302c33332e30303030303029222066696c6c3d2223666666222060408201527f666f6e742d66616d696c793d22436f7572696572204e65772c436f757269657260608201527f2c4c75636964612053616e7320547970657772697465722c4c7563696461205460808201527f7970657772697465722c6d6f6e6f73706163652220666f6e742d73697a653d2260a08201527f313070782220666f6e742d7765696768743d22626f6c64223e0000000000000060c082015250565b5f6135f560d9836132fb565b9150613600826134dd565b60d982019050919050565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000005f82015250565b5f61363f600d836132fb565b915061364a8261360b565b600d82019050919050565b5f61365f826135e9565b915061366b8284613375565b915061367682613633565b915081905092915050565b5f61368c8288613375565b91506136988287613375565b91506136a48286613375565b91506136b08285613375565b91506136bc8284613375565b91508190509695505050505050565b7f7b226e616d65223a2022587978797820230000000000000000000000000000005f82015250565b5f6136ff6011836132fb565b915061370a826136cb565b601182019050919050565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a20225f8201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015250565b5f61376f603a836132fb565b915061377a82613715565b603a82019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6137b96002836132fb565b91506137c482613785565b600282019050919050565b5f6137d9826136f3565b91506137e58285613375565b91506137f082613763565b91506137fc8284613375565b9150613807826137ad565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f613847601d836132fb565b915061385282613813565b601d82019050919050565b5f6138678261383b565b91506138738284613375565b915081905092915050565b5f819050919050565b61389861389382612cb0565b61387e565b82525050565b5f6138a98285613375565b91506138b58284613887565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138fc82612cb0565b915061390783612cb0565b925082613917576139166138c5565b5b828206905092915050565b5f8160011c9050919050565b5f808291508390505b600185111561397757808604811115613953576139526130c0565b5b60018516156139625780820291505b808102905061397085613922565b9450613937565b94509492505050565b5f8261398f5760019050613a4a565b8161399c575f9050613a4a565b81600181146139b257600281146139bc576139eb565b6001915050613a4a565b60ff8411156139ce576139cd6130c0565b5b8360020a9150848211156139e5576139e46130c0565b5b50613a4a565b5060208310610133831016604e8410600b8410161715613a205782820a905083811115613a1b57613a1a6130c0565b5b613a4a565b613a2d848484600161392e565b92509050818404811115613a4457613a436130c0565b5b81810290505b9392505050565b5f613a5b82612cb0565b9150613a6683612e79565b9250613a937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613980565b905092915050565b5f613aa582612cb0565b9150613ab083612cb0565b925082613ac057613abf6138c5565b5b828204905092915050565b5f613ad582612cb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0757613b066130c0565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f613b4982612cb0565b9150613b5483612cb0565b9250828201905080821115613b6c57613b6b6130c0565b5b92915050565b5f613b7c82612cb0565b9150613b8783612cb0565b9250828202613b9581612cb0565b91508282048414831517613bac57613bab6130c0565b5b509291505056fe3c726563742077696474683d223130302522206865696768743d223235307078222066696c6c3d222330303022202f3e3c7376672077696474683d2235303022206865696768743d223530302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200e81590a68d2c0427e7a1f89aa44c3f4e1a2061065293e243ebb647f81b660a664736f6c63430008140033

Deployed Bytecode Sourcemap

33791:4649:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24890:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25601:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27432:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35536:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25126:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28481:1716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22850:151;;;:::i;:::-;;25026:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30493:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25261:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26761:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35416:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25367:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22291:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24944;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26212:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28125:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30256:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30993:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35658:2046;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25481:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25712:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22623:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24890:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25601:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;27432:642::-;27535:4;27570:6;;27556:10;:20;;:38;;;;;27593:1;27580:10;:14;27556:38;27552:491;;;27611:13;27627:8;:20;27636:10;27627:20;;;;;;;;;;;;;;;;;;;;;27611:36;;27682:5;27668:19;;:10;:19;;;;:59;;;;;27692:16;:23;27709:5;27692:23;;;;;;;;;;;;;;;:35;27716:10;27692:35;;;;;;;;;;;;;;;;;;;;;;;;;27691:36;27668:59;27664:121;;;27755:14;;;;;;;;;;;;;;27664:121;27827:7;27801:11;:23;27813:10;27801:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;27872:7;27856:36;;27865:5;27856:36;;;27881:10;27856:36;;;;;;:::i;:::-;;;;;;;;27596:308;27552:491;;;27958:10;27925:9;:21;27935:10;27925:21;;;;;;;;;;;;;;;:30;27947:7;27925:30;;;;;;;;;;;;;;;:43;;;;28011:7;27990:41;;27999:10;27990:41;;;28020:10;27990:41;;;;;;:::i;:::-;;;;;;;;27552:491;28062:4;28055:11;;27432:642;;;;:::o;35536:112::-;35593:7;35620:20;;;;;;;;;;;;;;;;;;35632:7;35620:6;:20::i;:::-;35613:27;;35536:112;;;:::o;25126:36::-;;;:::o;28481:1716::-;28627:6;;28613:10;:20;28609:1581;;28662:8;:20;28671:10;28662:20;;;;;;;;;;;;;;;;;;;;;28654:28;;:4;:28;;;28650:91;;28710:15;;;;;;;;;;;;;;28650:91;28775:1;28761:16;;:2;:16;;;28757:82;;28805:18;;;;;;;;;;;;;;28757:82;28891:4;28877:18;;:10;:18;;;;:74;;;;;28917:16;:22;28934:4;28917:22;;;;;;;;;;;;;;;:34;28940:10;28917:34;;;;;;;;;;;;;;;;;;;;;;;;;28916:35;28877:74;:132;;;;;28986:11;:23;28998:10;28986:23;;;;;;;;;;;;;;;;;;;;;28972:37;;:10;:37;;;;28877:132;28855:226;;;29051:14;;;;;;;;;;;;;;28855:226;29116:10;:8;:10::i;:::-;29097:9;:15;29107:4;29097:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;29189:10;:8;:10::i;:::-;29172:9;:13;29182:2;29172:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;29254:2;29231:8;:20;29240:10;29231:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;29278:11;:23;29290:10;29278:23;;;;;;;;;;;;29271:30;;;;;;;;;;;29359:17;29379:6;:12;29386:4;29379:12;;;;;;;;;;;;;;;29414:1;29392:6;:12;29399:4;29392:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;29379:37;;;;;;;;:::i;:::-;;;;;;;;;;29359:57;;29471:9;29431:6;:12;29438:4;29431:12;;;;;;;;;;;;;;;29444:11;:23;29456:10;29444:23;;;;;;;;;;;;29431:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;29515:6;:12;29522:4;29515:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29619:11;:23;29631:10;29619:23;;;;;;;;;;;;29594:11;:22;29606:9;29594:22;;;;;;;;;;;:48;;;;29696:6;:10;29703:2;29696:10;;;;;;;;;;;;;;;29712;29696:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29826:1;29806:6;:10;29813:2;29806:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;29780:11;:23;29792:10;29780:23;;;;;;;;;;;:47;;;;29868:10;29864:2;29849:30;;29858:4;29849:30;;;;;;;;;;;;29919:2;29899:35;;29913:4;29899:35;;;29923:10;:8;:10::i;:::-;29899:35;;;;;;:::i;:::-;;;;;;;;28635:1311;28609:1581;;;29967:15;29985:9;:15;29995:4;29985:15;;;;;;;;;;;;;;;:27;30001:10;29985:27;;;;;;;;;;;;;;;;29967:45;;30044:17;30033:7;:28;30029:101;;30120:10;30110:7;:20;;;;:::i;:::-;30080:9;:15;30090:4;30080:15;;;;;;;;;;;;;;;:27;30096:10;30080:27;;;;;;;;;;;;;;;:50;;;;30029:101;30147:31;30157:4;30163:2;30167:10;30147:9;:31::i;:::-;;29952:238;28609:1581;28481:1716;;;:::o;22850:151::-;22378:5;;;;;;;;;;22364:19;;:10;:19;;;22360:46;;22392:14;;;;;;;;;;;;;;22360:46;22929:1:::1;22913:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;22990:1;22949:44;;22970:10;22949:44;;;;;;;;;;;;22850:151::o:0;25026:31::-;;;:::o;30493:405::-;30617:26;30630:4;30636:2;30640;30617:12;:26::i;:::-;30692:1;30674:2;:14;;;:19;;:154;;;;;30788:40;;;30710:118;;;30725:2;30710:35;;;30746:10;30758:4;30764:2;30710:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;30674:154;30656:235;;;30862:17;;;;;;;;;;;;;;30656:235;30493:405;;;:::o;25261:21::-;;;;:::o;26761:111::-;22378:5;;;;;;;;;;22364:19;;:10;:19;;;22360:46;;22392:14;;;;;;;;;;;;;;22360:46;26859:5:::1;26839:9;:17;26849:6;26839:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;26761:111:::0;;:::o;35416:112::-;35473:7;35500:20;;;;;;;;;;;;;;;;;;35512:7;35500:6;:20::i;:::-;35493:27;;35416:112;;;:::o;26944:193::-;27002:13;27036:8;:12;27045:2;27036:12;;;;;;;;;;;;;;;;;;;;;27028:20;;27082:1;27065:19;;:5;:19;;;27061:69;;27108:10;;;;;;;;;;;;;;27061:69;26944:193;;;:::o;25367:44::-;;;;;;;;;;;;;;;;;:::o;22291:20::-;;;;;;;;;;;;:::o;24944:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26212:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;28125:207::-;28252:8;28211:16;:28;28228:10;28211:28;;;;;;;;;;;;;;;:38;28240:8;28211:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;28305:8;28278:46;;28293:10;28278:46;;;28315:8;28278:46;;;;;;:::i;:::-;;;;;;;;28125:207;;:::o;30256:160::-;30351:4;30375:33;30385:10;30397:2;30401:6;30375:9;:33::i;:::-;30368:40;;30256:160;;;;:::o;30993:437::-;31147:26;31160:4;31166:2;31170;31147:12;:26::i;:::-;31222:1;31204:2;:14;;;:19;;:156;;;;;31320:40;;;31240:120;;;31255:2;31240:35;;;31276:10;31288:4;31294:2;31298:4;;31240:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;31204:156;31186:237;;;31394:17;;;;;;;;;;;;;;31186:237;30993:437;;;;;:::o;35658:2046::-;35723:13;35749:22;;:::i;:::-;35782:14;35799:18;35809:7;35799:9;:18::i;:::-;35782:35;;35828:14;35845:18;35855:7;35845:9;:18::i;:::-;35828:35;;35874:102;;;;;;;;;;;;;;;;;:5;35894:1;35874:32;;;;;;;:::i;:::-;;;;;:102;;;;35989:61;;;;;;;;;;;;;;;;;:5;35995:1;35989:8;;;;;;;:::i;:::-;;;;;:61;;;;36202:23;36218:6;36202:15;:23::i;:::-;36099:211;;;;;;;;:::i;:::-;;;;;;;;;;;;;36063:5;36069:1;36063:8;;;;;;;:::i;:::-;;;;;:262;;;;36477:23;36493:6;36477:15;:23::i;:::-;36374:213;;;;;;;;:::i;:::-;;;;;;;;;;;;;36338:5;36344:1;36338:8;;;;;;;:::i;:::-;;;;;:264;;;;36906:17;36915:7;36906:8;:17::i;:::-;36633:339;;;;;;;;:::i;:::-;;;;;;;;;;;;;36615:5;36621:1;36615:8;;;;;;;:::i;:::-;;;;;:368;;;;36996:20;37057:5;37063:1;37057:8;;;;;;;:::i;:::-;;;;;;37067:5;37073:1;37067:8;;;;;;;:::i;:::-;;;;;;37077:5;37083:1;37077:8;;;;;;;:::i;:::-;;;;;;37087:5;37093:1;37087:8;;;;;;;:::i;:::-;;;;;;37097:5;37103:1;37097:8;;;;;;;:::i;:::-;;;;;;37040:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36996:121;;37132:18;37153:428;37323:17;37332:7;37323:8;:17::i;:::-;37454:28;37474:6;37454:13;:28::i;:::-;37234:302;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37153:13;:428::i;:::-;37132:449;;37658:4;37608:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;37592:72;;37688:6;37681:13;;;;;;;35658:2046;;;:::o;25481:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25712:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22623:219::-;22378:5;;;;;;;;;;22364:19;;:10;:19;;;22360:46;;22392:14;;;;;;;;;;;;;;22360:46;22724:1:::1;22706:20;;:6;:20;;::::0;22702:47:::1;;22735:14;;;;;;;;;;;;;;22702:47;22770:6;22762:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;22827:6;22794:40;;22815:10;22794:40;;;;;;;;;;;;22623:219:::0;:::o;35204:204::-;35308:7;35396:4;35375:6;35383:7;35358:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35348:44;;;;;;35340:53;;:60;;;;:::i;:::-;35333:67;;35204:204;;;;:::o;32630:92::-;32673:7;32706:8;32700:2;:14;;;;:::i;:::-;32693:21;;32630:92;:::o;31498:1093::-;31611:4;31628:12;31643:10;:8;:10::i;:::-;31628:25;;31664:27;31694:9;:15;31704:4;31694:15;;;;;;;;;;;;;;;;31664:45;;31720:29;31752:9;:13;31762:2;31752:13;;;;;;;;;;;;;;;;31720:45;;31797:6;31778:9;:15;31788:4;31778:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;31858:6;31841:9;:13;31851:2;31841:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;31949:9;:15;31959:4;31949:15;;;;;;;;;;;;;;;;;;;;;;;;;31944:251;;31981:22;32073:4;32055:9;:15;32065:4;32055:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;32029:4;32007:19;:26;;;;:::i;:::-;32006:72;;;;:::i;:::-;31981:97;;32098:9;32093:91;32117:14;32113:1;:18;32093:91;;;32157:11;32163:4;32157:5;:11::i;:::-;32133:3;;;;;:::i;:::-;;;;32093:91;;;;31966:229;31944:251;32271:9;:13;32281:2;32271:13;;;;;;;;;;;;;;;;;;;;;;;;;32266:247;;32301:22;32393:4;32369:21;:28;;;;:::i;:::-;32343:4;32327:9;:13;32337:2;32327:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;32326:72;;;;:::i;:::-;32301:97;;32418:9;32413:89;32437:14;32433:1;:18;32413:89;;;32477:9;32483:2;32477:5;:9::i;:::-;32453:3;;;;;:::i;:::-;;;;32413:89;;;;32286:227;32266:247;32550:2;32530:31;;32544:4;32530:31;;;32554:6;32530:31;;;;;;:::i;:::-;;;;;;;;32579:4;32572:11;;;;;31498:1093;;;;;:::o;34564:632::-;34654:13;34685:10;34698:27;34719:5;34698:20;:27::i;:::-;34685:40;;34736:12;34751:29;34774:5;34751:22;:29::i;:::-;34736:44;;34791:11;34805:28;34827:5;34805:21;:28::i;:::-;34791:42;;34846:19;34878:1;34868:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34846:34;;34893:15;:6;34900:1;34893:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;34931:12;34944:3;34931:17;;;;;;;;;:::i;:::-;;;;;34919:6;34926:1;34919:9;;;;;;;;:::i;:::-;;;;;:29;;;;;;;;;;;34971:12;34984:3;34971:17;;;;;;;;;:::i;:::-;;;;;34959:6;34966:1;34959:9;;;;;;;;:::i;:::-;;;;;:29;;;;;;;;;;;35011:12;35024:5;35011:19;;;;;;;;;:::i;:::-;;;;;34999:6;35006:1;34999:9;;;;;;;;:::i;:::-;;;;;:31;;;;;;;;;;;35053:12;35066:5;35053:19;;;;;;;;;:::i;:::-;;;;;35041:6;35048:1;35041:9;;;;;;;;:::i;:::-;;;;;:31;;;;;;;;;;;35095:12;35108:4;35095:18;;;;;;;;;:::i;:::-;;;;;35083:6;35090:1;35083:9;;;;;;;;:::i;:::-;;;;;:30;;;;;;;;;;;35136:12;35149:4;35136:18;;;;;;;;;:::i;:::-;;;;;35124:6;35131:1;35124:9;;;;;;;;:::i;:::-;;;;;:30;;;;;;;;;;;35181:6;35167:21;;;;;;34564:632;;;:::o;37716:715::-;37772:13;37994:1;37985:5;:10;37981:53;;38012:10;;;;;;;;;;;;;;;;;;;;;37981:53;38044:12;38059:5;38044:20;;38075:14;38100:78;38115:1;38107:4;:9;38100:78;;38133:8;;;;;:::i;:::-;;;;38164:2;38156:10;;;;;:::i;:::-;;;38100:78;;;38188:19;38220:6;38210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38188:39;;38238:154;38254:1;38245:5;:10;38238:154;;38282:1;38272:11;;;;;:::i;:::-;;;38349:2;38341:5;:10;;;;:::i;:::-;38328:2;:24;;;;:::i;:::-;38315:39;;38298:6;38305;38298:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;38378:2;38369:11;;;;;:::i;:::-;;;38238:154;;;38416:6;38402:21;;;;;37716:715;;;;:::o;374:1607::-;432:13;458:11;472:4;:11;458:25;;505:1;498:3;:8;494:23;;508:9;;;;;;;;;;;;;;;;;494:23;569:18;607:1;602;596:3;:7;;;;:::i;:::-;595:13;;;;:::i;:::-;590:1;:19;;;;:::i;:::-;569:40;;667:19;712:2;699:10;:15;;;;:::i;:::-;689:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;667:48;;728:18;749:5;;;;;;;;;;;;;;;;;728:26;;818:1;811:5;807:13;863:2;855:6;851:15;914:1;882:777;937:3;934:1;931:10;882:777;;;992:1;989;985:9;980:14;;1050:8;1045:1;1039:4;1035:12;1029:19;1025:34;1130:4;1122:5;1118:2;1114:14;1110:25;1100:8;1096:40;1090:47;1169:3;1166:1;1162:11;1155:18;;1260:4;1251;1243:5;1239:2;1235:14;1231:25;1221:8;1217:40;1211:47;1207:58;1202:3;1198:68;1191:75;;1298:3;1295:1;1291:11;1284:18;;1388:4;1379;1371:5;1368:1;1364:13;1360:24;1350:8;1346:39;1340:46;1336:57;1331:3;1327:67;1320:74;;1426:3;1423:1;1419:11;1412:18;;1508:4;1499;1492:5;1488:16;1478:8;1474:31;1468:38;1464:49;1459:3;1455:59;1448:66;;1548:3;1543;1539:13;1532:20;;1590:3;1579:9;1572:22;1642:1;1631:9;1627:17;1614:30;;961:698;;882:777;;;886:44;1691:1;1686:3;1682:11;1712:1;1707:84;;;;1810:1;1805:82;;;;1675:212;;1707:84;1768:6;1763:3;1759:16;1755:1;1744:9;1740:17;1733:43;1707:84;;1805:82;1866:4;1861:3;1857:14;1853:1;1842:9;1838:17;1831:41;1675:212;;1918:10;1910:6;1903:26;776:1164;;1966:6;1952:21;;;;;;374:1607;;;;:::o;33212:373::-;33289:1;33273:18;;:4;:18;;;33269:73;;33315:15;;;;;;;;;;;;;;33269:73;33354:10;33367:6;:12;33374:4;33367:12;;;;;;;;;;;;;;;33402:1;33380:6;:12;33387:4;33380:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;33367:37;;;;;;;;:::i;:::-;;;;;;;;;;33354:50;;33415:6;:12;33422:4;33415:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33451:11;:15;33463:2;33451:15;;;;;;;;;;;33444:22;;;33484:8;:12;33493:2;33484:12;;;;;;;;;;;;33477:19;;;;;;;;;;;33514:11;:15;33526:2;33514:15;;;;;;;;;;;;33507:22;;;;;;;;;;;33574:2;33570:1;33547:30;;33556:4;33547:30;;;;;;;;;;;;33258:327;33212:373;:::o;32730:474::-;32803:1;32789:16;;:2;:16;;;32785:74;;32829:18;;;;;;;;;;;;;;32785:74;32896:6;;:8;;;;;;;;;;;;;32928:10;32941:6;;32928:19;;32988:1;32964:26;;:8;:12;32973:2;32964:12;;;;;;;;;;;;;;;;;;;;;:26;;;32960:81;;33014:15;;;;;;;;;;;;;;32960:81;33068:2;33053:8;:12;33062:2;33053:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;33081:6;:10;33088:2;33081:10;;;;;;;;;;;;;;;33097:2;33081:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33149:1;33129:6;:10;33136:2;33129:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;33111:11;:15;33123:2;33111:15;;;;;;;;;;;:39;;;;33193:2;33189;33168:28;;33185:1;33168:28;;;;;;;;;;;;32774:430;32730:474;:::o;33997:160::-;34092:6;34145:3;34140:1;34131:5;:10;;34130:18;34116:33;;33997:160;;;:::o;34165:162::-;34262:6;34315:3;34310:1;34301:5;:10;;34300:18;34286:33;;34165:162;;;:::o;34335:154::-;34431:6;34477:3;34469:5;:11;34455:26;;34335:154;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:619::-;4562:6;4570;4578;4627:2;4615:9;4606:7;4602:23;4598:32;4595:119;;;4633:79;;:::i;:::-;4595:119;4753:1;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4724:117;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;4485:619;;;;;:::o;5110:86::-;5145:7;5185:4;5178:5;5174:16;5163:27;;5110:86;;;:::o;5202:112::-;5285:22;5301:5;5285:22;:::i;:::-;5280:3;5273:35;5202:112;;:::o;5320:214::-;5409:4;5447:2;5436:9;5432:18;5424:26;;5460:67;5524:1;5513:9;5509:17;5500:6;5460:67;:::i;:::-;5320:214;;;;:::o;5540:116::-;5610:21;5625:5;5610:21;:::i;:::-;5603:5;5600:32;5590:60;;5646:1;5643;5636:12;5590:60;5540:116;:::o;5662:133::-;5705:5;5743:6;5730:20;5721:29;;5759:30;5783:5;5759:30;:::i;:::-;5662:133;;;;:::o;5801:468::-;5866:6;5874;5923:2;5911:9;5902:7;5898:23;5894:32;5891:119;;;5929:79;;:::i;:::-;5891:119;6049:1;6074:53;6119:7;6110:6;6099:9;6095:22;6074:53;:::i;:::-;6064:63;;6020:117;6176:2;6202:50;6244:7;6235:6;6224:9;6220:22;6202:50;:::i;:::-;6192:60;;6147:115;5801:468;;;;;:::o;6275:329::-;6334:6;6383:2;6371:9;6362:7;6358:23;6354:32;6351:119;;;6389:79;;:::i;:::-;6351:119;6509:1;6534:53;6579:7;6570:6;6559:9;6555:22;6534:53;:::i;:::-;6524:63;;6480:117;6275:329;;;;:::o;6610:117::-;6719:1;6716;6709:12;6733:117;6842:1;6839;6832:12;6856:117;6965:1;6962;6955:12;6992:552;7049:8;7059:6;7109:3;7102:4;7094:6;7090:17;7086:27;7076:122;;7117:79;;:::i;:::-;7076:122;7230:6;7217:20;7207:30;;7260:18;7252:6;7249:30;7246:117;;;7282:79;;:::i;:::-;7246:117;7396:4;7388:6;7384:17;7372:29;;7450:3;7442:4;7434:6;7430:17;7420:8;7416:32;7413:41;7410:128;;;7457:79;;:::i;:::-;7410:128;6992:552;;;;;:::o;7550:963::-;7647:6;7655;7663;7671;7679;7728:3;7716:9;7707:7;7703:23;7699:33;7696:120;;;7735:79;;:::i;:::-;7696:120;7855:1;7880:53;7925:7;7916:6;7905:9;7901:22;7880:53;:::i;:::-;7870:63;;7826:117;7982:2;8008:53;8053:7;8044:6;8033:9;8029:22;8008:53;:::i;:::-;7998:63;;7953:118;8110:2;8136:53;8181:7;8172:6;8161:9;8157:22;8136:53;:::i;:::-;8126:63;;8081:118;8266:2;8255:9;8251:18;8238:32;8297:18;8289:6;8286:30;8283:117;;;8319:79;;:::i;:::-;8283:117;8432:64;8488:7;8479:6;8468:9;8464:22;8432:64;:::i;:::-;8414:82;;;;8209:297;7550:963;;;;;;;;:::o;8519:474::-;8587:6;8595;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8897:2;8923:53;8968:7;8959:6;8948:9;8944:22;8923:53;:::i;:::-;8913:63;;8868:118;8519:474;;;;;:::o;8999:180::-;9047:77;9044:1;9037:88;9144:4;9141:1;9134:15;9168:4;9165:1;9158:15;9185:320;9229:6;9266:1;9260:4;9256:12;9246:22;;9313:1;9307:4;9303:12;9334:18;9324:81;;9390:4;9382:6;9378:17;9368:27;;9324:81;9452:2;9444:6;9441:14;9421:18;9418:38;9415:84;;9471:18;;:::i;:::-;9415:84;9236:269;9185:320;;;:::o;9511:180::-;9559:77;9556:1;9549:88;9656:4;9653:1;9646:15;9680:4;9677:1;9670:15;9697:194;9737:4;9757:20;9775:1;9757:20;:::i;:::-;9752:25;;9791:20;9809:1;9791:20;:::i;:::-;9786:25;;9835:1;9832;9828:9;9820:17;;9859:1;9853:4;9850:11;9847:37;;;9864:18;;:::i;:::-;9847:37;9697:194;;;;:::o;9897:180::-;9945:77;9942:1;9935:88;10042:4;10039:1;10032:15;10066:4;10063:1;10056:15;10083:180;10131:77;10128:1;10121:88;10228:4;10225:1;10218:15;10252:4;10249:1;10242:15;10269:168;10352:11;10386:6;10381:3;10374:19;10426:4;10421:3;10417:14;10402:29;;10269:168;;;;:::o;10443:114::-;;:::o;10563:362::-;10704:3;10725:65;10788:1;10783:3;10725:65;:::i;:::-;10718:72;;10799:93;10888:3;10799:93;:::i;:::-;10917:1;10912:3;10908:11;10901:18;;10563:362;;;:::o;10931:748::-;11180:4;11218:3;11207:9;11203:19;11195:27;;11232:71;11300:1;11289:9;11285:17;11276:6;11232:71;:::i;:::-;11313:72;11381:2;11370:9;11366:18;11357:6;11313:72;:::i;:::-;11395;11463:2;11452:9;11448:18;11439:6;11395:72;:::i;:::-;11514:9;11508:4;11504:20;11499:2;11488:9;11484:18;11477:48;11542:130;11667:4;11542:130;:::i;:::-;11534:138;;10931:748;;;;;;:::o;11685:149::-;11721:7;11761:66;11754:5;11750:78;11739:89;;11685:149;;;:::o;11840:120::-;11912:23;11929:5;11912:23;:::i;:::-;11905:5;11902:34;11892:62;;11950:1;11947;11940:12;11892:62;11840:120;:::o;11966:141::-;12022:5;12053:6;12047:13;12038:22;;12069:32;12095:5;12069:32;:::i;:::-;11966:141;;;;:::o;12113:349::-;12182:6;12231:2;12219:9;12210:7;12206:23;12202:32;12199:119;;;12237:79;;:::i;:::-;12199:119;12357:1;12382:63;12437:7;12428:6;12417:9;12413:22;12382:63;:::i;:::-;12372:73;;12328:127;12113:349;;;;:::o;12468:146::-;12565:6;12560:3;12555;12542:30;12606:1;12597:6;12592:3;12588:16;12581:27;12468:146;;;:::o;12642:314::-;12738:3;12759:70;12822:6;12817:3;12759:70;:::i;:::-;12752:77;;12839:56;12888:6;12883:3;12876:5;12839:56;:::i;:::-;12920:29;12942:6;12920:29;:::i;:::-;12915:3;12911:39;12904:46;;12642:314;;;;;:::o;12962:660::-;13167:4;13205:3;13194:9;13190:19;13182:27;;13219:71;13287:1;13276:9;13272:17;13263:6;13219:71;:::i;:::-;13300:72;13368:2;13357:9;13353:18;13344:6;13300:72;:::i;:::-;13382;13450:2;13439:9;13435:18;13426:6;13382:72;:::i;:::-;13501:9;13495:4;13491:20;13486:2;13475:9;13471:18;13464:48;13529:86;13610:4;13601:6;13593;13529:86;:::i;:::-;13521:94;;12962:660;;;;;;;;:::o;13628:148::-;13730:11;13767:3;13752:18;;13628:148;;;;:::o;13782:315::-;13922:66;13918:1;13910:6;13906:14;13899:90;14023:66;14018:2;14010:6;14006:15;13999:91;13782:315;:::o;14103:402::-;14263:3;14284:85;14366:2;14361:3;14284:85;:::i;:::-;14277:92;;14378:93;14467:3;14378:93;:::i;:::-;14496:2;14491:3;14487:12;14480:19;;14103:402;;;:::o;14511:390::-;14617:3;14645:39;14678:5;14645:39;:::i;:::-;14700:89;14782:6;14777:3;14700:89;:::i;:::-;14693:96;;14798:65;14856:6;14851:3;14844:4;14837:5;14833:16;14798:65;:::i;:::-;14888:6;14883:3;14879:16;14872:23;;14621:280;14511:390;;;;:::o;14907:315::-;15047:66;15043:1;15035:6;15031:14;15024:90;15148:66;15143:2;15135:6;15131:15;15124:91;14907:315;:::o;15228:402::-;15388:3;15409:85;15491:2;15486:3;15409:85;:::i;:::-;15402:92;;15503:93;15592:3;15503:93;:::i;:::-;15621:2;15616:3;15612:12;15605:19;;15228:402;;;:::o;15636:807::-;15970:3;15992:148;16136:3;15992:148;:::i;:::-;15985:155;;16157:95;16248:3;16239:6;16157:95;:::i;:::-;16150:102;;16269:148;16413:3;16269:148;:::i;:::-;16262:155;;16434:3;16427:10;;15636:807;;;;:::o;16449:315::-;16589:66;16585:1;16577:6;16573:14;16566:90;16690:66;16685:2;16677:6;16673:15;16666:91;16449:315;:::o;16770:402::-;16930:3;16951:85;17033:2;17028:3;16951:85;:::i;:::-;16944:92;;17045:93;17134:3;17045:93;:::i;:::-;17163:2;17158:3;17154:12;17147:19;;16770:402;;;:::o;17178:807::-;17512:3;17534:148;17678:3;17534:148;:::i;:::-;17527:155;;17699:95;17790:3;17781:6;17699:95;:::i;:::-;17692:102;;17811:148;17955:3;17811:148;:::i;:::-;17804:155;;17976:3;17969:10;;17178:807;;;;:::o;17991:791::-;18131:66;18127:1;18119:6;18115:14;18108:90;18232:66;18227:2;18219:6;18215:15;18208:91;18333:66;18328:2;18320:6;18316:15;18309:91;18434:66;18429:2;18421:6;18417:15;18410:91;18536:34;18530:3;18522:6;18518:16;18511:60;18606:66;18600:3;18592:6;18588:16;18581:92;18708:66;18702:3;18694:6;18690:16;18683:92;17991:791;:::o;18788:404::-;18948:3;18969:86;19051:3;19046;18969:86;:::i;:::-;18962:93;;19064;19153:3;19064:93;:::i;:::-;19182:3;19177;19173:13;19166:20;;18788:404;;;:::o;19198:163::-;19338:15;19334:1;19326:6;19322:14;19315:39;19198:163;:::o;19367:402::-;19527:3;19548:85;19630:2;19625:3;19548:85;:::i;:::-;19541:92;;19642:93;19731:3;19642:93;:::i;:::-;19760:2;19755:3;19751:12;19744:19;;19367:402;;;:::o;19775:807::-;20109:3;20131:148;20275:3;20131:148;:::i;:::-;20124:155;;20296:95;20387:3;20378:6;20296:95;:::i;:::-;20289:102;;20408:148;20552:3;20408:148;:::i;:::-;20401:155;;20573:3;20566:10;;19775:807;;;;:::o;20588:915::-;20912:3;20934:95;21025:3;21016:6;20934:95;:::i;:::-;20927:102;;21046:95;21137:3;21128:6;21046:95;:::i;:::-;21039:102;;21158:95;21249:3;21240:6;21158:95;:::i;:::-;21151:102;;21270:95;21361:3;21352:6;21270:95;:::i;:::-;21263:102;;21382:95;21473:3;21464:6;21382:95;:::i;:::-;21375:102;;21494:3;21487:10;;20588:915;;;;;;;;:::o;21509:214::-;21649:66;21645:1;21637:6;21633:14;21626:90;21509:214;:::o;21729:402::-;21889:3;21910:85;21992:2;21987:3;21910:85;:::i;:::-;21903:92;;22004:93;22093:3;22004:93;:::i;:::-;22122:2;22117:3;22113:12;22106:19;;21729:402;;;:::o;22137:277::-;22277:66;22273:1;22265:6;22261:14;22254:90;22378:28;22373:2;22365:6;22361:15;22354:53;22137:277;:::o;22420:402::-;22580:3;22601:85;22683:2;22678:3;22601:85;:::i;:::-;22594:92;;22695:93;22784:3;22695:93;:::i;:::-;22813:2;22808:3;22804:12;22797:19;;22420:402;;;:::o;22828:214::-;22968:66;22964:1;22956:6;22952:14;22945:90;22828:214;:::o;23048:400::-;23208:3;23229:84;23311:1;23306:3;23229:84;:::i;:::-;23222:91;;23322:93;23411:3;23322:93;:::i;:::-;23440:1;23435:3;23431:11;23424:18;;23048:400;;;:::o;23454:1233::-;23937:3;23959:148;24103:3;23959:148;:::i;:::-;23952:155;;24124:95;24215:3;24206:6;24124:95;:::i;:::-;24117:102;;24236:148;24380:3;24236:148;:::i;:::-;24229:155;;24401:95;24492:3;24483:6;24401:95;:::i;:::-;24394:102;;24513:148;24657:3;24513:148;:::i;:::-;24506:155;;24678:3;24671:10;;23454:1233;;;;;:::o;24693:179::-;24833:31;24829:1;24821:6;24817:14;24810:55;24693:179;:::o;24878:402::-;25038:3;25059:85;25141:2;25136:3;25059:85;:::i;:::-;25052:92;;25153:93;25242:3;25153:93;:::i;:::-;25271:2;25266:3;25262:12;25255:19;;24878:402;;;:::o;25286:541::-;25519:3;25541:148;25685:3;25541:148;:::i;:::-;25534:155;;25706:95;25797:3;25788:6;25706:95;:::i;:::-;25699:102;;25818:3;25811:10;;25286:541;;;;:::o;25833:79::-;25872:7;25901:5;25890:16;;25833:79;;;:::o;25918:157::-;26023:45;26043:24;26061:5;26043:24;:::i;:::-;26023:45;:::i;:::-;26018:3;26011:58;25918:157;;:::o;26081:416::-;26241:3;26263:95;26354:3;26345:6;26263:95;:::i;:::-;26256:102;;26368:75;26439:3;26430:6;26368:75;:::i;:::-;26468:2;26463:3;26459:12;26452:19;;26488:3;26481:10;;26081:416;;;;;:::o;26503:180::-;26551:77;26548:1;26541:88;26648:4;26645:1;26638:15;26672:4;26669:1;26662:15;26689:176;26721:1;26738:20;26756:1;26738:20;:::i;:::-;26733:25;;26772:20;26790:1;26772:20;:::i;:::-;26767:25;;26811:1;26801:35;;26816:18;;:::i;:::-;26801:35;26857:1;26854;26850:9;26845:14;;26689:176;;;;:::o;26871:102::-;26913:8;26960:5;26957:1;26953:13;26932:34;;26871:102;;;:::o;26979:848::-;27040:5;27047:4;27071:6;27062:15;;27095:5;27086:14;;27109:712;27130:1;27120:8;27117:15;27109:712;;;27225:4;27220:3;27216:14;27210:4;27207:24;27204:50;;;27234:18;;:::i;:::-;27204:50;27284:1;27274:8;27270:16;27267:451;;;27699:4;27692:5;27688:16;27679:25;;27267:451;27749:4;27743;27739:15;27731:23;;27779:32;27802:8;27779:32;:::i;:::-;27767:44;;27109:712;;;26979:848;;;;;;;:::o;27833:1073::-;27887:5;28078:8;28068:40;;28099:1;28090:10;;28101:5;;28068:40;28127:4;28117:36;;28144:1;28135:10;;28146:5;;28117:36;28213:4;28261:1;28256:27;;;;28297:1;28292:191;;;;28206:277;;28256:27;28274:1;28265:10;;28276:5;;;28292:191;28337:3;28327:8;28324:17;28321:43;;;28344:18;;:::i;:::-;28321:43;28393:8;28390:1;28386:16;28377:25;;28428:3;28421:5;28418:14;28415:40;;;28435:18;;:::i;:::-;28415:40;28468:5;;;28206:277;;28592:2;28582:8;28579:16;28573:3;28567:4;28564:13;28560:36;28542:2;28532:8;28529:16;28524:2;28518:4;28515:12;28511:35;28495:111;28492:246;;;28648:8;28642:4;28638:19;28629:28;;28683:3;28676:5;28673:14;28670:40;;;28690:18;;:::i;:::-;28670:40;28723:5;;28492:246;28763:42;28801:3;28791:8;28785:4;28782:1;28763:42;:::i;:::-;28748:57;;;;28837:4;28832:3;28828:14;28821:5;28818:25;28815:51;;;28846:18;;:::i;:::-;28815:51;28895:4;28888:5;28884:16;28875:25;;27833:1073;;;;;;:::o;28912:281::-;28970:5;28994:23;29012:4;28994:23;:::i;:::-;28986:31;;29038:25;29054:8;29038:25;:::i;:::-;29026:37;;29082:104;29119:66;29109:8;29103:4;29082:104;:::i;:::-;29073:113;;28912:281;;;;:::o;29199:185::-;29239:1;29256:20;29274:1;29256:20;:::i;:::-;29251:25;;29290:20;29308:1;29290:20;:::i;:::-;29285:25;;29329:1;29319:35;;29334:18;;:::i;:::-;29319:35;29376:1;29373;29369:9;29364:14;;29199:185;;;;:::o;29390:233::-;29429:3;29452:24;29470:5;29452:24;:::i;:::-;29443:33;;29498:66;29491:5;29488:77;29485:103;;29568:18;;:::i;:::-;29485:103;29615:1;29608:5;29604:13;29597:20;;29390:233;;;:::o;29629:180::-;29677:77;29674:1;29667:88;29774:4;29771:1;29764:15;29798:4;29795:1;29788:15;29815:191;29855:3;29874:20;29892:1;29874:20;:::i;:::-;29869:25;;29908:20;29926:1;29908:20;:::i;:::-;29903:25;;29951:1;29948;29944:9;29937:16;;29972:3;29969:1;29966:10;29963:36;;;29979:18;;:::i;:::-;29963:36;29815:191;;;;:::o;30012:410::-;30052:7;30075:20;30093:1;30075:20;:::i;:::-;30070:25;;30109:20;30127:1;30109:20;:::i;:::-;30104:25;;30164:1;30161;30157:9;30186:30;30204:11;30186:30;:::i;:::-;30175:41;;30365:1;30356:7;30352:15;30349:1;30346:22;30326:1;30319:9;30299:83;30276:139;;30395:18;;:::i;:::-;30276:139;30060:362;30012:410;;;;:::o

Swarm Source

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