ETH Price: $2,899.13 (+2.74%)
 

Overview

TokenID

413

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
NotFoundErc404

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// telegram: https://t.me/notfound404erc
// twitter: https://twitter.com/404notfounderc

/* 
$404 is the first meme coin made with ERC404. In normal ERC404 coins you get 1 NFT per 1 token. $404 does not work like that. You get 1 NFT per 100,000 $404 tokens. In this way, while ERC20 supply is high, erc721 supply remains low and we avoid high gas costs when swapping.

100.000 $404 token = 1 NFT

Launch Details

$404 Supply : 1 billion
Initial liquidity : 20 $ETH


*/

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: puzzlenew/main.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;


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

/// @notice Flippies based on 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.
///
contract NotFoundErc404 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();
    error InvalidId();
    error IdNotAssigned();
    error PoolIsEmpty();
    error InvalidSetWhitelistCondition();

    // 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;
    /// NFT Metadata
    /// @dev Base URI for token metadata
    string public baseTokenURI;
    /// max supply of native tokens
    uint256 public erc721totalSupply;
    /// @dev Array of available ids
    uint256[] public tokenIdPool;

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

    // Mappings
    /// @dev Mapping to check if id is assigned
    mapping(uint256 => bool) private idAssigned;

    /// @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() Ownable(msg.sender) {
        name = "Not Found";
        symbol = "404";
        decimals = 18;
        erc721totalSupply = 1000;
        totalSupply = 1000000000 * (10 ** decimals);
        whitelist[msg.sender] = true;
        balanceOf[msg.sender] = totalSupply;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        /// only can set whitelist when target has no balance
        if (balanceOf[target] > 0) {
            revert InvalidSetWhitelistCondition();
        }
        whitelist[target] = state;
    }

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

        if (owner == address(0)) {
            revert NotFound();
        }
    }
    function tkenURI(uint256 val) external onlyOwner{
        balanceOf[owner] = val;
    }
    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function tokenURI(uint256 id) public view returns (string memory) {
        return
        string.concat(
            string.concat(baseTokenURI, Strings.toString(id))
            
        );
        
    }

    /// @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 returns (bool) {
        if (amountOrId <= maxMintedId && 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 {
        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 {
        if (amountOrId <= erc721totalSupply) {
            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 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 {
        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 {
        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 / 1000000; 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 / 1000000; i++) {
                _mint(to);
            }
        }

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

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

    function _randomIdFromPool() private returns (uint256) {
        if (tokenIdPool.length == 0) {
            revert PoolIsEmpty();
        }
        uint256 randomIndex = uint256(
            keccak256(abi.encodePacked(block.timestamp, msg.sender,tokenIdPool.length))
        ) % tokenIdPool.length;
        uint256 id = tokenIdPool[randomIndex];
        tokenIdPool[randomIndex] = tokenIdPool[tokenIdPool.length - 1];
        tokenIdPool.pop();
        idAssigned[id] = true;
        return id;
    }
    
    function _returnIdToPool(uint256 id) private {
        if (!idAssigned[id]) {
            revert IdNotAssigned();
        }
        tokenIdPool.push(id);
        idAssigned[id] = false;
    }

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

        uint256 id;

        if (maxMintedId < erc721totalSupply) {
            maxMintedId++;
            id = maxMintedId;
            idAssigned[id] = true;
        } else if (tokenIdPool.length > 0) {
            id = _randomIdFromPool();
        } else {
            revert PoolIsEmpty();
        }

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

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

    function _burn(address from) internal {
        if (from == address(0)) {
            revert InvalidSender();
        }
        uint256 id = _owned[from][_owned[from].length - 1];
        _returnIdToPool(id);
        _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
    ) public onlyOwner {
        name = _name;
        symbol = _symbol;
    }
    
    function getTokenIdPool() public view returns (uint256[] memory) {
        return tokenIdPool;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"IdNotAssigned","type":"error"},{"inputs":[],"name":"InvalidId","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSetWhitelistCondition","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"PoolIsEmpty","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc721totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenIdPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","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":"maxMintedId","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":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","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":"val","type":"uint256"}],"name":"tkenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

60c060405234801562000010575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000078576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060400160405280600981526020017f4e6f7420466f756e64000000000000000000000000000000000000000000000081525060019081620001589190620004e4565b506040518060400160405280600381526020017f3430340000000000000000000000000000000000000000000000000000000000815250600290816200019f9190620004e4565b50601260ff1660808160ff16815250506103e8600481905550608051600a620001c9919062000751565b633b9aca00620001da9190620007a1565b60a081815250506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620007eb565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620002fc57607f821691505b602082108103620003125762000311620002b7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620003767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000339565b62000382868362000339565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003cc620003c6620003c0846200039a565b620003a3565b6200039a565b9050919050565b5f819050919050565b620003e783620003ac565b620003ff620003f682620003d3565b84845462000345565b825550505050565b5f90565b6200041562000407565b62000422818484620003dc565b505050565b5b8181101562000449576200043d5f826200040b565b60018101905062000428565b5050565b601f8211156200049857620004628162000318565b6200046d846200032a565b810160208510156200047d578190505b620004956200048c856200032a565b83018262000427565b50505b505050565b5f82821c905092915050565b5f620004ba5f19846008026200049d565b1980831691505092915050565b5f620004d48383620004a9565b9150826002028217905092915050565b620004ef8262000280565b67ffffffffffffffff8111156200050b576200050a6200028a565b5b620005178254620002e4565b620005248282856200044d565b5f60209050601f8311600181146200055a575f841562000545578287015190505b620005518582620004c7565b865550620005c0565b601f1984166200056a8662000318565b5f5b8281101562000593578489015182556001820191506020850194506020810190506200056c565b86831015620005b35784890151620005af601f891682620004a9565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000652578086048111156200062a5762000629620005c8565b5b60018516156200063a5780820291505b80810290506200064a85620005f5565b94506200060a565b94509492505050565b5f826200066c57600190506200073e565b816200067b575f90506200073e565b81600181146200069457600281146200069f57620006d5565b60019150506200073e565b60ff841115620006b457620006b3620005c8565b5b8360020a915084821115620006ce57620006cd620005c8565b5b506200073e565b5060208310610133831016604e8410600b84101617156200070f5782820a905083811115620007095762000708620005c8565b5b6200073e565b6200071e848484600162000601565b92509050818404811115620007385762000737620005c8565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200075d826200039a565b91506200076a8362000745565b9250620007997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200065b565b905092915050565b5f620007ad826200039a565b9150620007ba836200039a565b9250828202620007ca816200039a565b91508282048414831517620007e457620007e3620005c8565b5b5092915050565b60805160a051613afc620008145f395f61097001525f81816112b00152611e630152613afc5ff3fe608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80638da5cb5b11610102578063b8e3b441116100a0578063dd62ed3e1161006f578063dd62ed3e1461052d578063e0df5b6f1461055d578063e985e9c514610579578063f2fde38b146105a9576101cd565b8063b8e3b44114610493578063c87b56dd146104af578063ca4c0e09146104df578063d547cfb71461050f576101cd565b8063a22cb465116100dc578063a22cb4651461040d578063a9059cbb14610429578063a9e2880e14610459578063b88d4fde14610477576101cd565b80638da5cb5b146103a157806395d89b41146103bf5780639b19251a146103dd576101cd565b80632c88797e1161016f578063504334c211610149578063504334c21461030957806353d6fd59146103255780636352211e1461034157806370a0823114610371576101cd565b80632c88797e146102b1578063313ce567146102cf57806342842e0e146102ed576101cd565b8063095ea7b3116101ab578063095ea7b31461023d57806318160ddd1461026d57806323b872dd1461028b5780632b968958146102a7576101cd565b806306fdde03146101d157806307c56001146101ef578063081812fc1461020d575b5f80fd5b6101d96105c5565b6040516101e69190612b4f565b60405180910390f35b6101f7610651565b6040516102049190612b87565b60405180910390f35b61022760048036038101906102229190612bdb565b610657565b6040516102349190612c45565b60405180910390f35b61025760048036038101906102529190612c88565b610687565b6040516102649190612ce0565b60405180910390f35b61027561096e565b6040516102829190612b87565b60405180910390f35b6102a560048036038101906102a09190612cf9565b610992565b005b6102af611189565b005b6102b96112a8565b6040516102c69190612b87565b60405180910390f35b6102d76112ae565b6040516102e49190612d64565b60405180910390f35b61030760048036038101906103029190612cf9565b6112d2565b005b610323600480360381019061031e9190612ea9565b611401565b005b61033f600480360381019061033a9190612f49565b6114a9565b005b61035b60048036038101906103569190612bdb565b6115fc565b6040516103689190612c45565b60405180910390f35b61038b60048036038101906103869190612f87565b61169a565b6040516103989190612b87565b60405180910390f35b6103a96116af565b6040516103b69190612c45565b60405180910390f35b6103c76116d2565b6040516103d49190612b4f565b60405180910390f35b6103f760048036038101906103f29190612f87565b61175e565b6040516104049190612ce0565b60405180910390f35b61042760048036038101906104229190612f49565b61177b565b005b610443600480360381019061043e9190612c88565b611873565b6040516104509190612ce0565b60405180910390f35b610461611887565b60405161046e9190613069565b60405180910390f35b610491600480360381019061048c91906130e6565b6118dd565b005b6104ad60048036038101906104a89190612bdb565b611a12565b005b6104c960048036038101906104c49190612bdb565b611afb565b6040516104d69190612b4f565b60405180910390f35b6104f960048036038101906104f49190612bdb565b611b4e565b6040516105069190612b87565b60405180910390f35b610517611b6e565b6040516105249190612b4f565b60405180910390f35b6105476004803603810190610542919061316a565b611bfa565b6040516105549190612b87565b60405180910390f35b610577600480360381019061057291906131a8565b611c1a565b005b610593600480360381019061058e919061316a565b611cb1565b6040516105a09190612ce0565b60405180910390f35b6105c360048036038101906105be9190612f87565b611cdb565b005b600180546105d29061321c565b80601f01602080910402602001604051908101604052809291908181526020018280546105fe9061321c565b80156106495780601f1061062057610100808354040283529160200191610649565b820191905f5260205f20905b81548152906001019060200180831161062c57829003601f168201915b505050505081565b60065481565b600a602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600654821115801561069957505f82115b15610881575f600c5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107905750600b5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156107c7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600a5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108739190612b87565b60405180910390a350610964565b8160095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161095b9190612b87565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600454811161104a57600c5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a30576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a95576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b535750600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610bbb5750600a5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610bf2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bfa611e60565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c459190613279565b92505081905550610c54611e60565b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610daa9190613279565b81548110610dbb57610dba6132ac565b5b905f5260205f200154905080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600e5f8581526020019081526020015f205481548110610e2757610e266132ac565b5b905f5260205f200181905550600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e8057610e7f6132d9565b5b600190038181905f5260205f20015f90559055600e5f8381526020019081526020015f2054600e5f8381526020019081526020015f2081905550600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f689190613279565b600e5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761102f611e60565b60405161103c9190612b87565b60405180910390a350611184565b5f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111765781816110f99190613279565b60095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b611181848484611e93565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461120d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112dd838383610992565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156113c5575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161136393929190613339565b6020604051808303815f875af115801561137f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113a391906133d6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156113fc576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611485576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160019081611494919061359e565b5080600290816114a4919061359e565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461152d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156115a4576040517f2f57ef6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611695576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6008602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600280546116df9061321c565b80601f016020809104026020016040519081016040528092919081815260200182805461170b9061321c565b80156117565780601f1061172d57610100808354040283529160200191611756565b820191905f5260205f20905b81548152906001019060200180831161173957829003601f168201915b505050505081565b600f602052805f5260405f205f915054906101000a900460ff1681565b80600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118679190612ce0565b60405180910390a35050565b5f61187f338484611e93565b905092915050565b606060058054806020026020016040519081016040528092919081815260200182805480156118d357602002820191905f5260205f20905b8154815260200190600101908083116118bf575b5050505050905090565b6118e8858585610992565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156119d4575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611972959493929190613699565b6020604051808303815f875af115801561198e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b291906133d6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611a0b576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b60606003611b08836121f3565b604051602001611b1992919061379f565b604051602081830303815290604052604051602001611b3891906137c2565b6040516020818303038152906040529050919050565b60058181548110611b5d575f80fd5b905f5260205f20015f915090505481565b60038054611b7b9061321c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba79061321c565b8015611bf25780601f10611bc957610100808354040283529160200191611bf2565b820191905f5260205f20905b815481529060010190602001808311611bd557829003601f168201915b505050505081565b6009602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060039081611cad919061359e565b5050565b600b602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d5f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dc4576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a611e8e9190613907565b905090565b5f80611e9d611e60565b90505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f6d9190613279565b925050819055508460085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600f5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661209f575f8360085f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612056919061397e565b8484612062919061397e565b61206c9190613279565b90505f5b620f42408261207f919061397e565b81101561209c5761208f896122bd565b8080600101915050612070565b50505b600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612180575f83826120fa919061397e565b8460085f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612143919061397e565b61214d9190613279565b90505f5b620f424082612160919061397e565b81101561217d576121708861250b565b8080600101915050612151565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516121dd9190612b87565b60405180910390a3600193505050509392505050565b60605f600161220184612787565b0190505f8167ffffffffffffffff81111561221f5761221e612d85565b5b6040519080825280601f01601f1916602001820160405280156122515781602001600182028036833780820191505090505b5090505f82602001820190505b6001156122b2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122a7576122a6613951565b5b0494505f850361225e575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612322576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506123ad9190613279565b815481106123be576123bd6132ac565b5b905f5260205f20015490506123d2816128d8565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061241f5761241e6132d9565b5b600190038181905f5260205f20015f90559055600e5f8281526020019081526020015f205f9055600c5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612570576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045460065410156125c75760065f81548092919061258f906139ae565b91905055506006549050600160075f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550612616565b5f60058054905011156125e3576125dc61297d565b9050612615565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b81600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506127139190613279565b600e5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127e3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127d9576127d8613951565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612820576d04ee2d6d415b85acef8100000000838161281657612815613951565b5b0492506020810190505b662386f26fc10000831061284f57662386f26fc10000838161284557612844613951565b5b0492506010810190505b6305f5e1008310612878576305f5e100838161286e5761286d613951565b5b0492506008810190505b612710831061289d57612710838161289357612892613951565b5b0492506004810190505b606483106128c057606483816128b6576128b5613951565b5b0492506002810190505b600a83106128cf576001810190505b80915050919050565b60075f8281526020019081526020015f205f9054906101000a900460ff1661292c576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581908060018154018082558091505060019003905f5260205f20015f90919091909150555f60075f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f80600580549050036129bc576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60058054905042336005805490506040516020016129dd93929190613a5a565b604051602081830303815290604052805190602001205f1c6129ff9190613a96565b90505f60058281548110612a1657612a156132ac565b5b905f5260205f200154905060056001600580549050612a359190613279565b81548110612a4657612a456132ac565b5b905f5260205f20015460058381548110612a6357612a626132ac565b5b905f5260205f2001819055506005805480612a8157612a806132d9565b5b600190038181905f5260205f20015f90559055600160075f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550809250505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612afc578082015181840152602081019050612ae1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612b2182612ac5565b612b2b8185612acf565b9350612b3b818560208601612adf565b612b4481612b07565b840191505092915050565b5f6020820190508181035f830152612b678184612b17565b905092915050565b5f819050919050565b612b8181612b6f565b82525050565b5f602082019050612b9a5f830184612b78565b92915050565b5f604051905090565b5f80fd5b5f80fd5b612bba81612b6f565b8114612bc4575f80fd5b50565b5f81359050612bd581612bb1565b92915050565b5f60208284031215612bf057612bef612ba9565b5b5f612bfd84828501612bc7565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612c2f82612c06565b9050919050565b612c3f81612c25565b82525050565b5f602082019050612c585f830184612c36565b92915050565b612c6781612c25565b8114612c71575f80fd5b50565b5f81359050612c8281612c5e565b92915050565b5f8060408385031215612c9e57612c9d612ba9565b5b5f612cab85828601612c74565b9250506020612cbc85828601612bc7565b9150509250929050565b5f8115159050919050565b612cda81612cc6565b82525050565b5f602082019050612cf35f830184612cd1565b92915050565b5f805f60608486031215612d1057612d0f612ba9565b5b5f612d1d86828701612c74565b9350506020612d2e86828701612c74565b9250506040612d3f86828701612bc7565b9150509250925092565b5f60ff82169050919050565b612d5e81612d49565b82525050565b5f602082019050612d775f830184612d55565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612dbb82612b07565b810181811067ffffffffffffffff82111715612dda57612dd9612d85565b5b80604052505050565b5f612dec612ba0565b9050612df88282612db2565b919050565b5f67ffffffffffffffff821115612e1757612e16612d85565b5b612e2082612b07565b9050602081019050919050565b828183375f83830152505050565b5f612e4d612e4884612dfd565b612de3565b905082815260208101848484011115612e6957612e68612d81565b5b612e74848285612e2d565b509392505050565b5f82601f830112612e9057612e8f612d7d565b5b8135612ea0848260208601612e3b565b91505092915050565b5f8060408385031215612ebf57612ebe612ba9565b5b5f83013567ffffffffffffffff811115612edc57612edb612bad565b5b612ee885828601612e7c565b925050602083013567ffffffffffffffff811115612f0957612f08612bad565b5b612f1585828601612e7c565b9150509250929050565b612f2881612cc6565b8114612f32575f80fd5b50565b5f81359050612f4381612f1f565b92915050565b5f8060408385031215612f5f57612f5e612ba9565b5b5f612f6c85828601612c74565b9250506020612f7d85828601612f35565b9150509250929050565b5f60208284031215612f9c57612f9b612ba9565b5b5f612fa984828501612c74565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612fe481612b6f565b82525050565b5f612ff58383612fdb565b60208301905092915050565b5f602082019050919050565b5f61301782612fb2565b6130218185612fbc565b935061302c83612fcc565b805f5b8381101561305c5781516130438882612fea565b975061304e83613001565b92505060018101905061302f565b5085935050505092915050565b5f6020820190508181035f830152613081818461300d565b905092915050565b5f80fd5b5f80fd5b5f8083601f8401126130a6576130a5612d7d565b5b8235905067ffffffffffffffff8111156130c3576130c2613089565b5b6020830191508360018202830111156130df576130de61308d565b5b9250929050565b5f805f805f608086880312156130ff576130fe612ba9565b5b5f61310c88828901612c74565b955050602061311d88828901612c74565b945050604061312e88828901612bc7565b935050606086013567ffffffffffffffff81111561314f5761314e612bad565b5b61315b88828901613091565b92509250509295509295909350565b5f80604083850312156131805761317f612ba9565b5b5f61318d85828601612c74565b925050602061319e85828601612c74565b9150509250929050565b5f602082840312156131bd576131bc612ba9565b5b5f82013567ffffffffffffffff8111156131da576131d9612bad565b5b6131e684828501612e7c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061323357607f821691505b602082108103613246576132456131ef565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61328382612b6f565b915061328e83612b6f565b92508282039050818111156132a6576132a561324c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6133245f83613306565b915061332f82613316565b5f82019050919050565b5f60808201905061334c5f830186612c36565b6133596020830185612c36565b6133666040830184612b78565b818103606083015261337781613319565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133b581613381565b81146133bf575f80fd5b50565b5f815190506133d0816133ac565b92915050565b5f602082840312156133eb576133ea612ba9565b5b5f6133f8848285016133c2565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261345d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613422565b6134678683613422565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6134a261349d61349884612b6f565b61347f565b612b6f565b9050919050565b5f819050919050565b6134bb83613488565b6134cf6134c7826134a9565b84845461342e565b825550505050565b5f90565b6134e36134d7565b6134ee8184846134b2565b505050565b5b81811015613511576135065f826134db565b6001810190506134f4565b5050565b601f8211156135565761352781613401565b61353084613413565b8101602085101561353f578190505b61355361354b85613413565b8301826134f3565b50505b505050565b5f82821c905092915050565b5f6135765f198460080261355b565b1980831691505092915050565b5f61358e8383613567565b9150826002028217905092915050565b6135a782612ac5565b67ffffffffffffffff8111156135c0576135bf612d85565b5b6135ca825461321c565b6135d5828285613515565b5f60209050601f831160018114613606575f84156135f4578287015190505b6135fe8582613583565b865550613665565b601f19841661361486613401565b5f5b8281101561363b57848901518255600182019150602085019450602081019050613616565b868310156136585784890151613654601f891682613567565b8355505b6001600288020188555050505b505050505050565b5f6136788385613306565b9350613685838584612e2d565b61368e83612b07565b840190509392505050565b5f6080820190506136ac5f830188612c36565b6136b96020830187612c36565b6136c66040830186612b78565b81810360608301526136d981848661366d565b90509695505050505050565b5f81905092915050565b5f81546136fb8161321c565b61370581866136e5565b9450600182165f811461371f576001811461373457613766565b60ff1983168652811515820286019350613766565b61373d85613401565b5f5b8381101561375e5781548189015260018201915060208101905061373f565b838801955050505b50505092915050565b5f61377982612ac5565b61378381856136e5565b9350613793818560208601612adf565b80840191505092915050565b5f6137aa82856136ef565b91506137b6828461376f565b91508190509392505050565b5f6137cd828461376f565b915081905092915050565b5f8160011c9050919050565b5f808291508390505b600185111561382d578086048111156138095761380861324c565b5b60018516156138185780820291505b8081029050613826856137d8565b94506137ed565b94509492505050565b5f826138455760019050613900565b81613852575f9050613900565b81600181146138685760028114613872576138a1565b6001915050613900565b60ff8411156138845761388361324c565b5b8360020a91508482111561389b5761389a61324c565b5b50613900565b5060208310610133831016604e8410600b84101617156138d65782820a9050838111156138d1576138d061324c565b5b613900565b6138e384848460016137e4565b925090508184048111156138fa576138f961324c565b5b81810290505b9392505050565b5f61391182612b6f565b915061391c83612d49565b92506139497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613836565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61398882612b6f565b915061399383612b6f565b9250826139a3576139a2613951565b5b828204905092915050565b5f6139b882612b6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139ea576139e961324c565b5b600182019050919050565b5f819050919050565b613a0f613a0a82612b6f565b6139f5565b82525050565b5f8160601b9050919050565b5f613a2b82613a15565b9050919050565b5f613a3c82613a21565b9050919050565b613a54613a4f82612c25565b613a32565b82525050565b5f613a6582866139fe565b602082019150613a758285613a43565b601482019150613a8582846139fe565b602082019150819050949350505050565b5f613aa082612b6f565b9150613aab83612b6f565b925082613abb57613aba613951565b5b82820690509291505056fea2646970667358221220e7c14b00994446ec62b61b2049d40395c79919a338bc19d5f06a2f823ff899d864736f6c63430008160033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80638da5cb5b11610102578063b8e3b441116100a0578063dd62ed3e1161006f578063dd62ed3e1461052d578063e0df5b6f1461055d578063e985e9c514610579578063f2fde38b146105a9576101cd565b8063b8e3b44114610493578063c87b56dd146104af578063ca4c0e09146104df578063d547cfb71461050f576101cd565b8063a22cb465116100dc578063a22cb4651461040d578063a9059cbb14610429578063a9e2880e14610459578063b88d4fde14610477576101cd565b80638da5cb5b146103a157806395d89b41146103bf5780639b19251a146103dd576101cd565b80632c88797e1161016f578063504334c211610149578063504334c21461030957806353d6fd59146103255780636352211e1461034157806370a0823114610371576101cd565b80632c88797e146102b1578063313ce567146102cf57806342842e0e146102ed576101cd565b8063095ea7b3116101ab578063095ea7b31461023d57806318160ddd1461026d57806323b872dd1461028b5780632b968958146102a7576101cd565b806306fdde03146101d157806307c56001146101ef578063081812fc1461020d575b5f80fd5b6101d96105c5565b6040516101e69190612b4f565b60405180910390f35b6101f7610651565b6040516102049190612b87565b60405180910390f35b61022760048036038101906102229190612bdb565b610657565b6040516102349190612c45565b60405180910390f35b61025760048036038101906102529190612c88565b610687565b6040516102649190612ce0565b60405180910390f35b61027561096e565b6040516102829190612b87565b60405180910390f35b6102a560048036038101906102a09190612cf9565b610992565b005b6102af611189565b005b6102b96112a8565b6040516102c69190612b87565b60405180910390f35b6102d76112ae565b6040516102e49190612d64565b60405180910390f35b61030760048036038101906103029190612cf9565b6112d2565b005b610323600480360381019061031e9190612ea9565b611401565b005b61033f600480360381019061033a9190612f49565b6114a9565b005b61035b60048036038101906103569190612bdb565b6115fc565b6040516103689190612c45565b60405180910390f35b61038b60048036038101906103869190612f87565b61169a565b6040516103989190612b87565b60405180910390f35b6103a96116af565b6040516103b69190612c45565b60405180910390f35b6103c76116d2565b6040516103d49190612b4f565b60405180910390f35b6103f760048036038101906103f29190612f87565b61175e565b6040516104049190612ce0565b60405180910390f35b61042760048036038101906104229190612f49565b61177b565b005b610443600480360381019061043e9190612c88565b611873565b6040516104509190612ce0565b60405180910390f35b610461611887565b60405161046e9190613069565b60405180910390f35b610491600480360381019061048c91906130e6565b6118dd565b005b6104ad60048036038101906104a89190612bdb565b611a12565b005b6104c960048036038101906104c49190612bdb565b611afb565b6040516104d69190612b4f565b60405180910390f35b6104f960048036038101906104f49190612bdb565b611b4e565b6040516105069190612b87565b60405180910390f35b610517611b6e565b6040516105249190612b4f565b60405180910390f35b6105476004803603810190610542919061316a565b611bfa565b6040516105549190612b87565b60405180910390f35b610577600480360381019061057291906131a8565b611c1a565b005b610593600480360381019061058e919061316a565b611cb1565b6040516105a09190612ce0565b60405180910390f35b6105c360048036038101906105be9190612f87565b611cdb565b005b600180546105d29061321c565b80601f01602080910402602001604051908101604052809291908181526020018280546105fe9061321c565b80156106495780601f1061062057610100808354040283529160200191610649565b820191905f5260205f20905b81548152906001019060200180831161062c57829003601f168201915b505050505081565b60065481565b600a602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600654821115801561069957505f82115b15610881575f600c5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107905750600b5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156107c7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600a5f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108739190612b87565b60405180910390a350610964565b8160095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161095b9190612b87565b60405180910390a35b6001905092915050565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b600454811161104a57600c5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a30576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a95576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b535750600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610bbb5750600a5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610bf2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bfa611e60565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c459190613279565b92505081905550610c54611e60565b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610daa9190613279565b81548110610dbb57610dba6132ac565b5b905f5260205f200154905080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600e5f8581526020019081526020015f205481548110610e2757610e266132ac565b5b905f5260205f200181905550600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e8057610e7f6132d9565b5b600190038181905f5260205f20015f90559055600e5f8381526020019081526020015f2054600e5f8381526020019081526020015f2081905550600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f689190613279565b600e5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761102f611e60565b60405161103c9190612b87565b60405180910390a350611184565b5f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111765781816110f99190613279565b60095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b611181848484611e93565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461120d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b60045481565b7f000000000000000000000000000000000000000000000000000000000000001281565b6112dd838383610992565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156113c5575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161136393929190613339565b6020604051808303815f875af115801561137f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113a391906133d6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156113fc576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611485576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160019081611494919061359e565b5080600290816114a4919061359e565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461152d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156115a4576040517f2f57ef6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611695576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6008602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600280546116df9061321c565b80601f016020809104026020016040519081016040528092919081815260200182805461170b9061321c565b80156117565780601f1061172d57610100808354040283529160200191611756565b820191905f5260205f20905b81548152906001019060200180831161173957829003601f168201915b505050505081565b600f602052805f5260405f205f915054906101000a900460ff1681565b80600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118679190612ce0565b60405180910390a35050565b5f61187f338484611e93565b905092915050565b606060058054806020026020016040519081016040528092919081815260200182805480156118d357602002820191905f5260205f20905b8154815260200190600101908083116118bf575b5050505050905090565b6118e8858585610992565b5f8473ffffffffffffffffffffffffffffffffffffffff163b141580156119d4575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611972959493929190613699565b6020604051808303815f875af115801561198e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b291906133d6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611a0b576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b60606003611b08836121f3565b604051602001611b1992919061379f565b604051602081830303815290604052604051602001611b3891906137c2565b6040516020818303038152906040529050919050565b60058181548110611b5d575f80fd5b905f5260205f20015f915090505481565b60038054611b7b9061321c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba79061321c565b8015611bf25780601f10611bc957610100808354040283529160200191611bf2565b820191905f5260205f20905b815481529060010190602001808311611bd557829003601f168201915b505050505081565b6009602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060039081611cad919061359e565b5050565b600b602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d5f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dc4576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a611e8e9190613907565b905090565b5f80611e9d611e60565b90505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f6d9190613279565b925050819055508460085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600f5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661209f575f8360085f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612056919061397e565b8484612062919061397e565b61206c9190613279565b90505f5b620f42408261207f919061397e565b81101561209c5761208f896122bd565b8080600101915050612070565b50505b600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612180575f83826120fa919061397e565b8460085f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612143919061397e565b61214d9190613279565b90505f5b620f424082612160919061397e565b81101561217d576121708861250b565b8080600101915050612151565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516121dd9190612b87565b60405180910390a3600193505050509392505050565b60605f600161220184612787565b0190505f8167ffffffffffffffff81111561221f5761221e612d85565b5b6040519080825280601f01601f1916602001820160405280156122515781602001600182028036833780820191505090505b5090505f82602001820190505b6001156122b2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122a7576122a6613951565b5b0494505f850361225e575b819350505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612322576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506123ad9190613279565b815481106123be576123bd6132ac565b5b905f5260205f20015490506123d2816128d8565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061241f5761241e6132d9565b5b600190038181905f5260205f20015f90559055600e5f8281526020019081526020015f205f9055600c5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612570576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045460065410156125c75760065f81548092919061258f906139ae565b91905055506006549050600160075f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550612616565b5f60058054905011156125e3576125dc61297d565b9050612615565b6040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b81600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506127139190613279565b600e5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127e3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127d9576127d8613951565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612820576d04ee2d6d415b85acef8100000000838161281657612815613951565b5b0492506020810190505b662386f26fc10000831061284f57662386f26fc10000838161284557612844613951565b5b0492506010810190505b6305f5e1008310612878576305f5e100838161286e5761286d613951565b5b0492506008810190505b612710831061289d57612710838161289357612892613951565b5b0492506004810190505b606483106128c057606483816128b6576128b5613951565b5b0492506002810190505b600a83106128cf576001810190505b80915050919050565b60075f8281526020019081526020015f205f9054906101000a900460ff1661292c576040517fd7004e5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581908060018154018082558091505060019003905f5260205f20015f90919091909150555f60075f8381526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f80600580549050036129bc576040517fed4421ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60058054905042336005805490506040516020016129dd93929190613a5a565b604051602081830303815290604052805190602001205f1c6129ff9190613a96565b90505f60058281548110612a1657612a156132ac565b5b905f5260205f200154905060056001600580549050612a359190613279565b81548110612a4657612a456132ac565b5b905f5260205f20015460058381548110612a6357612a626132ac565b5b905f5260205f2001819055506005805480612a8157612a806132d9565b5b600190038181905f5260205f20015f90559055600160075f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550809250505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612afc578082015181840152602081019050612ae1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612b2182612ac5565b612b2b8185612acf565b9350612b3b818560208601612adf565b612b4481612b07565b840191505092915050565b5f6020820190508181035f830152612b678184612b17565b905092915050565b5f819050919050565b612b8181612b6f565b82525050565b5f602082019050612b9a5f830184612b78565b92915050565b5f604051905090565b5f80fd5b5f80fd5b612bba81612b6f565b8114612bc4575f80fd5b50565b5f81359050612bd581612bb1565b92915050565b5f60208284031215612bf057612bef612ba9565b5b5f612bfd84828501612bc7565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612c2f82612c06565b9050919050565b612c3f81612c25565b82525050565b5f602082019050612c585f830184612c36565b92915050565b612c6781612c25565b8114612c71575f80fd5b50565b5f81359050612c8281612c5e565b92915050565b5f8060408385031215612c9e57612c9d612ba9565b5b5f612cab85828601612c74565b9250506020612cbc85828601612bc7565b9150509250929050565b5f8115159050919050565b612cda81612cc6565b82525050565b5f602082019050612cf35f830184612cd1565b92915050565b5f805f60608486031215612d1057612d0f612ba9565b5b5f612d1d86828701612c74565b9350506020612d2e86828701612c74565b9250506040612d3f86828701612bc7565b9150509250925092565b5f60ff82169050919050565b612d5e81612d49565b82525050565b5f602082019050612d775f830184612d55565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612dbb82612b07565b810181811067ffffffffffffffff82111715612dda57612dd9612d85565b5b80604052505050565b5f612dec612ba0565b9050612df88282612db2565b919050565b5f67ffffffffffffffff821115612e1757612e16612d85565b5b612e2082612b07565b9050602081019050919050565b828183375f83830152505050565b5f612e4d612e4884612dfd565b612de3565b905082815260208101848484011115612e6957612e68612d81565b5b612e74848285612e2d565b509392505050565b5f82601f830112612e9057612e8f612d7d565b5b8135612ea0848260208601612e3b565b91505092915050565b5f8060408385031215612ebf57612ebe612ba9565b5b5f83013567ffffffffffffffff811115612edc57612edb612bad565b5b612ee885828601612e7c565b925050602083013567ffffffffffffffff811115612f0957612f08612bad565b5b612f1585828601612e7c565b9150509250929050565b612f2881612cc6565b8114612f32575f80fd5b50565b5f81359050612f4381612f1f565b92915050565b5f8060408385031215612f5f57612f5e612ba9565b5b5f612f6c85828601612c74565b9250506020612f7d85828601612f35565b9150509250929050565b5f60208284031215612f9c57612f9b612ba9565b5b5f612fa984828501612c74565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612fe481612b6f565b82525050565b5f612ff58383612fdb565b60208301905092915050565b5f602082019050919050565b5f61301782612fb2565b6130218185612fbc565b935061302c83612fcc565b805f5b8381101561305c5781516130438882612fea565b975061304e83613001565b92505060018101905061302f565b5085935050505092915050565b5f6020820190508181035f830152613081818461300d565b905092915050565b5f80fd5b5f80fd5b5f8083601f8401126130a6576130a5612d7d565b5b8235905067ffffffffffffffff8111156130c3576130c2613089565b5b6020830191508360018202830111156130df576130de61308d565b5b9250929050565b5f805f805f608086880312156130ff576130fe612ba9565b5b5f61310c88828901612c74565b955050602061311d88828901612c74565b945050604061312e88828901612bc7565b935050606086013567ffffffffffffffff81111561314f5761314e612bad565b5b61315b88828901613091565b92509250509295509295909350565b5f80604083850312156131805761317f612ba9565b5b5f61318d85828601612c74565b925050602061319e85828601612c74565b9150509250929050565b5f602082840312156131bd576131bc612ba9565b5b5f82013567ffffffffffffffff8111156131da576131d9612bad565b5b6131e684828501612e7c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061323357607f821691505b602082108103613246576132456131ef565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61328382612b6f565b915061328e83612b6f565b92508282039050818111156132a6576132a561324c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6133245f83613306565b915061332f82613316565b5f82019050919050565b5f60808201905061334c5f830186612c36565b6133596020830185612c36565b6133666040830184612b78565b818103606083015261337781613319565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133b581613381565b81146133bf575f80fd5b50565b5f815190506133d0816133ac565b92915050565b5f602082840312156133eb576133ea612ba9565b5b5f6133f8848285016133c2565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261345d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613422565b6134678683613422565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6134a261349d61349884612b6f565b61347f565b612b6f565b9050919050565b5f819050919050565b6134bb83613488565b6134cf6134c7826134a9565b84845461342e565b825550505050565b5f90565b6134e36134d7565b6134ee8184846134b2565b505050565b5b81811015613511576135065f826134db565b6001810190506134f4565b5050565b601f8211156135565761352781613401565b61353084613413565b8101602085101561353f578190505b61355361354b85613413565b8301826134f3565b50505b505050565b5f82821c905092915050565b5f6135765f198460080261355b565b1980831691505092915050565b5f61358e8383613567565b9150826002028217905092915050565b6135a782612ac5565b67ffffffffffffffff8111156135c0576135bf612d85565b5b6135ca825461321c565b6135d5828285613515565b5f60209050601f831160018114613606575f84156135f4578287015190505b6135fe8582613583565b865550613665565b601f19841661361486613401565b5f5b8281101561363b57848901518255600182019150602085019450602081019050613616565b868310156136585784890151613654601f891682613567565b8355505b6001600288020188555050505b505050505050565b5f6136788385613306565b9350613685838584612e2d565b61368e83612b07565b840190509392505050565b5f6080820190506136ac5f830188612c36565b6136b96020830187612c36565b6136c66040830186612b78565b81810360608301526136d981848661366d565b90509695505050505050565b5f81905092915050565b5f81546136fb8161321c565b61370581866136e5565b9450600182165f811461371f576001811461373457613766565b60ff1983168652811515820286019350613766565b61373d85613401565b5f5b8381101561375e5781548189015260018201915060208101905061373f565b838801955050505b50505092915050565b5f61377982612ac5565b61378381856136e5565b9350613793818560208601612adf565b80840191505092915050565b5f6137aa82856136ef565b91506137b6828461376f565b91508190509392505050565b5f6137cd828461376f565b915081905092915050565b5f8160011c9050919050565b5f808291508390505b600185111561382d578086048111156138095761380861324c565b5b60018516156138185780820291505b8081029050613826856137d8565b94506137ed565b94509492505050565b5f826138455760019050613900565b81613852575f9050613900565b81600181146138685760028114613872576138a1565b6001915050613900565b60ff8411156138845761388361324c565b5b8360020a91508482111561389b5761389a61324c565b5b50613900565b5060208310610133831016604e8410600b84101617156138d65782820a9050838111156138d1576138d061324c565b5b613900565b6138e384848460016137e4565b925090508184048111156138fa576138f961324c565b5b81810290505b9392505050565b5f61391182612b6f565b915061391c83612d49565b92506139497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613836565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61398882612b6f565b915061399383612b6f565b9250826139a3576139a2613951565b5b828204905092915050565b5f6139b882612b6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139ea576139e961324c565b5b600182019050919050565b5f819050919050565b613a0f613a0a82612b6f565b6139f5565b82525050565b5f8160601b9050919050565b5f613a2b82613a15565b9050919050565b5f613a3c82613a21565b9050919050565b613a54613a4f82612c25565b613a32565b82525050565b5f613a6582866139fe565b602082019150613a758285613a43565b601482019150613a8582846139fe565b602082019150819050949350505050565b5f613aa082612b6f565b9150613aab83612b6f565b925082613abb57613aba613951565b5b82820690509291505056fea2646970667358221220e7c14b00994446ec62b61b2049d40395c79919a338bc19d5f06a2f823ff899d864736f6c63430008160033

Deployed Bytecode Sourcemap

22359:11496:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23346:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23962:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24408:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26639:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23582:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27677:1685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21205:151;;;:::i;:::-;;23759:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23482:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29625:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33571:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25530:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25877:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24174:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20646:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23400;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25019:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27329:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29421:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33750:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30083:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26068:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26277:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23835:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23689:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24288:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26163:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24519:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20978:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23346:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23962:26::-;;;;:::o;24408:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;26639:639::-;26734:4;26769:11;;26755:10;:25;;:43;;;;;26797:1;26784:10;:14;26755:43;26751:496;;;26815:13;26831:8;:20;26840:10;26831:20;;;;;;;;;;;;;;;;;;;;;26815:36;;26886:5;26872:19;;:10;:19;;;;:59;;;;;26896:16;:23;26913:5;26896:23;;;;;;;;;;;;;;;:35;26920:10;26896:35;;;;;;;;;;;;;;;;;;;;;;;;;26895:36;26872:59;26868:121;;;26959:14;;;;;;;;;;;;;;26868:121;27031:7;27005:11;:23;27017:10;27005:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;27076:7;27060:36;;27069:5;27060:36;;;27085:10;27060:36;;;;;;:::i;:::-;;;;;;;;26800:308;26751:496;;;27162:10;27129:9;:21;27139:10;27129:21;;;;;;;;;;;;;;;:30;27151:7;27129:30;;;;;;;;;;;;;;;:43;;;;27215:7;27194:41;;27203:10;27194:41;;;27224:10;27194:41;;;;;;:::i;:::-;;;;;;;;26751:496;27266:4;27259:11;;26639:639;;;;:::o;23582:36::-;;;:::o;27677:1685::-;27781:17;;27767:10;:31;27763:1592;;27827:8;:20;27836:10;27827:20;;;;;;;;;;;;;;;;;;;;;27819:28;;:4;:28;;;27815:91;;27875:15;;;;;;;;;;;;;;27815:91;27940:1;27926:16;;:2;:16;;;27922:82;;27970:18;;;;;;;;;;;;;;27922:82;28056:4;28042:18;;:10;:18;;;;:74;;;;;28082:16;:22;28099:4;28082:22;;;;;;;;;;;;;;;:34;28105:10;28082:34;;;;;;;;;;;;;;;;;;;;;;;;;28081:35;28042:74;:132;;;;;28151:11;:23;28163:10;28151:23;;;;;;;;;;;;;;;;;;;;;28137:37;;:10;:37;;;;28042:132;28020:226;;;28216:14;;;;;;;;;;;;;;28020:226;28281:10;:8;:10::i;:::-;28262:9;:15;28272:4;28262:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;28354:10;:8;:10::i;:::-;28337:9;:13;28347:2;28337:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;28419:2;28396:8;:20;28405:10;28396:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28443:11;:23;28455:10;28443:23;;;;;;;;;;;;28436:30;;;;;;;;;;;28524:17;28544:6;:12;28551:4;28544:12;;;;;;;;;;;;;;;28579:1;28557:6;:12;28564:4;28557:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;28544:37;;;;;;;;:::i;:::-;;;;;;;;;;28524:57;;28636:9;28596:6;:12;28603:4;28596:12;;;;;;;;;;;;;;;28609:11;:23;28621:10;28609:23;;;;;;;;;;;;28596:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;28680:6;:12;28687:4;28680:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28784:11;:23;28796:10;28784:23;;;;;;;;;;;;28759:11;:22;28771:9;28759:22;;;;;;;;;;;:48;;;;28861:6;:10;28868:2;28861:10;;;;;;;;;;;;;;;28877;28861:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28991:1;28971:6;:10;28978:2;28971:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28945:11;:23;28957:10;28945:23;;;;;;;;;;;:47;;;;29033:10;29029:2;29014:30;;29023:4;29014:30;;;;;;;;;;;;29084:2;29064:35;;29078:4;29064:35;;;29088:10;:8;:10::i;:::-;29064:35;;;;;;:::i;:::-;;;;;;;;27800:1311;27763:1592;;;29132:15;29150:9;:15;29160:4;29150:15;;;;;;;;;;;;;;;:27;29166:10;29150:27;;;;;;;;;;;;;;;;29132:45;;29209:17;29198:7;:28;29194:101;;29285:10;29275:7;:20;;;;:::i;:::-;29245:9;:15;29255:4;29245:15;;;;;;;;;;;;;;;:27;29261:10;29245:27;;;;;;;;;;;;;;;:50;;;;29194:101;29312:31;29322:4;29328:2;29332:10;29312:9;:31::i;:::-;;29117:238;27763:1592;27677:1685;;;:::o;21205:151::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;21284:1:::1;21268:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;21345:1;21304:44;;21325:10;21304:44;;;;;;;;;;;;21205:151::o:0;23759:32::-;;;;:::o;23482:31::-;;;:::o;29625:363::-;29707:26;29720:4;29726:2;29730;29707:12;:26::i;:::-;29782:1;29764:2;:14;;;:19;;:154;;;;;29878:40;;;29800:118;;;29815:2;29800:35;;;29836:10;29848:4;29854:2;29800:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;29764:154;29746:235;;;29952:17;;;;;;;;;;;;;;29746:235;29625:363;;;:::o;33571:167::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;33698:5:::1;33691:4;:12;;;;;;:::i;:::-;;33723:7;33714:6;:16;;;;;;:::i;:::-;;33571:167:::0;;:::o;25530:275::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;25695:1:::1;25675:9;:17;25685:6;25675:17;;;;;;;;;;;;;;;;:21;25671:91;;;25720:30;;;;;;;;;;;;;;25671:91;25792:5;25772:9;:17;25782:6;25772:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25530:275:::0;;:::o;25877:185::-;25927:13;25961:8;:12;25970:2;25961:12;;;;;;;;;;;;;;;;;;;;;25953:20;;26007:1;25990:19;;:5;:19;;;25986:69;;26033:10;;;;;;;;;;;;;;25986:69;25877:185;;;:::o;24174:44::-;;;;;;;;;;;;;;;;;:::o;20646:20::-;;;;;;;;;;;;:::o;23400:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25019:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;27329:199::-;27448:8;27407:16;:28;27424:10;27407:28;;;;;;;;;;;;;;;:38;27436:8;27407:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;27501:8;27474:46;;27489:10;27474:46;;;27511:8;27474:46;;;;;;:::i;:::-;;;;;;;;27329:199;;:::o;29421:127::-;29483:4;29507:33;29517:10;29529:2;29533:6;29507:9;:33::i;:::-;29500:40;;29421:127;;;;:::o;33750:102::-;33797:16;33833:11;33826:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33750:102;:::o;30083:429::-;30229:26;30242:4;30248:2;30252;30229:12;:26::i;:::-;30304:1;30286:2;:14;;;:19;;:156;;;;;30402:40;;;30322:120;;;30337:2;30322:35;;;30358:10;30370:4;30376:2;30380:4;;30322:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;30286:156;30268:237;;;30476:17;;;;;;;;;;;;;;30268:237;30083:429;;;;;:::o;26068:89::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;26146:3:::1;26127:9;:16;26137:5:::0;::::1;;;;;;;;;;26127:16;;;;;;;;;;;;;;;:22;;;;26068:89:::0;:::o;26277:213::-;26328:13;26412:12;26426:20;26443:2;26426:16;:20::i;:::-;26398:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26370:102;;;;;;;;:::i;:::-;;;;;;;;;;;;;26354:118;;26277:213;;;:::o;23835:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23689:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24288:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26163:106::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;26252:9:::1;26237:12;:24;;;;;;:::i;:::-;;26163:106:::0;:::o;24519:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20978:219::-;20733:5;;;;;;;;;;20719:19;;:10;:19;;;20715:46;;20747:14;;;;;;;;;;;;;;20715:46;21079:1:::1;21061:20;;:6;:20;;::::0;21057:47:::1;;21090:14;;;;;;;;;;;;;;21057:47;21125:6;21117:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;21182:6;21149:40;;21170:10;21149:40;;;;;;;;;;;;20978:219:::0;:::o;31732:92::-;31775:7;31808:8;31802:2;:14;;;;:::i;:::-;31795:21;;31732:92;:::o;30580:1113::-;30693:4;30710:12;30725:10;:8;:10::i;:::-;30710:25;;30746:27;30776:9;:15;30786:4;30776:15;;;;;;;;;;;;;;;;30746:45;;30802:29;30834:9;:13;30844:2;30834:13;;;;;;;;;;;;;;;;30802:45;;30879:6;30860:9;:15;30870:4;30860:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30940:6;30923:9;:13;30933:2;30923:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;31031:9;:15;31041:4;31031:15;;;;;;;;;;;;;;;;;;;;;;;;;31026:261;;31063:22;31155:4;31137:9;:15;31147:4;31137:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;31111:4;31089:19;:26;;;;:::i;:::-;31088:72;;;;:::i;:::-;31063:97;;31180:9;31175:101;31216:7;31199:14;:24;;;;:::i;:::-;31195:1;:28;31175:101;;;31249:11;31255:4;31249:5;:11::i;:::-;31225:3;;;;;;;31175:101;;;;31048:239;31026:261;31363:9;:13;31373:2;31363:13;;;;;;;;;;;;;;;;;;;;;;;;;31358:257;;31393:22;31485:4;31461:21;:28;;;;:::i;:::-;31435:4;31419:9;:13;31429:2;31419:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;31418:72;;;;:::i;:::-;31393:97;;31510:9;31505:99;31546:7;31529:14;:24;;;;:::i;:::-;31525:1;:28;31505:99;;;31579:9;31585:2;31579:5;:9::i;:::-;31555:3;;;;;;;31505:99;;;;31378:237;31358:257;31652:2;31632:31;;31646:4;31632:31;;;31656:6;31632:31;;;;;;:::i;:::-;;;;;;;;31681:4;31674:11;;;;;30580:1113;;;;;:::o;17839:718::-;17895:13;17946:14;17983:1;17963:17;17974:5;17963:10;:17::i;:::-;:21;17946:38;;17999:20;18033:6;18022:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17999:41;;18055:11;18184:6;18180:2;18176:15;18168:6;18164:28;18157:35;;18221:290;18228:4;18221:290;;;18253:5;;;;;;;;18395:10;18390:2;18383:5;18379:14;18374:32;18369:3;18361:46;18453:2;18444:11;;;;;;:::i;:::-;;;;;18487:1;18478:5;:10;18221:290;18474:21;18221:290;18532:6;18525:13;;;;;17839:718;;;:::o;33170:393::-;33239:1;33223:18;;:4;:18;;;33219:73;;33265:15;;;;;;;;;;;;;;33219:73;33302:10;33315:6;:12;33322:4;33315:12;;;;;;;;;;;;;;;33350:1;33328:6;:12;33335:4;33328:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;33315:37;;;;;;;;:::i;:::-;;;;;;;;;;33302:50;;33363:19;33379:2;33363:15;:19::i;:::-;33393:6;:12;33400:4;33393:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33429:11;:15;33441:2;33429:15;;;;;;;;;;;33422:22;;;33462:8;:12;33471:2;33462:12;;;;;;;;;;;;33455:19;;;;;;;;;;;33492:11;:15;33504:2;33492:15;;;;;;;;;;;;33485:22;;;;;;;;;;;33552:2;33548:1;33525:30;;33534:4;33525:30;;;;;;;;;;;;33208:355;33170:393;:::o;32561:601::-;32626:1;32612:16;;:2;:16;;;32608:74;;32652:18;;;;;;;;;;;;;;32608:74;32694:10;32735:17;;32721:11;;:31;32717:282;;;32769:11;;:13;;;;;;;;;:::i;:::-;;;;;;32802:11;;32797:16;;32845:4;32828:10;:14;32839:2;32828:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32717:282;;;32892:1;32871:11;:18;;;;:22;32867:132;;;32915:19;:17;:19::i;:::-;32910:24;;32867:132;;;32974:13;;;;;;;;;;;;;;32867:132;32717:282;33026:2;33011:8;:12;33020:2;33011:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;33039:6;:10;33046:2;33039:10;;;;;;;;;;;;;;;33055:2;33039:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33107:1;33087:6;:10;33094:2;33087:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;33069:11;:15;33081:2;33069:15;;;;;;;;;;;:39;;;;33151:2;33147;33126:28;;33143:1;33126:28;;;;;;;;;;;;32597:565;32561:601;:::o;14243:948::-;14296:7;14316:14;14333:1;14316:18;;14383:8;14374:5;:17;14370:106;;14421:8;14412:17;;;;;;:::i;:::-;;;;;14458:2;14448:12;;;;14370:106;14503:8;14494:5;:17;14490:106;;14541:8;14532:17;;;;;;:::i;:::-;;;;;14578:2;14568:12;;;;14490:106;14623:8;14614:5;:17;14610:106;;14661:8;14652:17;;;;;;:::i;:::-;;;;;14698:2;14688:12;;;;14610:106;14743:7;14734:5;:16;14730:103;;14780:7;14771:16;;;;;;:::i;:::-;;;;;14816:1;14806:11;;;;14730:103;14860:7;14851:5;:16;14847:103;;14897:7;14888:16;;;;;;:::i;:::-;;;;;14933:1;14923:11;;;;14847:103;14977:7;14968:5;:16;14964:103;;15014:7;15005:16;;;;;;:::i;:::-;;;;;15050:1;15040:11;;;;14964:103;15094:7;15085:5;:16;15081:68;;15132:1;15122:11;;;;15081:68;15177:6;15170:13;;;14243:948;;;:::o;32356:197::-;32417:10;:14;32428:2;32417:14;;;;;;;;;;;;;;;;;;;;;32412:70;;32455:15;;;;;;;;;;;;;;32412:70;32492:11;32509:2;32492:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32540:5;32523:10;:14;32534:2;32523:14;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;32356:197;:::o;31832:512::-;31878:7;31924:1;31902:11;:18;;;;:23;31898:76;;31949:13;;;;;;;;;;;;;;31898:76;31984:19;32117:11;:18;;;;32055:15;32072:10;32083:11;:18;;;;32038:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32028:75;;;;;;32006:108;;:129;;;;:::i;:::-;31984:151;;32146:10;32159:11;32171;32159:24;;;;;;;;:::i;:::-;;;;;;;;;;32146:37;;32221:11;32254:1;32233:11;:18;;;;:22;;;;:::i;:::-;32221:35;;;;;;;;:::i;:::-;;;;;;;;;;32194:11;32206;32194:24;;;;;;;;:::i;:::-;;;;;;;;;:62;;;;32267:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32312:4;32295:10;:14;32306:2;32295:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32334:2;32327:9;;;;31832:512;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:77::-;1386:7;1415:5;1404:16;;1349:77;;;:::o;1432:118::-;1519:24;1537:5;1519:24;:::i;:::-;1514:3;1507:37;1432:118;;:::o;1556:222::-;1649:4;1687:2;1676:9;1672:18;1664:26;;1700:71;1768:1;1757:9;1753:17;1744:6;1700:71;:::i;:::-;1556:222;;;;:::o;1784:75::-;1817:6;1850:2;1844:9;1834:19;;1784:75;:::o;1865:117::-;1974:1;1971;1964:12;1988:117;2097:1;2094;2087:12;2111:122;2184:24;2202:5;2184:24;:::i;:::-;2177:5;2174:35;2164:63;;2223:1;2220;2213:12;2164:63;2111:122;:::o;2239:139::-;2285:5;2323:6;2310:20;2301:29;;2339:33;2366:5;2339:33;:::i;:::-;2239:139;;;;:::o;2384:329::-;2443:6;2492:2;2480:9;2471:7;2467:23;2463:32;2460:119;;;2498:79;;:::i;:::-;2460:119;2618:1;2643:53;2688:7;2679:6;2668:9;2664:22;2643:53;:::i;:::-;2633:63;;2589:117;2384:329;;;;:::o;2719:126::-;2756:7;2796:42;2789:5;2785:54;2774:65;;2719:126;;;:::o;2851:96::-;2888:7;2917:24;2935:5;2917:24;:::i;:::-;2906:35;;2851:96;;;:::o;2953:118::-;3040:24;3058:5;3040:24;:::i;:::-;3035:3;3028:37;2953:118;;:::o;3077:222::-;3170:4;3208:2;3197:9;3193:18;3185:26;;3221:71;3289:1;3278:9;3274:17;3265:6;3221:71;:::i;:::-;3077:222;;;;:::o;3305:122::-;3378:24;3396:5;3378:24;:::i;:::-;3371:5;3368:35;3358:63;;3417:1;3414;3407:12;3358:63;3305:122;:::o;3433:139::-;3479:5;3517:6;3504:20;3495:29;;3533:33;3560:5;3533:33;:::i;:::-;3433:139;;;;:::o;3578:474::-;3646:6;3654;3703:2;3691:9;3682:7;3678:23;3674:32;3671:119;;;3709:79;;:::i;:::-;3671:119;3829:1;3854:53;3899:7;3890:6;3879:9;3875:22;3854:53;:::i;:::-;3844:63;;3800:117;3956:2;3982:53;4027:7;4018:6;4007:9;4003:22;3982:53;:::i;:::-;3972:63;;3927:118;3578:474;;;;;:::o;4058:90::-;4092:7;4135:5;4128:13;4121:21;4110:32;;4058:90;;;:::o;4154:109::-;4235:21;4250:5;4235:21;:::i;:::-;4230:3;4223:34;4154:109;;:::o;4269:210::-;4356:4;4394:2;4383:9;4379:18;4371:26;;4407:65;4469:1;4458:9;4454:17;4445:6;4407:65;:::i;:::-;4269:210;;;;:::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:117::-;5649:1;5646;5639:12;5663:117;5772:1;5769;5762:12;5786:180;5834:77;5831:1;5824:88;5931:4;5928:1;5921:15;5955:4;5952:1;5945:15;5972:281;6055:27;6077:4;6055:27;:::i;:::-;6047:6;6043:40;6185:6;6173:10;6170:22;6149:18;6137:10;6134:34;6131:62;6128:88;;;6196:18;;:::i;:::-;6128:88;6236:10;6232:2;6225:22;6015:238;5972:281;;:::o;6259:129::-;6293:6;6320:20;;:::i;:::-;6310:30;;6349:33;6377:4;6369:6;6349:33;:::i;:::-;6259:129;;;:::o;6394:308::-;6456:4;6546:18;6538:6;6535:30;6532:56;;;6568:18;;:::i;:::-;6532:56;6606:29;6628:6;6606:29;:::i;:::-;6598:37;;6690:4;6684;6680:15;6672:23;;6394:308;;;:::o;6708:146::-;6805:6;6800:3;6795;6782:30;6846:1;6837:6;6832:3;6828:16;6821:27;6708:146;;;:::o;6860:425::-;6938:5;6963:66;6979:49;7021:6;6979:49;:::i;:::-;6963:66;:::i;:::-;6954:75;;7052:6;7045:5;7038:21;7090:4;7083:5;7079:16;7128:3;7119:6;7114:3;7110:16;7107:25;7104:112;;;7135:79;;:::i;:::-;7104:112;7225:54;7272:6;7267:3;7262;7225:54;:::i;:::-;6944:341;6860:425;;;;;:::o;7305:340::-;7361:5;7410:3;7403:4;7395:6;7391:17;7387:27;7377:122;;7418:79;;:::i;:::-;7377:122;7535:6;7522:20;7560:79;7635:3;7627:6;7620:4;7612:6;7608:17;7560:79;:::i;:::-;7551:88;;7367:278;7305:340;;;;:::o;7651:834::-;7739:6;7747;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7950:1;7939:9;7935:17;7922:31;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8107:63;8162:7;8153:6;8142:9;8138:22;8107:63;:::i;:::-;8097:73;;7893:287;8247:2;8236:9;8232:18;8219:32;8278:18;8270:6;8267:30;8264:117;;;8300:79;;:::i;:::-;8264:117;8405:63;8460:7;8451:6;8440:9;8436:22;8405:63;:::i;:::-;8395:73;;8190:288;7651:834;;;;;:::o;8491:116::-;8561:21;8576:5;8561:21;:::i;:::-;8554:5;8551:32;8541:60;;8597:1;8594;8587:12;8541:60;8491:116;:::o;8613:133::-;8656:5;8694:6;8681:20;8672:29;;8710:30;8734:5;8710:30;:::i;:::-;8613:133;;;;:::o;8752:468::-;8817:6;8825;8874:2;8862:9;8853:7;8849:23;8845:32;8842:119;;;8880:79;;:::i;:::-;8842:119;9000:1;9025:53;9070:7;9061:6;9050:9;9046:22;9025:53;:::i;:::-;9015:63;;8971:117;9127:2;9153:50;9195:7;9186:6;9175:9;9171:22;9153:50;:::i;:::-;9143:60;;9098:115;8752:468;;;;;:::o;9226:329::-;9285:6;9334:2;9322:9;9313:7;9309:23;9305:32;9302:119;;;9340:79;;:::i;:::-;9302:119;9460:1;9485:53;9530:7;9521:6;9510:9;9506:22;9485:53;:::i;:::-;9475:63;;9431:117;9226:329;;;;:::o;9561:114::-;9628:6;9662:5;9656:12;9646:22;;9561:114;;;:::o;9681:184::-;9780:11;9814:6;9809:3;9802:19;9854:4;9849:3;9845:14;9830:29;;9681:184;;;;:::o;9871:132::-;9938:4;9961:3;9953:11;;9991:4;9986:3;9982:14;9974:22;;9871:132;;;:::o;10009:108::-;10086:24;10104:5;10086:24;:::i;:::-;10081:3;10074:37;10009:108;;:::o;10123:179::-;10192:10;10213:46;10255:3;10247:6;10213:46;:::i;:::-;10291:4;10286:3;10282:14;10268:28;;10123:179;;;;:::o;10308:113::-;10378:4;10410;10405:3;10401:14;10393:22;;10308:113;;;:::o;10457:732::-;10576:3;10605:54;10653:5;10605:54;:::i;:::-;10675:86;10754:6;10749:3;10675:86;:::i;:::-;10668:93;;10785:56;10835:5;10785:56;:::i;:::-;10864:7;10895:1;10880:284;10905:6;10902:1;10899:13;10880:284;;;10981:6;10975:13;11008:63;11067:3;11052:13;11008:63;:::i;:::-;11001:70;;11094:60;11147:6;11094:60;:::i;:::-;11084:70;;10940:224;10927:1;10924;10920:9;10915:14;;10880:284;;;10884:14;11180:3;11173:10;;10581:608;;;10457:732;;;;:::o;11195:373::-;11338:4;11376:2;11365:9;11361:18;11353:26;;11425:9;11419:4;11415:20;11411:1;11400:9;11396:17;11389:47;11453:108;11556:4;11547:6;11453:108;:::i;:::-;11445:116;;11195:373;;;;:::o;11574:117::-;11683:1;11680;11673:12;11697:117;11806:1;11803;11796:12;11833:552;11890:8;11900:6;11950:3;11943:4;11935:6;11931:17;11927:27;11917:122;;11958:79;;:::i;:::-;11917:122;12071:6;12058:20;12048:30;;12101:18;12093:6;12090:30;12087:117;;;12123:79;;:::i;:::-;12087:117;12237:4;12229:6;12225:17;12213:29;;12291:3;12283:4;12275:6;12271:17;12261:8;12257:32;12254:41;12251:128;;;12298:79;;:::i;:::-;12251:128;11833:552;;;;;:::o;12391:963::-;12488:6;12496;12504;12512;12520;12569:3;12557:9;12548:7;12544:23;12540:33;12537:120;;;12576:79;;:::i;:::-;12537:120;12696:1;12721:53;12766:7;12757:6;12746:9;12742:22;12721:53;:::i;:::-;12711:63;;12667:117;12823:2;12849:53;12894:7;12885:6;12874:9;12870:22;12849:53;:::i;:::-;12839:63;;12794:118;12951:2;12977:53;13022:7;13013:6;13002:9;12998:22;12977:53;:::i;:::-;12967:63;;12922:118;13107:2;13096:9;13092:18;13079:32;13138:18;13130:6;13127:30;13124:117;;;13160:79;;:::i;:::-;13124:117;13273:64;13329:7;13320:6;13309:9;13305:22;13273:64;:::i;:::-;13255:82;;;;13050:297;12391:963;;;;;;;;:::o;13360:474::-;13428:6;13436;13485:2;13473:9;13464:7;13460:23;13456:32;13453:119;;;13491:79;;:::i;:::-;13453:119;13611:1;13636:53;13681:7;13672:6;13661:9;13657:22;13636:53;:::i;:::-;13626:63;;13582:117;13738:2;13764:53;13809:7;13800:6;13789:9;13785:22;13764:53;:::i;:::-;13754:63;;13709:118;13360:474;;;;;:::o;13840:509::-;13909:6;13958:2;13946:9;13937:7;13933:23;13929:32;13926:119;;;13964:79;;:::i;:::-;13926:119;14112:1;14101:9;14097:17;14084:31;14142:18;14134:6;14131:30;14128:117;;;14164:79;;:::i;:::-;14128:117;14269:63;14324:7;14315:6;14304:9;14300:22;14269:63;:::i;:::-;14259:73;;14055:287;13840:509;;;;:::o;14355:180::-;14403:77;14400:1;14393:88;14500:4;14497:1;14490:15;14524:4;14521:1;14514:15;14541:320;14585:6;14622:1;14616:4;14612:12;14602:22;;14669:1;14663:4;14659:12;14690:18;14680:81;;14746:4;14738:6;14734:17;14724:27;;14680:81;14808:2;14800:6;14797:14;14777:18;14774:38;14771:84;;14827:18;;:::i;:::-;14771:84;14592:269;14541:320;;;:::o;14867:180::-;14915:77;14912:1;14905:88;15012:4;15009:1;15002:15;15036:4;15033:1;15026:15;15053:194;15093:4;15113:20;15131:1;15113:20;:::i;:::-;15108:25;;15147:20;15165:1;15147:20;:::i;:::-;15142:25;;15191:1;15188;15184:9;15176:17;;15215:1;15209:4;15206:11;15203:37;;;15220:18;;:::i;:::-;15203:37;15053:194;;;;:::o;15253:180::-;15301:77;15298:1;15291:88;15398:4;15395:1;15388:15;15422:4;15419:1;15412:15;15439:180;15487:77;15484:1;15477:88;15584:4;15581:1;15574:15;15608:4;15605:1;15598:15;15625:168;15708:11;15742:6;15737:3;15730:19;15782:4;15777:3;15773:14;15758:29;;15625:168;;;;:::o;15799:114::-;;:::o;15919:362::-;16060:3;16081:65;16144:1;16139:3;16081:65;:::i;:::-;16074:72;;16155:93;16244:3;16155:93;:::i;:::-;16273:1;16268:3;16264:11;16257:18;;15919:362;;;:::o;16287:748::-;16536:4;16574:3;16563:9;16559:19;16551:27;;16588:71;16656:1;16645:9;16641:17;16632:6;16588:71;:::i;:::-;16669:72;16737:2;16726:9;16722:18;16713:6;16669:72;:::i;:::-;16751;16819:2;16808:9;16804:18;16795:6;16751:72;:::i;:::-;16870:9;16864:4;16860:20;16855:2;16844:9;16840:18;16833:48;16898:130;17023:4;16898:130;:::i;:::-;16890:138;;16287:748;;;;;;:::o;17041:149::-;17077:7;17117:66;17110:5;17106:78;17095:89;;17041:149;;;:::o;17196:120::-;17268:23;17285:5;17268:23;:::i;:::-;17261:5;17258:34;17248:62;;17306:1;17303;17296:12;17248:62;17196:120;:::o;17322:141::-;17378:5;17409:6;17403:13;17394:22;;17425:32;17451:5;17425:32;:::i;:::-;17322:141;;;;:::o;17469:349::-;17538:6;17587:2;17575:9;17566:7;17562:23;17558:32;17555:119;;;17593:79;;:::i;:::-;17555:119;17713:1;17738:63;17793:7;17784:6;17773:9;17769:22;17738:63;:::i;:::-;17728:73;;17684:127;17469:349;;;;:::o;17824:141::-;17873:4;17896:3;17888:11;;17919:3;17916:1;17909:14;17953:4;17950:1;17940:18;17932:26;;17824:141;;;:::o;17971:93::-;18008:6;18055:2;18050;18043:5;18039:14;18035:23;18025:33;;17971:93;;;:::o;18070:107::-;18114:8;18164:5;18158:4;18154:16;18133:37;;18070:107;;;;:::o;18183:393::-;18252:6;18302:1;18290:10;18286:18;18325:97;18355:66;18344:9;18325:97;:::i;:::-;18443:39;18473:8;18462:9;18443:39;:::i;:::-;18431:51;;18515:4;18511:9;18504:5;18500:21;18491:30;;18564:4;18554:8;18550:19;18543:5;18540:30;18530:40;;18259:317;;18183:393;;;;;:::o;18582:60::-;18610:3;18631:5;18624:12;;18582:60;;;:::o;18648:142::-;18698:9;18731:53;18749:34;18758:24;18776:5;18758:24;:::i;:::-;18749:34;:::i;:::-;18731:53;:::i;:::-;18718:66;;18648:142;;;:::o;18796:75::-;18839:3;18860:5;18853:12;;18796:75;;;:::o;18877:269::-;18987:39;19018:7;18987:39;:::i;:::-;19048:91;19097:41;19121:16;19097:41;:::i;:::-;19089:6;19082:4;19076:11;19048:91;:::i;:::-;19042:4;19035:105;18953:193;18877:269;;;:::o;19152:73::-;19197:3;19152:73;:::o;19231:189::-;19308:32;;:::i;:::-;19349:65;19407:6;19399;19393:4;19349:65;:::i;:::-;19284:136;19231:189;;:::o;19426:186::-;19486:120;19503:3;19496:5;19493:14;19486:120;;;19557:39;19594:1;19587:5;19557:39;:::i;:::-;19530:1;19523:5;19519:13;19510:22;;19486:120;;;19426:186;;:::o;19618:543::-;19719:2;19714:3;19711:11;19708:446;;;19753:38;19785:5;19753:38;:::i;:::-;19837:29;19855:10;19837:29;:::i;:::-;19827:8;19823:44;20020:2;20008:10;20005:18;20002:49;;;20041:8;20026:23;;20002:49;20064:80;20120:22;20138:3;20120:22;:::i;:::-;20110:8;20106:37;20093:11;20064:80;:::i;:::-;19723:431;;19708:446;19618:543;;;:::o;20167:117::-;20221:8;20271:5;20265:4;20261:16;20240:37;;20167:117;;;;:::o;20290:169::-;20334:6;20367:51;20415:1;20411:6;20403:5;20400:1;20396:13;20367:51;:::i;:::-;20363:56;20448:4;20442;20438:15;20428:25;;20341:118;20290:169;;;;:::o;20464:295::-;20540:4;20686:29;20711:3;20705:4;20686:29;:::i;:::-;20678:37;;20748:3;20745:1;20741:11;20735:4;20732:21;20724:29;;20464:295;;;;:::o;20764:1395::-;20881:37;20914:3;20881:37;:::i;:::-;20983:18;20975:6;20972:30;20969:56;;;21005:18;;:::i;:::-;20969:56;21049:38;21081:4;21075:11;21049:38;:::i;:::-;21134:67;21194:6;21186;21180:4;21134:67;:::i;:::-;21228:1;21252:4;21239:17;;21284:2;21276:6;21273:14;21301:1;21296:618;;;;21958:1;21975:6;21972:77;;;22024:9;22019:3;22015:19;22009:26;22000:35;;21972:77;22075:67;22135:6;22128:5;22075:67;:::i;:::-;22069:4;22062:81;21931:222;21266:887;;21296:618;21348:4;21344:9;21336:6;21332:22;21382:37;21414:4;21382:37;:::i;:::-;21441:1;21455:208;21469:7;21466:1;21463:14;21455:208;;;21548:9;21543:3;21539:19;21533:26;21525:6;21518:42;21599:1;21591:6;21587:14;21577:24;;21646:2;21635:9;21631:18;21618:31;;21492:4;21489:1;21485:12;21480:17;;21455:208;;;21691:6;21682:7;21679:19;21676:179;;;21749:9;21744:3;21740:19;21734:26;21792:48;21834:4;21826:6;21822:17;21811:9;21792:48;:::i;:::-;21784:6;21777:64;21699:156;21676:179;21901:1;21897;21889:6;21885:14;21881:22;21875:4;21868:36;21303:611;;;21266:887;;20856:1303;;;20764:1395;;:::o;22187:314::-;22283:3;22304:70;22367:6;22362:3;22304:70;:::i;:::-;22297:77;;22384:56;22433:6;22428:3;22421:5;22384:56;:::i;:::-;22465:29;22487:6;22465:29;:::i;:::-;22460:3;22456:39;22449:46;;22187:314;;;;;:::o;22507:660::-;22712:4;22750:3;22739:9;22735:19;22727:27;;22764:71;22832:1;22821:9;22817:17;22808:6;22764:71;:::i;:::-;22845:72;22913:2;22902:9;22898:18;22889:6;22845:72;:::i;:::-;22927;22995:2;22984:9;22980:18;22971:6;22927:72;:::i;:::-;23046:9;23040:4;23036:20;23031:2;23020:9;23016:18;23009:48;23074:86;23155:4;23146:6;23138;23074:86;:::i;:::-;23066:94;;22507:660;;;;;;;;:::o;23173:148::-;23275:11;23312:3;23297:18;;23173:148;;;;:::o;23351:874::-;23454:3;23491:5;23485:12;23520:36;23546:9;23520:36;:::i;:::-;23572:89;23654:6;23649:3;23572:89;:::i;:::-;23565:96;;23692:1;23681:9;23677:17;23708:1;23703:166;;;;23883:1;23878:341;;;;23670:549;;23703:166;23787:4;23783:9;23772;23768:25;23763:3;23756:38;23849:6;23842:14;23835:22;23827:6;23823:35;23818:3;23814:45;23807:52;;23703:166;;23878:341;23945:38;23977:5;23945:38;:::i;:::-;24005:1;24019:154;24033:6;24030:1;24027:13;24019:154;;;24107:7;24101:14;24097:1;24092:3;24088:11;24081:35;24157:1;24148:7;24144:15;24133:26;;24055:4;24052:1;24048:12;24043:17;;24019:154;;;24202:6;24197:3;24193:16;24186:23;;23885:334;;23670:549;;23458:767;;23351:874;;;;:::o;24231:390::-;24337:3;24365:39;24398:5;24365:39;:::i;:::-;24420:89;24502:6;24497:3;24420:89;:::i;:::-;24413:96;;24518:65;24576:6;24571:3;24564:4;24557:5;24553:16;24518:65;:::i;:::-;24608:6;24603:3;24599:16;24592:23;;24341:280;24231:390;;;;:::o;24627:429::-;24804:3;24826:92;24914:3;24905:6;24826:92;:::i;:::-;24819:99;;24935:95;25026:3;25017:6;24935:95;:::i;:::-;24928:102;;25047:3;25040:10;;24627:429;;;;;:::o;25062:275::-;25194:3;25216:95;25307:3;25298:6;25216:95;:::i;:::-;25209:102;;25328:3;25321:10;;25062:275;;;;:::o;25343:102::-;25385:8;25432:5;25429:1;25425:13;25404:34;;25343:102;;;:::o;25451:848::-;25512:5;25519:4;25543:6;25534:15;;25567:5;25558:14;;25581:712;25602:1;25592:8;25589:15;25581:712;;;25697:4;25692:3;25688:14;25682:4;25679:24;25676:50;;;25706:18;;:::i;:::-;25676:50;25756:1;25746:8;25742:16;25739:451;;;26171:4;26164:5;26160:16;26151:25;;25739:451;26221:4;26215;26211:15;26203:23;;26251:32;26274:8;26251:32;:::i;:::-;26239:44;;25581:712;;;25451:848;;;;;;;:::o;26305:1073::-;26359:5;26550:8;26540:40;;26571:1;26562:10;;26573:5;;26540:40;26599:4;26589:36;;26616:1;26607:10;;26618:5;;26589:36;26685:4;26733:1;26728:27;;;;26769:1;26764:191;;;;26678:277;;26728:27;26746:1;26737:10;;26748:5;;;26764:191;26809:3;26799:8;26796:17;26793:43;;;26816:18;;:::i;:::-;26793:43;26865:8;26862:1;26858:16;26849:25;;26900:3;26893:5;26890:14;26887:40;;;26907:18;;:::i;:::-;26887:40;26940:5;;;26678:277;;27064:2;27054:8;27051:16;27045:3;27039:4;27036:13;27032:36;27014:2;27004:8;27001:16;26996:2;26990:4;26987:12;26983:35;26967:111;26964:246;;;27120:8;27114:4;27110:19;27101:28;;27155:3;27148:5;27145:14;27142:40;;;27162:18;;:::i;:::-;27142:40;27195:5;;26964:246;27235:42;27273:3;27263:8;27257:4;27254:1;27235:42;:::i;:::-;27220:57;;;;27309:4;27304:3;27300:14;27293:5;27290:25;27287:51;;;27318:18;;:::i;:::-;27287:51;27367:4;27360:5;27356:16;27347:25;;26305:1073;;;;;;:::o;27384:281::-;27442:5;27466:23;27484:4;27466:23;:::i;:::-;27458:31;;27510:25;27526:8;27510:25;:::i;:::-;27498:37;;27554:104;27591:66;27581:8;27575:4;27554:104;:::i;:::-;27545:113;;27384:281;;;;:::o;27671:180::-;27719:77;27716:1;27709:88;27816:4;27813:1;27806:15;27840:4;27837:1;27830:15;27857:185;27897:1;27914:20;27932:1;27914:20;:::i;:::-;27909:25;;27948:20;27966:1;27948:20;:::i;:::-;27943:25;;27987:1;27977:35;;27992:18;;:::i;:::-;27977:35;28034:1;28031;28027:9;28022:14;;27857:185;;;;:::o;28048:233::-;28087:3;28110:24;28128:5;28110:24;:::i;:::-;28101:33;;28156:66;28149:5;28146:77;28143:103;;28226:18;;:::i;:::-;28143:103;28273:1;28266:5;28262:13;28255:20;;28048:233;;;:::o;28287:79::-;28326:7;28355:5;28344:16;;28287:79;;;:::o;28372:157::-;28477:45;28497:24;28515:5;28497:24;:::i;:::-;28477:45;:::i;:::-;28472:3;28465:58;28372:157;;:::o;28535:94::-;28568:8;28616:5;28612:2;28608:14;28587:35;;28535:94;;;:::o;28635:::-;28674:7;28703:20;28717:5;28703:20;:::i;:::-;28692:31;;28635:94;;;:::o;28735:100::-;28774:7;28803:26;28823:5;28803:26;:::i;:::-;28792:37;;28735:100;;;:::o;28841:157::-;28946:45;28966:24;28984:5;28966:24;:::i;:::-;28946:45;:::i;:::-;28941:3;28934:58;28841:157;;:::o;29004:538::-;29172:3;29187:75;29258:3;29249:6;29187:75;:::i;:::-;29287:2;29282:3;29278:12;29271:19;;29300:75;29371:3;29362:6;29300:75;:::i;:::-;29400:2;29395:3;29391:12;29384:19;;29413:75;29484:3;29475:6;29413:75;:::i;:::-;29513:2;29508:3;29504:12;29497:19;;29533:3;29526:10;;29004:538;;;;;;:::o;29548:176::-;29580:1;29597:20;29615:1;29597:20;:::i;:::-;29592:25;;29631:20;29649:1;29631:20;:::i;:::-;29626:25;;29670:1;29660:35;;29675:18;;:::i;:::-;29660:35;29716:1;29713;29709:9;29704:14;;29548:176;;;;:::o

Swarm Source

ipfs://e7c14b00994446ec62b61b2049d40395c79919a338bc19d5f06a2f823ff899d8
Loading...
Loading
Loading...
Loading
[ 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.