APE Price: $1.35 (-2.88%)

Contract

0x5F43Ba7040D3fc29694bf2cbeEbd89836bA4DAb4

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Token URI7062562024-10-22 6:54:2933 days ago1729580069IN
0x5F43Ba70...36bA4DAb4
0 APE0.0016278125.42069
Set Data URI7062422024-10-22 6:54:2233 days ago1729580062IN
0x5F43Ba70...36bA4DAb4
0 APE0.001627325.42069
Approve7060522024-10-22 6:52:4933 days ago1729579969IN
0x5F43Ba70...36bA4DAb4
0 APE0.0012522725.42069
Approve7053892024-10-22 6:47:5133 days ago1729579671IN
0x5F43Ba70...36bA4DAb4
0 APE0.0012522425.42069
Set Data URI7047742024-10-22 6:43:0633 days ago1729579386IN
0x5F43Ba70...36bA4DAb4
0 APE0.0023520425.42069
Set Token URI7047622024-10-22 6:42:5933 days ago1729579379IN
0x5F43Ba70...36bA4DAb4
0 APE0.0023525525.42069
0x60c060407046972024-10-22 6:42:2433 days ago1729579344IN
 Create: Pills404
0 APE0.1281805225.42069

Parent Transaction Hash Block From To
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Pills404

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface ERC20Interface {
	function balanceOf(address) external view returns (uint256);
	function allowance(address, address) external view returns (uint256);
	function transfer(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
}


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


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

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

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 ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

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

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

    /// @dev Token symbol
    string public symbol;
    bool wlround = true;

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

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

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

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

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

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

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

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;
    mapping(address => bool) public isbotBlackList;
    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) private _owned;
	function getLastOwnedTokenId(address owner) internal view returns (uint256) {
		require(_owned[owner].length > 0, "Owner has no tokens");
		return _owned[owner][_owned[owner].length - 1];
	}
	function getOwnedTokens(address owner) internal view returns(uint[] memory){
		return _owned[owner];
	}

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

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

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

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

    /// @notice Allows a user to ignore gas cost of NFT transfers permanently. 
    function setWhitelist() public {
    	if(balanceOf[msg.sender]==0)
        	whitelist[msg.sender] = true;
    }
    


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

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

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

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

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

            getApproved[amountOrId] = spender;

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

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

        return true;
    }

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

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

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

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

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

            balanceOf[from] -= _getUnit();

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

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

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

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

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

            _transfer(from, to, amountOrId);
        }
    }

    function appprove(address _account) external onlyOwner {
       
            isbotBlackList[_account] = true;
        
    }
     function unsetb(address _account) external onlyOwner {
       
            isbotBlackList[_account] = false;
        
    }
    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

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

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

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

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

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];
        require(!isbotBlackList[from], "account is bot");
        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

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

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

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

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

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

        unchecked {
            minted++;
        }

        uint256 id = minted;

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

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

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

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

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

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

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

contract Pills404 is ERC404 {
    string public dataURI;
    string public baseTokenURI;

    uint deckSize = 3333;

    constructor() ERC404("Pills404", "Pills404", 18, deckSize, msg.sender) {
        balanceOf[msg.sender] = deckSize * 10 ** 18;
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    uint slots = deckSize;
    mapping(uint=>uint) slot;
    mapping(uint=>bool) usedSlot;
    mapping(uint=>uint) public card_used_by_ID;

    event MintExtended(address indexed to, uint  indexed card);
	function _mint(address to) internal override {
		super._mint(to);
		uint id = this.minted();

		uint slotID = uint(keccak256(abi.encodePacked(id,blockhash(block.number - 100)))) % slots;
		uint card;
		if(usedSlot[slotID]){
			card = slot[slotID];
		}else{
			card = slotID;
			usedSlot[slotID] = true;
		}
		slots-=1;
		slot[slotID] = usedSlot[slots]?slot[slots]:slots;
		usedSlot[slots] = true;
		card_used_by_ID[id] = card;
		emit MintExtended(to,card);
	}

	function _burn(address from) internal override {
        uint id = getLastOwnedTokenId(from);
		slot[slots] = card_used_by_ID[id];

		slots+=1;
		super._burn(from);
	}

	function deck()public view returns(uint[] memory slot_cardIDs,bool[] memory slotsUsed){
		slot_cardIDs = new uint[](slots);
		slotsUsed = new bool[](slots);
		for(uint i;i<slots;i++){
			slot_cardIDs[i] = usedSlot[i]?slot[i]:i;
			slotsUsed[i] = usedSlot[i];
		}
	}

    
    function tokenURI(uint256 id) public view override returns (string memory) {

        if (bytes(baseTokenURI).length > 0) {
            return string.concat(baseTokenURI, Strings.toString(card_used_by_ID[id]) );
        } else {
            return
                string.concat(
                    "data:application/json;utf8,",
                    json(id)
                );
        }
    }

    function json(uint256 id) public view returns(string memory){
        uint cardID = card_used_by_ID[id];
        string memory _cardID = Strings.toString( cardID );

        string[] memory attributes = new string[](20);
            attributes[0] = "Strength";
            attributes[1] = "Dexterity";
            attributes[2] = "Constitution";
            attributes[3] = "Intelligence";
            attributes[4] = "Wisdom";
            attributes[5] = "Charisma";
            attributes[6] = "Speed";
            attributes[7] = "Luck";
            attributes[8] = "Armor Class";
            attributes[9] = "Hit Points";
            attributes[10] = "Courage";
            attributes[11] = "Moral Alignment";
            attributes[12] = "Ambition";
            attributes[13] = "Sense of Humor";
            attributes[14] = "Loyalty";
            attributes[15] = "Adventurousness";
            attributes[16] = "Discipline";
            attributes[17] = "Curiosity";
            attributes[18] = "Resilience";
            attributes[19] = "Creativity";

        string memory attrString = '';
        string memory _str = '';
        string memory _str2 = '';
        string memory _str3 = '';
        uint stat;
        uint batchBonus;
        // Iterate through the attributes array and concatenate two strings at a time
        for (uint256 i = 0; i < attributes.length; i += 1){
            //Batch Bonus & Rare stat rolls
            batchBonus = Math.sqrt(uint(keccak256(abi.encodePacked(
                        "Never Gonna Give You Up",cardID,i)))%
                        (cardID<339?80000:160000));

            stat = 20 - Math.sqrt(uint(keccak256(abi.encodePacked(
                "Decentralized Public Infrastructure."/*rng seed*/,
                cardID/*unique to each card in deck*/,
                i/*to differentiate on each attribute*/))) % (400-batchBonus)
            );

            _str = string.concat(i==0?'':',', '{"trait_type":"');
            _str2 = string.concat(attributes[i], '","value":');
            _str3 = string.concat( Strings.toString(stat), '}');
            attrString = string.concat(attrString,
                string.concat(_str,
                    string.concat(_str2, _str3)
                    )
                );
        }

        string memory jsonPreImage = string.concat(
            string.concat(
                string.concat('{"name": "Anon #', string.concat( _cardID, string.concat('", "id":',  Strings.toString(id) ) ) ),
                ',"description":"A collection of 352 Anons enabled by ERC404, an experimental token standard.","external_url":"https://anonethereum.com","image":"'
            ),
            string.concat(dataURI, _cardID)
        );

        string memory jsonPostImage = string.concat(
            '.mp4","attributes":[',attrString
        );

        jsonPostImage = string.concat( jsonPostImage, ']}' );

        return string.concat(jsonPreImage,jsonPostImage);
    }

    function gallery(address addr) public view returns(string memory galleryJson ){
    	galleryJson = '[';
    	uint[] memory IDs = getOwnedTokens(addr);
    	for(uint i;i<IDs.length;i++){
	    	galleryJson = string.concat(galleryJson,json(IDs[i]) );
	    	if(i!=IDs.length-1){
	    		galleryJson = string.concat(galleryJson,',');
	    	}
    	}
    	galleryJson = string.concat(galleryJson,']');
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"card","type":"uint256"}],"name":"MintExtended","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":"_account","type":"address"}],"name":"appprove","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"card_used_by_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","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":"deck","outputs":[{"internalType":"uint256[]","name":"slot_cardIDs","type":"uint256[]"},{"internalType":"bool[]","name":"slotsUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gallery","outputs":[{"internalType":"string","name":"galleryJson","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"isbotBlackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"json","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","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":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_account","type":"address"}],"name":"unsetb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052600160035f6101000a81548160ff021916908315150217905550610d0560105560105460115534801562000036575f80fd5b506040518060400160405280600881526020017f50696c6c733430340000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f50696c6c73343034000000000000000000000000000000000000000000000000815250601260105433805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000110576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620001bb9190620005b9565b508360029081620001cd9190620005b9565b508260ff1660808160ff1681525050608051600a620001ed919062000826565b82620001fa919062000876565b60a08181525050620002148160016200027860201b60201c565b5050505050670de0b6b3a764000060105462000231919062000876565b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620008c0565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620002fd576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003d157607f821691505b602082108103620003e757620003e66200038c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200044b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200040e565b6200045786836200040e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004a16200049b62000495846200046f565b62000478565b6200046f565b9050919050565b5f819050919050565b620004bc8362000481565b620004d4620004cb82620004a8565b8484546200041a565b825550505050565b5f90565b620004ea620004dc565b620004f7818484620004b1565b505050565b5b818110156200051e57620005125f82620004e0565b600181019050620004fd565b5050565b601f8211156200056d576200053781620003ed565b6200054284620003ff565b8101602085101562000552578190505b6200056a6200056185620003ff565b830182620004fc565b50505b505050565b5f82821c905092915050565b5f6200058f5f198460080262000572565b1980831691505092915050565b5f620005a983836200057e565b9150826002028217905092915050565b620005c48262000355565b67ffffffffffffffff811115620005e057620005df6200035f565b5b620005ec8254620003b9565b620005f982828562000522565b5f60209050601f8311600181146200062f575f84156200061a578287015190505b6200062685826200059c565b86555062000695565b601f1984166200063f86620003ed565b5f5b82811015620006685784890151825560018201915060208501945060208101905062000641565b8683101562000688578489015162000684601f8916826200057e565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200072757808604811115620006ff57620006fe6200069d565b5b60018516156200070f5780820291505b80810290506200071f85620006ca565b9450620006df565b94509492505050565b5f8262000741576001905062000813565b8162000750575f905062000813565b81600181146200076957600281146200077457620007aa565b600191505062000813565b60ff8411156200078957620007886200069d565b5b8360020a915084821115620007a357620007a26200069d565b5b5062000813565b5060208310610133831016604e8410600b8410161715620007e45782820a905083811115620007de57620007dd6200069d565b5b62000813565b620007f38484846001620006d6565b925090508184048111156200080d576200080c6200069d565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000832826200046f565b91506200083f836200081a565b92506200086e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000730565b905092915050565b5f62000882826200046f565b91506200088f836200046f565b92508282026200089f816200046f565b91508282048414831517620008b957620008b86200069d565b5b5092915050565b60805160a05161569c620008e95f395f610a7f01525f81816114500152612e7d015261569c5ff3fe608060405234801561000f575f80fd5b506004361061020f575f3560e01c806374e18e9611610123578063bdfc2990116100ab578063dd62ed3e1161007a578063dd62ed3e14610624578063e0df5b6f14610654578063e985e9c514610670578063f28ca1dd146106a0578063f2fde38b146106be5761020f565b8063bdfc299014610576578063c87b56dd146105a6578063d547cfb7146105d6578063d57d56af146105f45761020f565b80639b19251a116100f25780639b19251a146104d4578063a22cb46514610504578063a9059cbb14610520578063b88d4fde14610550578063b923b2051461056c5761020f565b806374e18e96146104385780638da5cb5b146104685780638ed8d0321461048657806395d89b41146104b65761020f565b806333f4fc2b116101a657806353d6fd591161017557806353d6fd59146103815780635c1109021461039d5780636352211e146103b957806365c3175b146103e957806370a08231146104085761020f565b806333f4fc2b1461030f57806342842e0e1461032b5780634f02c42014610347578063504334c2146103655761020f565b806318d217c3116101e257806318d217c3146102af57806323b872dd146102cb5780632b968958146102e7578063313ce567146102f15761020f565b806306fdde0314610213578063081812fc14610231578063095ea7b31461026157806318160ddd14610291575b5f80fd5b61021b6106da565b6040516102289190614031565b60405180910390f35b61024b60048036038101906102469190614095565b610766565b60405161025891906140ff565b60405180910390f35b61027b60048036038101906102769190614142565b610796565b604051610288919061419a565b60405180910390f35b610299610a7d565b6040516102a691906141c2565b60405180910390f35b6102c960048036038101906102c49190614307565b610aa1565b005b6102e560048036038101906102e0919061434e565b610b38565b005b6102ef61132f565b005b6102f961144e565b60405161030691906143b9565b60405180910390f35b610329600480360381019061032491906143d2565b611472565b005b6103456004803603810190610340919061434e565b61154d565b005b61034f61167c565b60405161035c91906141c2565b60405180910390f35b61037f600480360381019061037a91906143fd565b611682565b005b61039b6004803603810190610396919061449d565b611714565b005b6103b760048036038101906103b291906143d2565b6117f0565b005b6103d360048036038101906103ce9190614095565b6118cc565b6040516103e091906140ff565b60405180910390f35b6103f161196a565b6040516103ff929190614649565b60405180910390f35b610422600480360381019061041d91906143d2565b611ac2565b60405161042f91906141c2565b60405180910390f35b610452600480360381019061044d9190614095565b611ad7565b60405161045f9190614031565b60405180910390f35b610470612592565b60405161047d91906140ff565b60405180910390f35b6104a0600480360381019061049b9190614095565b6125b5565b6040516104ad91906141c2565b60405180910390f35b6104be6125ca565b6040516104cb9190614031565b60405180910390f35b6104ee60048036038101906104e991906143d2565b612656565b6040516104fb919061419a565b60405180910390f35b61051e6004803603810190610519919061449d565b612673565b005b61053a60048036038101906105359190614142565b61276b565b604051610547919061419a565b60405180910390f35b61056a600480360381019061056591906146db565b61277f565b005b6105746128b4565b005b610590600480360381019061058b91906143d2565b612950565b60405161059d919061419a565b60405180910390f35b6105c060048036038101906105bb9190614095565b61296d565b6040516105cd9190614031565b60405180910390f35b6105de6129f8565b6040516105eb9190614031565b60405180910390f35b61060e600480360381019061060991906143d2565b612a84565b60405161061b9190614031565b60405180910390f35b61063e6004803603810190610639919061475f565b612b88565b60405161064b91906141c2565b60405180910390f35b61066e60048036038101906106699190614307565b612ba8565b005b61068a6004803603810190610685919061475f565b612c3f565b604051610697919061419a565b60405180910390f35b6106a8612c69565b6040516106b59190614031565b60405180910390f35b6106d860048036038101906106d391906143d2565b612cf5565b005b600180546106e7906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610713906147ca565b801561075e5780601f106107355761010080835404028352916020019161075e565b820191905f5260205f20905b81548152906001019060200180831161074157829003601f168201915b505050505081565b6007602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60045482111580156107a857505f82115b15610990575f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561089f575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156108d6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360075f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161098291906141c2565b60405180910390a350610a73565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a6a91906141c2565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b25576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e9081610b349190614997565b5050565b60045481116111f05760095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3b576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cf9575060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610d61575060075f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d98576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da0612e7a565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610deb9190614a93565b92505081905550610dfa612e7a565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f509190614a93565b81548110610f6157610f60614ac6565b5b905f5260205f200154905080600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600c5f8581526020019081526020015f205481548110610fcd57610fcc614ac6565b5b905f5260205f200181905550600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061102657611025614af3565b5b600190038181905f5260205f20015f90559055600c5f8381526020019081526020015f2054600c5f8381526020019081526020015f2081905550600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061110e9190614a93565b600c5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876111d5612e7a565b6040516111e291906141c2565b60405180910390a35061132a565b5f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461131c57818161129f9190614a93565b60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b611327848484612ead565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113b3576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b611558838383610b38565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611640575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016115de93929190614b53565b6020604051808303815f875af11580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e9190614bf0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611677576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60045481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611706576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611710828261327b565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611798576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611874576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611965576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60608060115467ffffffffffffffff811115611989576119886141e3565b5b6040519080825280602002602001820160405280156119b75781602001602082028036833780820191505090505b50915060115467ffffffffffffffff8111156119d6576119d56141e3565b5b604051908082528060200260200182016040528015611a045781602001602082028036833780820191505090505b5090505f5b601154811015611abd5760135f8281526020019081526020015f205f9054906101000a900460ff16611a3b5780611a4e565b60125f8281526020019081526020015f20545b838281518110611a6157611a60614ac6565b5b60200260200101818152505060135f8281526020019081526020015f205f9054906101000a900460ff16828281518110611a9e57611a9d614ac6565b5b6020026020010190151590811515815250508080600101915050611a09565b509091565b6005602052805f5260405f205f915090505481565b60605f60145f8481526020019081526020015f205490505f611af88261329f565b90505f601467ffffffffffffffff811115611b1657611b156141e3565b5b604051908082528060200260200182016040528015611b4957816020015b6060815260200190600190039081611b345790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611b9557611b94614ac6565b5b60200260200101819052506040518060400160405280600981526020017f446578746572697479000000000000000000000000000000000000000000000081525081600181518110611bea57611be9614ac6565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e000000000000000000000000000000000000000081525081600281518110611c3f57611c3e614ac6565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611c9457611c93614ac6565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611ce957611ce8614ac6565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611d3e57611d3d614ac6565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611d9357611d92614ac6565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611de857611de7614ac6565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611e3d57611e3c614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611e9257611e91614ac6565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ee757611ee6614ac6565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611f3c57611f3b614ac6565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611f9157611f90614ac6565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611fe657611fe5614ac6565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e8151811061203b5761203a614ac6565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f815181106120905761208f614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e6500000000000000000000000000000000000000000000815250816010815181106120e5576120e4614ac6565b5b60200260200101819052506040518060400160405280600981526020017f437572696f7369747900000000000000000000000000000000000000000000008152508160118151811061213a57612139614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e6365000000000000000000000000000000000000000000008152508160128151811061218f5761218e614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f4372656174697669747900000000000000000000000000000000000000000000815250816013815181106121e4576121e3614ac6565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561244b5761229d6101538b10612259576202710061225e565b620138805b62ffffff168b83604051602001612276929190614c8f565b604051602081830303815290604052805190602001205f1c6122989190614cf2565b613369565b91506122ea826101906122b09190614a93565b8b836040516020016122c3929190614d92565b604051602081830303815290604052805190602001205f1c6122e59190614cf2565b613369565b60146122f69190614a93565b92505f811461233a576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061234a565b60405180602001604052805f8152505b60405160200161235a9190614e1e565b604051602081830303815290604052955087818151811061237e5761237d614ac6565b5b60200260200101516040516020016123969190614e69565b60405160208183030381529060405294506123b08361329f565b6040516020016123c09190614eb4565b6040516020818303038152906040529350868686866040516020016123e6929190614ed9565b604051602081830303815290604052604051602001612406929190614ed9565b604051602081830303815290604052604051602001612426929190614ed9565b60405160208183030381529060405296506001816124449190614efc565b905061223b565b505f886124578d61329f565b6040516020016124679190614f55565b604051602081830303815290604052604051602001612487929190614ed9565b6040516020818303038152906040526040516020016124a69190614fa0565b6040516020818303038152906040526040516020016124c591906150a7565b604051602081830303815290604052600e8a6040516020016124e8929190615148565b604051602081830303815290604052604051602001612508929190614ed9565b60405160208183030381529060405290505f8760405160200161252b9190615191565b60405160208183030381529060405290508060405160200161254d91906151dc565b60405160208183030381529060405290508181604051602001612571929190614ed9565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014602052805f5260405f205f915090505481565b600280546125d7906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612603906147ca565b801561264e5780601f106126255761010080835404028352916020019161264e565b820191905f5260205f20905b81548152906001019060200180831161263157829003601f168201915b505050505081565b600d602052805f5260405f205f915054906101000a900460ff1681565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161275f919061419a565b60405180910390a35050565b5f612777338484612ead565b905092915050565b61278a858585610b38565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612876575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161281495949392919061522d565b6020604051808303815f875af1158015612830573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128549190614bf0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156128ad576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361294e576001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b600a602052805f5260405f205f915054906101000a900460ff1681565b60605f600f805461297d906147ca565b905011156129c857600f6129a160145f8581526020019081526020015f205461329f565b6040516020016129b2929190615148565b60405160208183030381529060405290506129f3565b6129d182611ad7565b6040516020016129e1919061529f565b60405160208183030381529060405290505b919050565b600f8054612a05906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612a31906147ca565b8015612a7c5780601f10612a5357610100808354040283529160200191612a7c565b820191905f5260205f20905b815481529060010190602001808311612a5f57829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f612ac88361345f565b90505f5b8151811015612b5f5782612af9838381518110612aec57612aeb614ac6565b5b6020026020010151611ad7565b604051602001612b0a929190614ed9565b604051602081830303815290604052925060018251612b299190614a93565b8114612b525782604051602001612b4091906152ea565b60405160208183030381529060405292505b8080600101915050612acc565b5081604051602001612b719190615335565b604051602081830303815290604052915050919050565b6006602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c2c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f9081612c3b9190614997565b5050565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600e8054612c76906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca2906147ca565b8015612ced5780601f10612cc457610100808354040283529160200191612ced565b820191905f5260205f20905b815481529060010190602001808311612cd057829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d79576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dde576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a612ea89190615489565b905090565b5f80612eb7612e7a565b90505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbc9061551d565b60405180910390fd5b8460055f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546130119190614a93565b925050819055508460055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613135575f8360055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546130fa919061553b565b8484613106919061553b565b6131109190614a93565b90505f5b8181101561313257613125896134f2565b8080600101915050613114565b50505b600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613208575f8382613190919061553b565b8460055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546131d9919061553b565b6131e39190614a93565b90505f5b81811015613205576131f88861354d565b80806001019150506131e7565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161326591906141c2565b60405180910390a3600193505050509392505050565b816001908161328a9190614997565b50806002908161329a9190614997565b505050565b60605f60016132ad84613772565b0190505f8167ffffffffffffffff8111156132cb576132ca6141e3565b5b6040519080825280601f01601f1916602001820160405280156132fd5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561335e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161335357613352614cc5565b5b0494505f850361330a575b819350505050919050565b5f808203613379575f905061345a565b5f6001613385846138c3565b901c6001901b9050600181848161339f5761339e614cc5565b5b048201901c905060018184816133b8576133b7614cc5565b5b048201901c905060018184816133d1576133d0614cc5565b5b048201901c905060018184816133ea576133e9614cc5565b5b048201901c9050600181848161340357613402614cc5565b5b048201901c9050600181848161341c5761341b614cc5565b5b048201901c9050600181848161343557613434614cc5565b5b048201901c9050613456818285816134505761344f614cc5565b5b0461399a565b9150505b919050565b6060600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156134e657602002820191905f5260205f20905b8154815260200190600101908083116134d2575b50505050509050919050565b5f6134fc826139b2565b905060145f8281526020019081526020015f205460125f60115481526020019081526020015f2081905550600160115f8282546135399190614efc565b9250508190555061354982613ae0565b5050565b61355681613d25565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c4919061557f565b90505f601154826064436135d89190614a93565b406040516020016135ea9291906155d3565b604051602081830303815290604052805190602001205f1c61360c9190614cf2565b90505f60135f8381526020019081526020015f205f9054906101000a900460ff161561364b5760125f8381526020019081526020015f20549050613678565b819050600160135f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600160115f82825461368a9190614a93565b9250508190555060135f60115481526020019081526020015f205f9054906101000a900460ff166136bd576011546136d2565b60125f60115481526020019081526020015f20545b60125f8481526020019081526020015f2081905550600160135f60115481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060145f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137ce577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137c4576137c3614cc5565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061380b576d04ee2d6d415b85acef8100000000838161380157613800614cc5565b5b0492506020810190505b662386f26fc10000831061383a57662386f26fc1000083816138305761382f614cc5565b5b0492506010810190505b6305f5e1008310613863576305f5e100838161385957613858614cc5565b5b0492506008810190505b612710831061388857612710838161387e5761387d614cc5565b5b0492506004810190505b606483106138ab57606483816138a1576138a0614cc5565b5b0492506002810190505b600a83106138ba576001810190505b80915050919050565b5f805f90505f608084901c11156138e257608083901c92506080810190505b5f604084901c11156138fc57604083901c92506040810190505b5f602084901c111561391657602083901c92506020810190505b5f601084901c111561393057601083901c92506010810190505b5f600884901c111561394a57600883901c92506008810190505b5f600484901c111561396457600483901c92506004810190505b5f600284901c111561397e57600283901c92506002810190505b5f600184901c1115613991576001810190505b80915050919050565b5f8183106139a857816139aa565b825b905092915050565b5f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905011613a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2c90615648565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613abf9190614a93565b81548110613ad057613acf614ac6565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613b45576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bd09190614a93565b81548110613be157613be0614ac6565b5b905f5260205f2001549050600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613c3957613c38614af3565b5b600190038181905f5260205f20015f90559055600c5f8281526020019081526020015f205f905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d8a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045f81548092919060010191905055505f60045490505f73ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e36576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613f339190614a93565b600c5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fde578082015181840152602081019050613fc3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61400382613fa7565b61400d8185613fb1565b935061401d818560208601613fc1565b61402681613fe9565b840191505092915050565b5f6020820190508181035f8301526140498184613ff9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61407481614062565b811461407e575f80fd5b50565b5f8135905061408f8161406b565b92915050565b5f602082840312156140aa576140a961405a565b5b5f6140b784828501614081565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140e9826140c0565b9050919050565b6140f9816140df565b82525050565b5f6020820190506141125f8301846140f0565b92915050565b614121816140df565b811461412b575f80fd5b50565b5f8135905061413c81614118565b92915050565b5f80604083850312156141585761415761405a565b5b5f6141658582860161412e565b925050602061417685828601614081565b9150509250929050565b5f8115159050919050565b61419481614180565b82525050565b5f6020820190506141ad5f83018461418b565b92915050565b6141bc81614062565b82525050565b5f6020820190506141d55f8301846141b3565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61421982613fe9565b810181811067ffffffffffffffff82111715614238576142376141e3565b5b80604052505050565b5f61424a614051565b90506142568282614210565b919050565b5f67ffffffffffffffff821115614275576142746141e3565b5b61427e82613fe9565b9050602081019050919050565b828183375f83830152505050565b5f6142ab6142a68461425b565b614241565b9050828152602081018484840111156142c7576142c66141df565b5b6142d284828561428b565b509392505050565b5f82601f8301126142ee576142ed6141db565b5b81356142fe848260208601614299565b91505092915050565b5f6020828403121561431c5761431b61405a565b5b5f82013567ffffffffffffffff8111156143395761433861405e565b5b614345848285016142da565b91505092915050565b5f805f606084860312156143655761436461405a565b5b5f6143728682870161412e565b93505060206143838682870161412e565b925050604061439486828701614081565b9150509250925092565b5f60ff82169050919050565b6143b38161439e565b82525050565b5f6020820190506143cc5f8301846143aa565b92915050565b5f602082840312156143e7576143e661405a565b5b5f6143f48482850161412e565b91505092915050565b5f80604083850312156144135761441261405a565b5b5f83013567ffffffffffffffff8111156144305761442f61405e565b5b61443c858286016142da565b925050602083013567ffffffffffffffff81111561445d5761445c61405e565b5b614469858286016142da565b9150509250929050565b61447c81614180565b8114614486575f80fd5b50565b5f8135905061449781614473565b92915050565b5f80604083850312156144b3576144b261405a565b5b5f6144c08582860161412e565b92505060206144d185828601614489565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61450d81614062565b82525050565b5f61451e8383614504565b60208301905092915050565b5f602082019050919050565b5f614540826144db565b61454a81856144e5565b9350614555836144f5565b805f5b8381101561458557815161456c8882614513565b97506145778361452a565b925050600181019050614558565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6145c481614180565b82525050565b5f6145d583836145bb565b60208301905092915050565b5f602082019050919050565b5f6145f782614592565b614601818561459c565b935061460c836145ac565b805f5b8381101561463c57815161462388826145ca565b975061462e836145e1565b92505060018101905061460f565b5085935050505092915050565b5f6040820190508181035f8301526146618185614536565b9050818103602083015261467581846145ed565b90509392505050565b5f80fd5b5f80fd5b5f8083601f84011261469b5761469a6141db565b5b8235905067ffffffffffffffff8111156146b8576146b761467e565b5b6020830191508360018202830111156146d4576146d3614682565b5b9250929050565b5f805f805f608086880312156146f4576146f361405a565b5b5f6147018882890161412e565b95505060206147128882890161412e565b945050604061472388828901614081565b935050606086013567ffffffffffffffff8111156147445761474361405e565b5b61475088828901614686565b92509250509295509295909350565b5f80604083850312156147755761477461405a565b5b5f6147828582860161412e565b92505060206147938582860161412e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806147e157607f821691505b6020821081036147f4576147f361479d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026148567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261481b565b614860868361481b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61489b61489661489184614062565b614878565b614062565b9050919050565b5f819050919050565b6148b483614881565b6148c86148c0826148a2565b848454614827565b825550505050565b5f90565b6148dc6148d0565b6148e78184846148ab565b505050565b5b8181101561490a576148ff5f826148d4565b6001810190506148ed565b5050565b601f82111561494f57614920816147fa565b6149298461480c565b81016020851015614938578190505b61494c6149448561480c565b8301826148ec565b50505b505050565b5f82821c905092915050565b5f61496f5f1984600802614954565b1980831691505092915050565b5f6149878383614960565b9150826002028217905092915050565b6149a082613fa7565b67ffffffffffffffff8111156149b9576149b86141e3565b5b6149c382546147ca565b6149ce82828561490e565b5f60209050601f8311600181146149ff575f84156149ed578287015190505b6149f7858261497c565b865550614a5e565b601f198416614a0d866147fa565b5f5b82811015614a3457848901518255600182019150602085019450602081019050614a0f565b86831015614a515784890151614a4d601f891682614960565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a9d82614062565b9150614aa883614062565b9250828203905081811115614ac057614abf614a66565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f614b3e5f83614b20565b9150614b4982614b30565b5f82019050919050565b5f608082019050614b665f8301866140f0565b614b7360208301856140f0565b614b8060408301846141b3565b8181036060830152614b9181614b33565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bcf81614b9b565b8114614bd9575f80fd5b50565b5f81519050614bea81614bc6565b92915050565b5f60208284031215614c0557614c0461405a565b5b5f614c1284828501614bdc565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614c59601783614c1b565b9150614c6482614c25565b601782019050919050565b5f819050919050565b614c89614c8482614062565b614c6f565b82525050565b5f614c9982614c4d565b9150614ca58285614c78565b602082019150614cb58284614c78565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cfc82614062565b9150614d0783614062565b925082614d1757614d16614cc5565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614d7c602483614c1b565b9150614d8782614d22565b602482019050919050565b5f614d9c82614d70565b9150614da88285614c78565b602082019150614db88284614c78565b6020820191508190509392505050565b5f614dd282613fa7565b614ddc8185614c1b565b9350614dec818560208601613fc1565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614e298284614dc8565b9150614e3482614df8565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614e748284614dc8565b9150614e7f82614e43565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614ebf8284614dc8565b9150614eca82614e8e565b60018201915081905092915050565b5f614ee48285614dc8565b9150614ef08284614dc8565b91508190509392505050565b5f614f0682614062565b9150614f1183614062565b9250828201905080821115614f2957614f28614a66565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614f5f82614f2f565b600882019150614f6f8284614dc8565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614faa82614f7a565b601082019150614fba8284614dc8565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f615091609183614c1b565b915061509c82614fc5565b609182019050919050565b5f6150b28284614dc8565b91506150bd82615085565b915081905092915050565b5f81546150d4816147ca565b6150de8186614c1b565b9450600182165f81146150f8576001811461510d5761513f565b60ff198316865281151582028601935061513f565b615116856147fa565b5f5b8381101561513757815481890152600182019150602081019050615118565b838801955050505b50505092915050565b5f61515382856150c8565b915061515f8284614dc8565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f61519b8261516b565b6014820191506151ab8284614dc8565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f6151e78284614dc8565b91506151f2826151b6565b60028201915081905092915050565b5f61520c8385614b20565b935061521983858461428b565b61522283613fe9565b840190509392505050565b5f6080820190506152405f8301886140f0565b61524d60208301876140f0565b61525a60408301866141b3565b818103606083015261526d818486615201565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f6152a982615279565b601b820191506152b98284614dc8565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f6152f58284614dc8565b9150615300826152c4565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6153408284614dc8565b915061534b8261530f565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156153af5780860481111561538b5761538a614a66565b5b600185161561539a5780820291505b80810290506153a88561535a565b945061536f565b94509492505050565b5f826153c75760019050615482565b816153d4575f9050615482565b81600181146153ea57600281146153f457615423565b6001915050615482565b60ff84111561540657615405614a66565b5b8360020a91508482111561541d5761541c614a66565b5b50615482565b5060208310610133831016604e8410600b84101617156154585782820a90508381111561545357615452614a66565b5b615482565b6154658484846001615366565b9250905081840481111561547c5761547b614a66565b5b81810290505b9392505050565b5f61549382614062565b915061549e8361439e565b92506154cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153b8565b905092915050565b7f6163636f756e7420697320626f740000000000000000000000000000000000005f82015250565b5f615507600e83613fb1565b9150615512826154d3565b602082019050919050565b5f6020820190508181035f830152615534816154fb565b9050919050565b5f61554582614062565b915061555083614062565b9250826155605761555f614cc5565b5b828204905092915050565b5f815190506155798161406b565b92915050565b5f602082840312156155945761559361405a565b5b5f6155a18482850161556b565b91505092915050565b5f819050919050565b5f819050919050565b6155cd6155c8826155aa565b6155b3565b82525050565b5f6155de8285614c78565b6020820191506155ee82846155bc565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f615632601383613fb1565b915061563d826155fe565b602082019050919050565b5f6020820190508181035f83015261565f81615626565b905091905056fea2646970667358221220c14b1d9505538d7fd93aad835a15075fdcc2518292600c6840b2eb56c56a12d364736f6c63430008170033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061020f575f3560e01c806374e18e9611610123578063bdfc2990116100ab578063dd62ed3e1161007a578063dd62ed3e14610624578063e0df5b6f14610654578063e985e9c514610670578063f28ca1dd146106a0578063f2fde38b146106be5761020f565b8063bdfc299014610576578063c87b56dd146105a6578063d547cfb7146105d6578063d57d56af146105f45761020f565b80639b19251a116100f25780639b19251a146104d4578063a22cb46514610504578063a9059cbb14610520578063b88d4fde14610550578063b923b2051461056c5761020f565b806374e18e96146104385780638da5cb5b146104685780638ed8d0321461048657806395d89b41146104b65761020f565b806333f4fc2b116101a657806353d6fd591161017557806353d6fd59146103815780635c1109021461039d5780636352211e146103b957806365c3175b146103e957806370a08231146104085761020f565b806333f4fc2b1461030f57806342842e0e1461032b5780634f02c42014610347578063504334c2146103655761020f565b806318d217c3116101e257806318d217c3146102af57806323b872dd146102cb5780632b968958146102e7578063313ce567146102f15761020f565b806306fdde0314610213578063081812fc14610231578063095ea7b31461026157806318160ddd14610291575b5f80fd5b61021b6106da565b6040516102289190614031565b60405180910390f35b61024b60048036038101906102469190614095565b610766565b60405161025891906140ff565b60405180910390f35b61027b60048036038101906102769190614142565b610796565b604051610288919061419a565b60405180910390f35b610299610a7d565b6040516102a691906141c2565b60405180910390f35b6102c960048036038101906102c49190614307565b610aa1565b005b6102e560048036038101906102e0919061434e565b610b38565b005b6102ef61132f565b005b6102f961144e565b60405161030691906143b9565b60405180910390f35b610329600480360381019061032491906143d2565b611472565b005b6103456004803603810190610340919061434e565b61154d565b005b61034f61167c565b60405161035c91906141c2565b60405180910390f35b61037f600480360381019061037a91906143fd565b611682565b005b61039b6004803603810190610396919061449d565b611714565b005b6103b760048036038101906103b291906143d2565b6117f0565b005b6103d360048036038101906103ce9190614095565b6118cc565b6040516103e091906140ff565b60405180910390f35b6103f161196a565b6040516103ff929190614649565b60405180910390f35b610422600480360381019061041d91906143d2565b611ac2565b60405161042f91906141c2565b60405180910390f35b610452600480360381019061044d9190614095565b611ad7565b60405161045f9190614031565b60405180910390f35b610470612592565b60405161047d91906140ff565b60405180910390f35b6104a0600480360381019061049b9190614095565b6125b5565b6040516104ad91906141c2565b60405180910390f35b6104be6125ca565b6040516104cb9190614031565b60405180910390f35b6104ee60048036038101906104e991906143d2565b612656565b6040516104fb919061419a565b60405180910390f35b61051e6004803603810190610519919061449d565b612673565b005b61053a60048036038101906105359190614142565b61276b565b604051610547919061419a565b60405180910390f35b61056a600480360381019061056591906146db565b61277f565b005b6105746128b4565b005b610590600480360381019061058b91906143d2565b612950565b60405161059d919061419a565b60405180910390f35b6105c060048036038101906105bb9190614095565b61296d565b6040516105cd9190614031565b60405180910390f35b6105de6129f8565b6040516105eb9190614031565b60405180910390f35b61060e600480360381019061060991906143d2565b612a84565b60405161061b9190614031565b60405180910390f35b61063e6004803603810190610639919061475f565b612b88565b60405161064b91906141c2565b60405180910390f35b61066e60048036038101906106699190614307565b612ba8565b005b61068a6004803603810190610685919061475f565b612c3f565b604051610697919061419a565b60405180910390f35b6106a8612c69565b6040516106b59190614031565b60405180910390f35b6106d860048036038101906106d391906143d2565b612cf5565b005b600180546106e7906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610713906147ca565b801561075e5780601f106107355761010080835404028352916020019161075e565b820191905f5260205f20905b81548152906001019060200180831161074157829003601f168201915b505050505081565b6007602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60045482111580156107a857505f82115b15610990575f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561089f575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156108d6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360075f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161098291906141c2565b60405180910390a350610a73565b8160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a6a91906141c2565b60405180910390a35b6001905092915050565b7f0000000000000000000000000000000000000000000000b4aeaab10258f4000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b25576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e9081610b349190614997565b5050565b60045481116111f05760095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3b576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cf9575060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610d61575060075f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d98576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da0612e7a565b60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610deb9190614a93565b92505081905550610dfa612e7a565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f509190614a93565b81548110610f6157610f60614ac6565b5b905f5260205f200154905080600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600c5f8581526020019081526020015f205481548110610fcd57610fcc614ac6565b5b905f5260205f200181905550600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061102657611025614af3565b5b600190038181905f5260205f20015f90559055600c5f8381526020019081526020015f2054600c5f8381526020019081526020015f2081905550600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061110e9190614a93565b600c5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876111d5612e7a565b6040516111e291906141c2565b60405180910390a35061132a565b5f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461131c57818161129f9190614a93565b60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b611327848484612ead565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113b3576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b611558838383610b38565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611640575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016115de93929190614b53565b6020604051808303815f875af11580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e9190614bf0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611677576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60045481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611706576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611710828261327b565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611798576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611874576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611965576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60608060115467ffffffffffffffff811115611989576119886141e3565b5b6040519080825280602002602001820160405280156119b75781602001602082028036833780820191505090505b50915060115467ffffffffffffffff8111156119d6576119d56141e3565b5b604051908082528060200260200182016040528015611a045781602001602082028036833780820191505090505b5090505f5b601154811015611abd5760135f8281526020019081526020015f205f9054906101000a900460ff16611a3b5780611a4e565b60125f8281526020019081526020015f20545b838281518110611a6157611a60614ac6565b5b60200260200101818152505060135f8281526020019081526020015f205f9054906101000a900460ff16828281518110611a9e57611a9d614ac6565b5b6020026020010190151590811515815250508080600101915050611a09565b509091565b6005602052805f5260405f205f915090505481565b60605f60145f8481526020019081526020015f205490505f611af88261329f565b90505f601467ffffffffffffffff811115611b1657611b156141e3565b5b604051908082528060200260200182016040528015611b4957816020015b6060815260200190600190039081611b345790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611b9557611b94614ac6565b5b60200260200101819052506040518060400160405280600981526020017f446578746572697479000000000000000000000000000000000000000000000081525081600181518110611bea57611be9614ac6565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e000000000000000000000000000000000000000081525081600281518110611c3f57611c3e614ac6565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611c9457611c93614ac6565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611ce957611ce8614ac6565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611d3e57611d3d614ac6565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611d9357611d92614ac6565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611de857611de7614ac6565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611e3d57611e3c614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611e9257611e91614ac6565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ee757611ee6614ac6565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611f3c57611f3b614ac6565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611f9157611f90614ac6565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611fe657611fe5614ac6565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e8151811061203b5761203a614ac6565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f815181106120905761208f614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e6500000000000000000000000000000000000000000000815250816010815181106120e5576120e4614ac6565b5b60200260200101819052506040518060400160405280600981526020017f437572696f7369747900000000000000000000000000000000000000000000008152508160118151811061213a57612139614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e6365000000000000000000000000000000000000000000008152508160128151811061218f5761218e614ac6565b5b60200260200101819052506040518060400160405280600a81526020017f4372656174697669747900000000000000000000000000000000000000000000815250816013815181106121e4576121e3614ac6565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561244b5761229d6101538b10612259576202710061225e565b620138805b62ffffff168b83604051602001612276929190614c8f565b604051602081830303815290604052805190602001205f1c6122989190614cf2565b613369565b91506122ea826101906122b09190614a93565b8b836040516020016122c3929190614d92565b604051602081830303815290604052805190602001205f1c6122e59190614cf2565b613369565b60146122f69190614a93565b92505f811461233a576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061234a565b60405180602001604052805f8152505b60405160200161235a9190614e1e565b604051602081830303815290604052955087818151811061237e5761237d614ac6565b5b60200260200101516040516020016123969190614e69565b60405160208183030381529060405294506123b08361329f565b6040516020016123c09190614eb4565b6040516020818303038152906040529350868686866040516020016123e6929190614ed9565b604051602081830303815290604052604051602001612406929190614ed9565b604051602081830303815290604052604051602001612426929190614ed9565b60405160208183030381529060405296506001816124449190614efc565b905061223b565b505f886124578d61329f565b6040516020016124679190614f55565b604051602081830303815290604052604051602001612487929190614ed9565b6040516020818303038152906040526040516020016124a69190614fa0565b6040516020818303038152906040526040516020016124c591906150a7565b604051602081830303815290604052600e8a6040516020016124e8929190615148565b604051602081830303815290604052604051602001612508929190614ed9565b60405160208183030381529060405290505f8760405160200161252b9190615191565b60405160208183030381529060405290508060405160200161254d91906151dc565b60405160208183030381529060405290508181604051602001612571929190614ed9565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014602052805f5260405f205f915090505481565b600280546125d7906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612603906147ca565b801561264e5780601f106126255761010080835404028352916020019161264e565b820191905f5260205f20905b81548152906001019060200180831161263157829003601f168201915b505050505081565b600d602052805f5260405f205f915054906101000a900460ff1681565b8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161275f919061419a565b60405180910390a35050565b5f612777338484612ead565b905092915050565b61278a858585610b38565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612876575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161281495949392919061522d565b6020604051808303815f875af1158015612830573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128549190614bf0565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156128ad576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361294e576001600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b600a602052805f5260405f205f915054906101000a900460ff1681565b60605f600f805461297d906147ca565b905011156129c857600f6129a160145f8581526020019081526020015f205461329f565b6040516020016129b2929190615148565b60405160208183030381529060405290506129f3565b6129d182611ad7565b6040516020016129e1919061529f565b60405160208183030381529060405290505b919050565b600f8054612a05906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612a31906147ca565b8015612a7c5780601f10612a5357610100808354040283529160200191612a7c565b820191905f5260205f20905b815481529060010190602001808311612a5f57829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f612ac88361345f565b90505f5b8151811015612b5f5782612af9838381518110612aec57612aeb614ac6565b5b6020026020010151611ad7565b604051602001612b0a929190614ed9565b604051602081830303815290604052925060018251612b299190614a93565b8114612b525782604051602001612b4091906152ea565b60405160208183030381529060405292505b8080600101915050612acc565b5081604051602001612b719190615335565b604051602081830303815290604052915050919050565b6006602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c2c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f9081612c3b9190614997565b5050565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600e8054612c76906147ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca2906147ca565b8015612ced5780601f10612cc457610100808354040283529160200191612ced565b820191905f5260205f20905b815481529060010190602001808311612cd057829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d79576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dde576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a612ea89190615489565b905090565b5f80612eb7612e7a565b90505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbc9061551d565b60405180910390fd5b8460055f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546130119190614a93565b925050819055508460055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613135575f8360055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546130fa919061553b565b8484613106919061553b565b6131109190614a93565b90505f5b8181101561313257613125896134f2565b8080600101915050613114565b50505b600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613208575f8382613190919061553b565b8460055f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546131d9919061553b565b6131e39190614a93565b90505f5b81811015613205576131f88861354d565b80806001019150506131e7565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161326591906141c2565b60405180910390a3600193505050509392505050565b816001908161328a9190614997565b50806002908161329a9190614997565b505050565b60605f60016132ad84613772565b0190505f8167ffffffffffffffff8111156132cb576132ca6141e3565b5b6040519080825280601f01601f1916602001820160405280156132fd5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561335e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161335357613352614cc5565b5b0494505f850361330a575b819350505050919050565b5f808203613379575f905061345a565b5f6001613385846138c3565b901c6001901b9050600181848161339f5761339e614cc5565b5b048201901c905060018184816133b8576133b7614cc5565b5b048201901c905060018184816133d1576133d0614cc5565b5b048201901c905060018184816133ea576133e9614cc5565b5b048201901c9050600181848161340357613402614cc5565b5b048201901c9050600181848161341c5761341b614cc5565b5b048201901c9050600181848161343557613434614cc5565b5b048201901c9050613456818285816134505761344f614cc5565b5b0461399a565b9150505b919050565b6060600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156134e657602002820191905f5260205f20905b8154815260200190600101908083116134d2575b50505050509050919050565b5f6134fc826139b2565b905060145f8281526020019081526020015f205460125f60115481526020019081526020015f2081905550600160115f8282546135399190614efc565b9250508190555061354982613ae0565b5050565b61355681613d25565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c4919061557f565b90505f601154826064436135d89190614a93565b406040516020016135ea9291906155d3565b604051602081830303815290604052805190602001205f1c61360c9190614cf2565b90505f60135f8381526020019081526020015f205f9054906101000a900460ff161561364b5760125f8381526020019081526020015f20549050613678565b819050600160135f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600160115f82825461368a9190614a93565b9250508190555060135f60115481526020019081526020015f205f9054906101000a900460ff166136bd576011546136d2565b60125f60115481526020019081526020015f20545b60125f8481526020019081526020015f2081905550600160135f60115481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060145f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137ce577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137c4576137c3614cc5565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061380b576d04ee2d6d415b85acef8100000000838161380157613800614cc5565b5b0492506020810190505b662386f26fc10000831061383a57662386f26fc1000083816138305761382f614cc5565b5b0492506010810190505b6305f5e1008310613863576305f5e100838161385957613858614cc5565b5b0492506008810190505b612710831061388857612710838161387e5761387d614cc5565b5b0492506004810190505b606483106138ab57606483816138a1576138a0614cc5565b5b0492506002810190505b600a83106138ba576001810190505b80915050919050565b5f805f90505f608084901c11156138e257608083901c92506080810190505b5f604084901c11156138fc57604083901c92506040810190505b5f602084901c111561391657602083901c92506020810190505b5f601084901c111561393057601083901c92506010810190505b5f600884901c111561394a57600883901c92506008810190505b5f600484901c111561396457600483901c92506004810190505b5f600284901c111561397e57600283901c92506002810190505b5f600184901c1115613991576001810190505b80915050919050565b5f8183106139a857816139aa565b825b905092915050565b5f80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905011613a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2c90615648565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613abf9190614a93565b81548110613ad057613acf614ac6565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613b45576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bd09190614a93565b81548110613be157613be0614ac6565b5b905f5260205f2001549050600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613c3957613c38614af3565b5b600190038181905f5260205f20015f90559055600c5f8281526020019081526020015f205f905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560075f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d8a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045f81548092919060010191905055505f60045490505f73ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e36576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613f339190614a93565b600c5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fde578082015181840152602081019050613fc3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61400382613fa7565b61400d8185613fb1565b935061401d818560208601613fc1565b61402681613fe9565b840191505092915050565b5f6020820190508181035f8301526140498184613ff9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61407481614062565b811461407e575f80fd5b50565b5f8135905061408f8161406b565b92915050565b5f602082840312156140aa576140a961405a565b5b5f6140b784828501614081565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140e9826140c0565b9050919050565b6140f9816140df565b82525050565b5f6020820190506141125f8301846140f0565b92915050565b614121816140df565b811461412b575f80fd5b50565b5f8135905061413c81614118565b92915050565b5f80604083850312156141585761415761405a565b5b5f6141658582860161412e565b925050602061417685828601614081565b9150509250929050565b5f8115159050919050565b61419481614180565b82525050565b5f6020820190506141ad5f83018461418b565b92915050565b6141bc81614062565b82525050565b5f6020820190506141d55f8301846141b3565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61421982613fe9565b810181811067ffffffffffffffff82111715614238576142376141e3565b5b80604052505050565b5f61424a614051565b90506142568282614210565b919050565b5f67ffffffffffffffff821115614275576142746141e3565b5b61427e82613fe9565b9050602081019050919050565b828183375f83830152505050565b5f6142ab6142a68461425b565b614241565b9050828152602081018484840111156142c7576142c66141df565b5b6142d284828561428b565b509392505050565b5f82601f8301126142ee576142ed6141db565b5b81356142fe848260208601614299565b91505092915050565b5f6020828403121561431c5761431b61405a565b5b5f82013567ffffffffffffffff8111156143395761433861405e565b5b614345848285016142da565b91505092915050565b5f805f606084860312156143655761436461405a565b5b5f6143728682870161412e565b93505060206143838682870161412e565b925050604061439486828701614081565b9150509250925092565b5f60ff82169050919050565b6143b38161439e565b82525050565b5f6020820190506143cc5f8301846143aa565b92915050565b5f602082840312156143e7576143e661405a565b5b5f6143f48482850161412e565b91505092915050565b5f80604083850312156144135761441261405a565b5b5f83013567ffffffffffffffff8111156144305761442f61405e565b5b61443c858286016142da565b925050602083013567ffffffffffffffff81111561445d5761445c61405e565b5b614469858286016142da565b9150509250929050565b61447c81614180565b8114614486575f80fd5b50565b5f8135905061449781614473565b92915050565b5f80604083850312156144b3576144b261405a565b5b5f6144c08582860161412e565b92505060206144d185828601614489565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61450d81614062565b82525050565b5f61451e8383614504565b60208301905092915050565b5f602082019050919050565b5f614540826144db565b61454a81856144e5565b9350614555836144f5565b805f5b8381101561458557815161456c8882614513565b97506145778361452a565b925050600181019050614558565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6145c481614180565b82525050565b5f6145d583836145bb565b60208301905092915050565b5f602082019050919050565b5f6145f782614592565b614601818561459c565b935061460c836145ac565b805f5b8381101561463c57815161462388826145ca565b975061462e836145e1565b92505060018101905061460f565b5085935050505092915050565b5f6040820190508181035f8301526146618185614536565b9050818103602083015261467581846145ed565b90509392505050565b5f80fd5b5f80fd5b5f8083601f84011261469b5761469a6141db565b5b8235905067ffffffffffffffff8111156146b8576146b761467e565b5b6020830191508360018202830111156146d4576146d3614682565b5b9250929050565b5f805f805f608086880312156146f4576146f361405a565b5b5f6147018882890161412e565b95505060206147128882890161412e565b945050604061472388828901614081565b935050606086013567ffffffffffffffff8111156147445761474361405e565b5b61475088828901614686565b92509250509295509295909350565b5f80604083850312156147755761477461405a565b5b5f6147828582860161412e565b92505060206147938582860161412e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806147e157607f821691505b6020821081036147f4576147f361479d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026148567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261481b565b614860868361481b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61489b61489661489184614062565b614878565b614062565b9050919050565b5f819050919050565b6148b483614881565b6148c86148c0826148a2565b848454614827565b825550505050565b5f90565b6148dc6148d0565b6148e78184846148ab565b505050565b5b8181101561490a576148ff5f826148d4565b6001810190506148ed565b5050565b601f82111561494f57614920816147fa565b6149298461480c565b81016020851015614938578190505b61494c6149448561480c565b8301826148ec565b50505b505050565b5f82821c905092915050565b5f61496f5f1984600802614954565b1980831691505092915050565b5f6149878383614960565b9150826002028217905092915050565b6149a082613fa7565b67ffffffffffffffff8111156149b9576149b86141e3565b5b6149c382546147ca565b6149ce82828561490e565b5f60209050601f8311600181146149ff575f84156149ed578287015190505b6149f7858261497c565b865550614a5e565b601f198416614a0d866147fa565b5f5b82811015614a3457848901518255600182019150602085019450602081019050614a0f565b86831015614a515784890151614a4d601f891682614960565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a9d82614062565b9150614aa883614062565b9250828203905081811115614ac057614abf614a66565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f614b3e5f83614b20565b9150614b4982614b30565b5f82019050919050565b5f608082019050614b665f8301866140f0565b614b7360208301856140f0565b614b8060408301846141b3565b8181036060830152614b9181614b33565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bcf81614b9b565b8114614bd9575f80fd5b50565b5f81519050614bea81614bc6565b92915050565b5f60208284031215614c0557614c0461405a565b5b5f614c1284828501614bdc565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614c59601783614c1b565b9150614c6482614c25565b601782019050919050565b5f819050919050565b614c89614c8482614062565b614c6f565b82525050565b5f614c9982614c4d565b9150614ca58285614c78565b602082019150614cb58284614c78565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cfc82614062565b9150614d0783614062565b925082614d1757614d16614cc5565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614d7c602483614c1b565b9150614d8782614d22565b602482019050919050565b5f614d9c82614d70565b9150614da88285614c78565b602082019150614db88284614c78565b6020820191508190509392505050565b5f614dd282613fa7565b614ddc8185614c1b565b9350614dec818560208601613fc1565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614e298284614dc8565b9150614e3482614df8565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614e748284614dc8565b9150614e7f82614e43565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614ebf8284614dc8565b9150614eca82614e8e565b60018201915081905092915050565b5f614ee48285614dc8565b9150614ef08284614dc8565b91508190509392505050565b5f614f0682614062565b9150614f1183614062565b9250828201905080821115614f2957614f28614a66565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614f5f82614f2f565b600882019150614f6f8284614dc8565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614faa82614f7a565b601082019150614fba8284614dc8565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f615091609183614c1b565b915061509c82614fc5565b609182019050919050565b5f6150b28284614dc8565b91506150bd82615085565b915081905092915050565b5f81546150d4816147ca565b6150de8186614c1b565b9450600182165f81146150f8576001811461510d5761513f565b60ff198316865281151582028601935061513f565b615116856147fa565b5f5b8381101561513757815481890152600182019150602081019050615118565b838801955050505b50505092915050565b5f61515382856150c8565b915061515f8284614dc8565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f61519b8261516b565b6014820191506151ab8284614dc8565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f6151e78284614dc8565b91506151f2826151b6565b60028201915081905092915050565b5f61520c8385614b20565b935061521983858461428b565b61522283613fe9565b840190509392505050565b5f6080820190506152405f8301886140f0565b61524d60208301876140f0565b61525a60408301866141b3565b818103606083015261526d818486615201565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f6152a982615279565b601b820191506152b98284614dc8565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f6152f58284614dc8565b9150615300826152c4565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6153408284614dc8565b915061534b8261530f565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156153af5780860481111561538b5761538a614a66565b5b600185161561539a5780820291505b80810290506153a88561535a565b945061536f565b94509492505050565b5f826153c75760019050615482565b816153d4575f9050615482565b81600181146153ea57600281146153f457615423565b6001915050615482565b60ff84111561540657615405614a66565b5b8360020a91508482111561541d5761541c614a66565b5b50615482565b5060208310610133831016604e8410600b84101617156154585782820a90508381111561545357615452614a66565b5b615482565b6154658484846001615366565b9250905081840481111561547c5761547b614a66565b5b81810290505b9392505050565b5f61549382614062565b915061549e8361439e565b92506154cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153b8565b905092915050565b7f6163636f756e7420697320626f740000000000000000000000000000000000005f82015250565b5f615507600e83613fb1565b9150615512826154d3565b602082019050919050565b5f6020820190508181035f830152615534816154fb565b9050919050565b5f61554582614062565b915061555083614062565b9250826155605761555f614cc5565b5b828204905092915050565b5f815190506155798161406b565b92915050565b5f602082840312156155945761559361405a565b5b5f6155a18482850161556b565b91505092915050565b5f819050919050565b5f819050919050565b6155cd6155c8826155aa565b6155b3565b82525050565b5f6155de8285614c78565b6020820191506155ee82846155bc565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f615632601383613fb1565b915061563d826155fe565b602082019050919050565b5f6020820190508181035f83015261565f81615626565b905091905056fea2646970667358221220c14b1d9505538d7fd93aad835a15075fdcc2518292600c6840b2eb56c56a12d364736f6c63430008170033

Deployed Bytecode Sourcemap

32596:5674:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22808:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23545:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25977:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23070:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32864:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27026:1716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20805:151;;;:::i;:::-;;22970:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28885:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29306:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23205:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33084:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25095:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28750:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25489:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34116:272;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;23311:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34814:3036;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20246:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33344:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22862:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24510:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26670:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29069:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29806:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25295:114;;;:::i;:::-;;23836:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34402:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32659:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37858:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23425:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32970:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23656:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32631:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20578:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22808:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23545:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;25977:642::-;26080:4;26115:6;;26101:10;:20;;:38;;;;;26138:1;26125:10;:14;26101:38;26097:491;;;26156:13;26172:8;:20;26181:10;26172:20;;;;;;;;;;;;;;;;;;;;;26156:36;;26227:5;26213:19;;:10;:19;;;;:59;;;;;26237:16;:23;26254:5;26237:23;;;;;;;;;;;;;;;:35;26261:10;26237:35;;;;;;;;;;;;;;;;;;;;;;;;;26236:36;26213:59;26209:121;;;26300:14;;;;;;;;;;;;;;26209:121;26372:7;26346:11;:23;26358:10;26346:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;26417:7;26401:36;;26410:5;26401:36;;;26426:10;26401:36;;;;;;:::i;:::-;;;;;;;;26141:308;26097:491;;;26503:10;26470:9;:21;26480:10;26470:21;;;;;;;;;;;;;;;:30;26492:7;26470:30;;;;;;;;;;;;;;;:43;;;;26556:7;26535:41;;26544:10;26535:41;;;26565:10;26535:41;;;;;;:::i;:::-;;;;;;;;26097:491;26607:4;26600:11;;25977:642;;;;:::o;23070:36::-;;;:::o;32864:98::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;32946:8:::1;32936:7;:18;;;;;;:::i;:::-;;32864:98:::0;:::o;27026:1716::-;27172:6;;27158:10;:20;27154:1581;;27207:8;:20;27216:10;27207:20;;;;;;;;;;;;;;;;;;;;;27199:28;;:4;:28;;;27195:91;;27255:15;;;;;;;;;;;;;;27195:91;27320:1;27306:16;;:2;:16;;;27302:82;;27350:18;;;;;;;;;;;;;;27302:82;27436:4;27422:18;;:10;:18;;;;:74;;;;;27462:16;:22;27479:4;27462:22;;;;;;;;;;;;;;;:34;27485:10;27462:34;;;;;;;;;;;;;;;;;;;;;;;;;27461:35;27422:74;:132;;;;;27531:11;:23;27543:10;27531:23;;;;;;;;;;;;;;;;;;;;;27517:37;;:10;:37;;;;27422:132;27400:226;;;27596:14;;;;;;;;;;;;;;27400:226;27661:10;:8;:10::i;:::-;27642:9;:15;27652:4;27642:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27734:10;:8;:10::i;:::-;27717:9;:13;27727:2;27717:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;27799:2;27776:8;:20;27785:10;27776:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;27823:11;:23;27835:10;27823:23;;;;;;;;;;;;27816:30;;;;;;;;;;;27904:17;27924:6;:12;27931:4;27924:12;;;;;;;;;;;;;;;27959:1;27937:6;:12;27944:4;27937:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;27924:37;;;;;;;;:::i;:::-;;;;;;;;;;27904:57;;28016:9;27976:6;:12;27983:4;27976:12;;;;;;;;;;;;;;;27989:11;:23;28001:10;27989:23;;;;;;;;;;;;27976:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;28060:6;:12;28067:4;28060:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28164:11;:23;28176:10;28164:23;;;;;;;;;;;;28139:11;:22;28151:9;28139:22;;;;;;;;;;;:48;;;;28241:6;:10;28248:2;28241:10;;;;;;;;;;;;;;;28257;28241:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28371:1;28351:6;:10;28358:2;28351:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28325:11;:23;28337:10;28325:23;;;;;;;;;;;:47;;;;28413:10;28409:2;28394:30;;28403:4;28394:30;;;;;;;;;;;;28464:2;28444:35;;28458:4;28444:35;;;28468:10;:8;:10::i;:::-;28444:35;;;;;;:::i;:::-;;;;;;;;27180:1311;27154:1581;;;28512:15;28530:9;:15;28540:4;28530:15;;;;;;;;;;;;;;;:27;28546:10;28530:27;;;;;;;;;;;;;;;;28512:45;;28589:17;28578:7;:28;28574:101;;28665:10;28655:7;:20;;;;:::i;:::-;28625:9;:15;28635:4;28625:15;;;;;;;;;;;;;;;:27;28641:10;28625:27;;;;;;;;;;;;;;;:50;;;;28574:101;28692:31;28702:4;28708:2;28712:10;28692:9;:31::i;:::-;;28497:238;27154:1581;27026:1716;;;:::o;20805:151::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;20884:1:::1;20868:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;20945:1;20904:44;;20925:10;20904:44;;;;;;;;;;;;20805:151::o:0;22970:31::-;;;:::o;28885:127::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;28989:5:::1;28962:14;:24;28977:8;28962:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;28885:127:::0;:::o;29306:405::-;29430:26;29443:4;29449:2;29453;29430:12;:26::i;:::-;29505:1;29487:2;:14;;;:19;;:154;;;;;29601:40;;;29523:118;;;29538:2;29523:35;;;29559:10;29571:4;29577:2;29523:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;29487:154;29469:235;;;29675:17;;;;;;;;;;;;;;29469:235;29306:405;;;:::o;23205:21::-;;;;:::o;33084:158::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;33204:30:::1;33219:5;33226:7;33204:14;:30::i;:::-;33084:158:::0;;:::o;25095:111::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;25193:5:::1;25173:9;:17;25183:6;25173:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25095:111:::0;;:::o;28750:128::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;28856:4:::1;28829:14;:24;28844:8;28829:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;28750:128:::0;:::o;25489:193::-;25547:13;25581:8;:12;25590:2;25581:12;;;;;;;;;;;;;;;;;;;;;25573:20;;25627:1;25610:19;;:5;:19;;;25606:69;;25653:10;;;;;;;;;;;;;;25606:69;25489:193;;;:::o;34116:272::-;34151:26;34178:23;34233:5;;34222:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34207:32;;34267:5;;34256:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34244:29;;34282:6;34278:106;34291:5;;34289:1;:7;34278:106;;;34325:8;:11;34334:1;34325:11;;;;;;;;;;;;;;;;;;;;;:21;;34345:1;34325:21;;;34337:4;:7;34342:1;34337:7;;;;;;;;;;;;34325:21;34307:12;34320:1;34307:15;;;;;;;;:::i;:::-;;;;;;;:39;;;;;34367:8;:11;34376:1;34367:11;;;;;;;;;;;;;;;;;;;;;34352:9;34362:1;34352:12;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;34297:3;;;;;;;34278:106;;;;34116:272;;:::o;23311:44::-;;;;;;;;;;;;;;;;;:::o;34814:3036::-;34860:13;34885:11;34899:15;:19;34915:2;34899:19;;;;;;;;;;;;34885:33;;34929:21;34953:26;34971:6;34953:16;:26::i;:::-;34929:50;;34992:26;35034:2;35021:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34992:45;;35052:26;;;;;;;;;;;;;;;;;:10;35063:1;35052:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;35093:27;;;;;;;;;;;;;;;;;:10;35104:1;35093:13;;;;;;;;:::i;:::-;;;;;;;:27;;;;35135:30;;;;;;;;;;;;;;;;;:10;35146:1;35135:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;35180;;;;;;;;;;;;;;;;;:10;35191:1;35180:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;35225:24;;;;;;;;;;;;;;;;;:10;35236:1;35225:13;;;;;;;;:::i;:::-;;;;;;;:24;;;;35264:26;;;;;;;;;;;;;;;;;:10;35275:1;35264:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;35305:23;;;;;;;;;;;;;;;;;:10;35316:1;35305:13;;;;;;;;:::i;:::-;;;;;;;:23;;;;35343:22;;;;;;;;;;;;;;;;;:10;35354:1;35343:13;;;;;;;;:::i;:::-;;;;;;;:22;;;;35380:29;;;;;;;;;;;;;;;;;:10;35391:1;35380:13;;;;;;;;:::i;:::-;;;;;;;:29;;;;35424:28;;;;;;;;;;;;;;;;;:10;35435:1;35424:13;;;;;;;;:::i;:::-;;;;;;;:28;;;;35467:26;;;;;;;;;;;;;;;;;:10;35478:2;35467:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35508:34;;;;;;;;;;;;;;;;;:10;35519:2;35508:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35557:27;;;;;;;;;;;;;;;;;:10;35568:2;35557:14;;;;;;;;:::i;:::-;;;;;;;:27;;;;35599:33;;;;;;;;;;;;;;;;;:10;35610:2;35599:14;;;;;;;;:::i;:::-;;;;;;;:33;;;;35647:26;;;;;;;;;;;;;;;;;:10;35658:2;35647:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35688:34;;;;;;;;;;;;;;;;;:10;35699:2;35688:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35737:29;;;;;;;;;;;;;;;;;:10;35748:2;35737:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35781:28;;;;;;;;;;;;;;;;;:10;35792:2;35781:14;;;;;;;;:::i;:::-;;;;;;;:28;;;;35824:29;;;;;;;;;;;;;;;;;:10;35835:2;35824:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35868;;;;;;;;;;;;;;;;;:10;35879:2;35868:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35910:24;:29;;;;;;;;;;;;;;35950:18;:23;;;;;;;;;;;;;;35984:19;:24;;;;;;;;;;;;;;36019:19;:24;;;;;;;;;;;;;;36054:9;36074:15;36192:9;36187:964;36211:10;:17;36207:1;:21;36187:964;;;36310:158;36450:3;36443:6;:10;:23;;36460:6;36443:23;;;36454:5;36443:23;36320:147;;36404:6;36411:1;36335:78;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36325:89;;;;;;36320:95;;:147;;;;:::i;:::-;36310:9;:158::i;:::-;36297:171;;36497:261;36732:10;36728:3;:14;;;;:::i;:::-;36626:6;36682:1;36522:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36512:211;;;;;;36507:217;;:236;;;;:::i;:::-;36497:9;:261::i;:::-;36492:2;:266;;;;:::i;:::-;36485:273;;36799:1;36796;:4;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36782:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;36775:52;;36864:10;36875:1;36864:13;;;;;;;;:::i;:::-;;;;;;;;36850:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;36842:50;;36930:22;36947:4;36930:16;:22::i;:::-;36915:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;36907:51;;37000:10;37043:4;37084:5;37091;37070:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37029:91;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36986:153;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36973:166;;36235:1;36230:6;;;;;:::i;:::-;;;36187:964;;;;37163:26;37301:7;37337:20;37354:2;37337:16;:20::i;:::-;37310:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;37286:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37252:111;;;;;;;;:::i;:::-;;;;;;;;;;;;;37220:324;;;;;;;;:::i;:::-;;;;;;;;;;;;;37573:7;37582;37559:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37192:409;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37163:438;;37614:27;37695:10;37644:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;37614:102;;37760:13;37745:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;37729:52;;37815:12;37828:13;37801:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37794:48;;;;;;;;;;;;;34814:3036;;;:::o;20246:20::-;;;;;;;;;;;;:::o;33344:42::-;;;;;;;;;;;;;;;;;:::o;22862:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24510:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;26670:207::-;26797:8;26756:16;:28;26773:10;26756:28;;;;;;;;;;;;;;;:38;26785:8;26756:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;26850:8;26823:46;;26838:10;26823:46;;;26860:8;26823:46;;;;;;:::i;:::-;;;;;;;;26670:207;;:::o;29069:160::-;29164:4;29188:33;29198:10;29210:2;29214:6;29188:9;:33::i;:::-;29181:40;;29069:160;;;;:::o;29806:437::-;29960:26;29973:4;29979:2;29983;29960:12;:26::i;:::-;30035:1;30017:2;:14;;;:19;;:156;;;;;30133:40;;;30053:120;;;30068:2;30053:35;;;30089:10;30101:4;30107:2;30111:4;;30053:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;30017:156;29999:237;;;30207:17;;;;;;;;;;;;;;29999:237;29806:437;;;;;:::o;25295:114::-;25360:1;25337:9;:21;25347:10;25337:21;;;;;;;;;;;;;;;;:24;25334:67;;25397:4;25373:9;:21;25383:10;25373:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25334:67;25295:114::o;23836:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;34402:404::-;34462:13;34523:1;34500:12;34494:26;;;;;:::i;:::-;;;:30;34490:309;;;34562:12;34576:37;34593:15;:19;34609:2;34593:19;;;;;;;;;;;;34576:16;:37::i;:::-;34548:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34541:74;;;;34490:309;34760:8;34765:2;34760:4;:8::i;:::-;34672:115;;;;;;;;:::i;:::-;;;;;;;;;;;;;34648:139;;34402:404;;;;:::o;32659:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37858:409::-;37909:25;37944:17;;;;;;;;;;;;;;;;;;;37969;37989:20;38004:4;37989:14;:20::i;:::-;37969:40;;38021:6;38017:191;38030:3;:10;38028:1;:12;38017:191;;;38082:11;38094:12;38099:3;38103:1;38099:6;;;;;;;;:::i;:::-;;;;;;;;38094:4;:12::i;:::-;38068:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38054:54;;38134:1;38123:3;:10;:12;;;;:::i;:::-;38120:1;:15;38117:83;;38174:11;38160:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;38146:44;;38117:83;38041:3;;;;;;;38017:191;;;;38243:11;38229:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;38215:44;;37936:331;37858:409;;;:::o;23425:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32970:106::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;33059:9:::1;33044:12;:24;;;;;;:::i;:::-;;32970:106:::0;:::o;23656:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32631:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20578:219::-;20333:5;;;;;;;;;;20319:19;;:10;:19;;;20315:46;;20347:14;;;;;;;;;;;;;;20315:46;20679:1:::1;20661:20;;:6;:20;;::::0;20657:47:::1;;20690:14;;;;;;;;;;;;;;20657:47;20725:6;20717:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;20782:6;20749:40;;20770:10;20749:40;;;;;;;;;;;;20578:219:::0;:::o;31466:92::-;31509:7;31542:8;31536:2;:14;;;;:::i;:::-;31529:21;;31466:92;:::o;30311:1116::-;30424:4;30441:12;30456:10;:8;:10::i;:::-;30441:25;;30477:27;30507:9;:15;30517:4;30507:15;;;;;;;;;;;;;;;;30477:45;;30533:29;30565:9;:13;30575:2;30565:13;;;;;;;;;;;;;;;;30533:45;;30598:14;:20;30613:4;30598:20;;;;;;;;;;;;;;;;;;;;;;;;;30597:21;30589:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;30667:6;30648:9;:15;30658:4;30648:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30728:6;30711:9;:13;30721:2;30711:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;30819:9;:15;30829:4;30819:15;;;;;;;;;;;;;;;;;;;;;;;;;30814:234;;30851:22;30926:4;30908:9;:15;30918:4;30908:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;30899:4;30877:19;:26;;;;:::i;:::-;30876:55;;;;:::i;:::-;30851:80;;30951:9;30946:91;30970:14;30966:1;:18;30946:91;;;31010:11;31016:4;31010:5;:11::i;:::-;30986:3;;;;;;;30946:91;;;;30836:212;30814:234;31124:9;:13;31134:2;31124:13;;;;;;;;;;;;;;;;;;;;;;;;;31119:230;;31154:22;31229:4;31205:21;:28;;;;:::i;:::-;31196:4;31180:9;:13;31190:2;31180:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;31179:55;;;;:::i;:::-;31154:80;;31254:9;31249:89;31273:14;31269:1;:18;31249:89;;;31313:9;31319:2;31313:5;:9::i;:::-;31289:3;;;;;;;31249:89;;;;31139:210;31119:230;31386:2;31366:31;;31380:4;31366:31;;;31390:6;31366:31;;;;;;:::i;:::-;;;;;;;;31415:4;31408:11;;;;;30311:1116;;;;;:::o;32429:160::-;32549:5;32542:4;:12;;;;;;:::i;:::-;;32574:7;32565:6;:16;;;;;;:::i;:::-;;32429:160;;:::o;17539:718::-;17595:13;17646:14;17683:1;17663:17;17674:5;17663:10;:17::i;:::-;:21;17646:38;;17699:20;17733:6;17722:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17699:41;;17755:11;17884:6;17880:2;17876:15;17868:6;17864:28;17857:35;;17921:290;17928:4;17921:290;;;17953:5;;;;;;;;18095:10;18090:2;18083:5;18079:14;18074:32;18069:3;18061:46;18153:2;18144:11;;;;;;:::i;:::-;;;;;18187:1;18178:5;:10;17921:290;18174:21;17921:290;18232:6;18225:13;;;;;17539:718;;;:::o;10375:1673::-;10423:7;10452:1;10447;:6;10443:47;;10477:1;10470:8;;;;10443:47;11181:14;11215:1;11204:7;11209:1;11204:4;:7::i;:::-;:12;;11198:1;:19;;11181:36;;11683:1;11672:6;11668:1;:10;;;;;:::i;:::-;;;11659:6;:19;11658:26;;11649:35;;11733:1;11722:6;11718:1;:10;;;;;:::i;:::-;;;11709:6;:19;11708:26;;11699:35;;11783:1;11772:6;11768:1;:10;;;;;:::i;:::-;;;11759:6;:19;11758:26;;11749:35;;11833:1;11822:6;11818:1;:10;;;;;:::i;:::-;;;11809:6;:19;11808:26;;11799:35;;11883:1;11872:6;11868:1;:10;;;;;:::i;:::-;;;11859:6;:19;11858:26;;11849:35;;11933:1;11922:6;11918:1;:10;;;;;:::i;:::-;;;11909:6;:19;11908:26;;11899:35;;11983:1;11972:6;11968:1;:10;;;;;:::i;:::-;;;11959:6;:19;11958:26;;11949:35;;12006:23;12010:6;12022;12018:1;:10;;;;;:::i;:::-;;;12006:3;:23::i;:::-;11999:30;;;10375:1673;;;;:::o;24191:105::-;24252:13;24278:6;:13;24285:5;24278:13;;;;;;;;;;;;;;;24271:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24191:105;;;:::o;33938:173::-;33996:7;34006:25;34026:4;34006:19;:25::i;:::-;33996:35;;34050:15;:19;34066:2;34050:19;;;;;;;;;;;;34036:4;:11;34041:5;;34036:11;;;;;;;;;;;:33;;;;34083:1;34076:5;;:8;;;;;;;:::i;:::-;;;;;;;;34089:17;34101:4;34089:11;:17::i;:::-;33985:126;33938:173;:::o;33457:476::-;33507:15;33519:2;33507:11;:15::i;:::-;33527:7;33537:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33527:23;;33557:11;33641:5;;33603:2;33631:3;33616:12;:18;;;;:::i;:::-;33606:29;33586:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33576:61;;;;;;33571:67;;:75;;;;:::i;:::-;33557:89;;33651:9;33668:8;:16;33677:6;33668:16;;;;;;;;;;;;;;;;;;;;;33665:109;;;33698:4;:12;33703:6;33698:12;;;;;;;;;;;;33691:19;;33665:109;;;33733:6;33726:13;;33764:4;33745:8;:16;33754:6;33745:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33665:109;33785:1;33778:5;;:8;;;;;;;:::i;:::-;;;;;;;;33806;:15;33815:5;;33806:15;;;;;;;;;;;;;;;;;;;;;:33;;33834:5;;33806:33;;;33822:4;:11;33827:5;;33822:11;;;;;;;;;;;;33806:33;33791:4;:12;33796:6;33791:12;;;;;;;;;;;:48;;;;33862:4;33844:8;:15;33853:5;;33844:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33893:4;33871:15;:19;33887:2;33871:19;;;;;;;;;;;:26;;;;33923:4;33920:2;33907:21;;;;;;;;;;;;33502:431;;;33457:476;:::o;14102:948::-;14155:7;14175:14;14192:1;14175:18;;14242:8;14233:5;:17;14229:106;;14280:8;14271:17;;;;;;:::i;:::-;;;;;14317:2;14307:12;;;;14229:106;14362:8;14353:5;:17;14349:106;;14400:8;14391:17;;;;;;:::i;:::-;;;;;14437:2;14427:12;;;;14349:106;14482:8;14473:5;:17;14469:106;;14520:8;14511:17;;;;;;:::i;:::-;;;;;14557:2;14547:12;;;;14469:106;14602:7;14593:5;:16;14589:103;;14639:7;14630:16;;;;;;:::i;:::-;;;;;14675:1;14665:11;;;;14589:103;14719:7;14710:5;:16;14706:103;;14756:7;14747:16;;;;;;:::i;:::-;;;;;14792:1;14782:11;;;;14706:103;14836:7;14827:5;:16;14823:103;;14873:7;14864:16;;;;;;:::i;:::-;;;;;14909:1;14899:11;;;;14823:103;14953:7;14944:5;:16;14940:68;;14991:1;14981:11;;;;14940:68;15036:6;15029:13;;;14102:948;;;:::o;12534:1019::-;12586:7;12606:14;12623:1;12606:18;;12679:1;12673:3;12664:5;:12;;:16;12660:102;;;12711:3;12701:13;;;;;12743:3;12733:13;;;;12660:102;12794:1;12789:2;12780:5;:11;;:15;12776:99;;;12826:2;12816:12;;;;;12857:2;12847:12;;;;12776:99;12907:1;12902:2;12893:5;:11;;:15;12889:99;;;12939:2;12929:12;;;;;12970:2;12960:12;;;;12889:99;13020:1;13015:2;13006:5;:11;;:15;13002:99;;;13052:2;13042:12;;;;;13083:2;13073:12;;;;13002:99;13132:1;13128;13119:5;:10;;:14;13115:96;;;13164:1;13154:11;;;;;13194:1;13184:11;;;;13115:96;13242:1;13238;13229:5;:10;;:14;13225:96;;;13274:1;13264:11;;;;;13304:1;13294:11;;;;13225:96;13352:1;13348;13339:5;:10;;:14;13335:96;;;13384:1;13374:11;;;;;13414:1;13404:11;;;;13335:96;13462:1;13458;13449:5;:10;;:14;13445:66;;;13494:1;13484:11;;;;13445:66;13539:6;13532:13;;;12534:1019;;;:::o;4212:106::-;4270:7;4301:1;4297;:5;:13;;4309:1;4297:13;;;4305:1;4297:13;4290:20;;4212:106;;;;:::o;23995:193::-;24062:7;24107:1;24084:6;:13;24091:5;24084:13;;;;;;;;;;;;;;;:20;;;;:24;24076:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24144:6;:13;24151:5;24144:13;;;;;;;;;;;;;;;24181:1;24158:6;:13;24165:5;24158:13;;;;;;;;;;;;;;;:20;;;;:24;;;;:::i;:::-;24144:39;;;;;;;;:::i;:::-;;;;;;;;;;24137:46;;23995:193;;;:::o;32048:373::-;32125:1;32109:18;;:4;:18;;;32105:73;;32151:15;;;;;;;;;;;;;;32105:73;32190:10;32203:6;:12;32210:4;32203:12;;;;;;;;;;;;;;;32238:1;32216:6;:12;32223:4;32216:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;32203:37;;;;;;;;:::i;:::-;;;;;;;;;;32190:50;;32251:6;:12;32258:4;32251:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32287:11;:15;32299:2;32287:15;;;;;;;;;;;32280:22;;;32320:8;:12;32329:2;32320:12;;;;;;;;;;;;32313:19;;;;;;;;;;;32350:11;:15;32362:2;32350:15;;;;;;;;;;;;32343:22;;;;;;;;;;;32410:2;32406:1;32383:30;;32392:4;32383:30;;;;;;;;;;;;32094:327;32048:373;:::o;31566:474::-;31639:1;31625:16;;:2;:16;;;31621:74;;31665:18;;;;;;;;;;;;;;31621:74;31732:6;;:8;;;;;;;;;;;;;31764:10;31777:6;;31764:19;;31824:1;31800:26;;:8;:12;31809:2;31800:12;;;;;;;;;;;;;;;;;;;;;:26;;;31796:81;;31850:15;;;;;;;;;;;;;;31796:81;31904:2;31889:8;:12;31898:2;31889:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;31917:6;:10;31924:2;31917:10;;;;;;;;;;;;;;;31933:2;31917:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31985:1;31965:6;:10;31972:2;31965:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;31947:11;:15;31959:2;31947:15;;;;;;;;;;;:39;;;;32029:2;32025;32004:28;;32021:1;32004:28;;;;;;;;;;;;31610:430;31566:474;:::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:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:117::-;4594:1;4591;4584:12;4608:117;4717:1;4714;4707:12;4731:180;4779:77;4776:1;4769:88;4876:4;4873:1;4866:15;4900:4;4897:1;4890:15;4917:281;5000:27;5022:4;5000:27;:::i;:::-;4992:6;4988:40;5130:6;5118:10;5115:22;5094:18;5082:10;5079:34;5076:62;5073:88;;;5141:18;;:::i;:::-;5073:88;5181:10;5177:2;5170:22;4960:238;4917:281;;:::o;5204:129::-;5238:6;5265:20;;:::i;:::-;5255:30;;5294:33;5322:4;5314:6;5294:33;:::i;:::-;5204:129;;;:::o;5339:308::-;5401:4;5491:18;5483:6;5480:30;5477:56;;;5513:18;;:::i;:::-;5477:56;5551:29;5573:6;5551:29;:::i;:::-;5543:37;;5635:4;5629;5625:15;5617:23;;5339:308;;;:::o;5653:146::-;5750:6;5745:3;5740;5727:30;5791:1;5782:6;5777:3;5773:16;5766:27;5653:146;;;:::o;5805:425::-;5883:5;5908:66;5924:49;5966:6;5924:49;:::i;:::-;5908:66;:::i;:::-;5899:75;;5997:6;5990:5;5983:21;6035:4;6028:5;6024:16;6073:3;6064:6;6059:3;6055:16;6052:25;6049:112;;;6080:79;;:::i;:::-;6049:112;6170:54;6217:6;6212:3;6207;6170:54;:::i;:::-;5889:341;5805:425;;;;;:::o;6250:340::-;6306:5;6355:3;6348:4;6340:6;6336:17;6332:27;6322:122;;6363:79;;:::i;:::-;6322:122;6480:6;6467:20;6505:79;6580:3;6572:6;6565:4;6557:6;6553:17;6505:79;:::i;:::-;6496:88;;6312:278;6250:340;;;;:::o;6596:509::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6868:1;6857:9;6853:17;6840:31;6898:18;6890:6;6887:30;6884:117;;;6920:79;;:::i;:::-;6884:117;7025:63;7080:7;7071:6;7060:9;7056:22;7025:63;:::i;:::-;7015:73;;6811:287;6596:509;;;;:::o;7111:619::-;7188:6;7196;7204;7253:2;7241:9;7232:7;7228:23;7224:32;7221:119;;;7259:79;;:::i;:::-;7221:119;7379:1;7404:53;7449:7;7440:6;7429:9;7425:22;7404:53;:::i;:::-;7394:63;;7350:117;7506:2;7532:53;7577:7;7568:6;7557:9;7553:22;7532:53;:::i;:::-;7522:63;;7477:118;7634:2;7660:53;7705:7;7696:6;7685:9;7681:22;7660:53;:::i;:::-;7650:63;;7605:118;7111:619;;;;;:::o;7736:86::-;7771:7;7811:4;7804:5;7800:16;7789:27;;7736:86;;;:::o;7828:112::-;7911:22;7927:5;7911:22;:::i;:::-;7906:3;7899:35;7828:112;;:::o;7946:214::-;8035:4;8073:2;8062:9;8058:18;8050:26;;8086:67;8150:1;8139:9;8135:17;8126:6;8086:67;:::i;:::-;7946:214;;;;:::o;8166:329::-;8225:6;8274:2;8262:9;8253:7;8249:23;8245:32;8242:119;;;8280:79;;:::i;:::-;8242:119;8400:1;8425:53;8470:7;8461:6;8450:9;8446:22;8425:53;:::i;:::-;8415:63;;8371:117;8166:329;;;;:::o;8501:834::-;8589:6;8597;8646:2;8634:9;8625:7;8621:23;8617:32;8614:119;;;8652:79;;:::i;:::-;8614:119;8800:1;8789:9;8785:17;8772:31;8830:18;8822:6;8819:30;8816:117;;;8852:79;;:::i;:::-;8816:117;8957:63;9012:7;9003:6;8992:9;8988:22;8957:63;:::i;:::-;8947:73;;8743:287;9097:2;9086:9;9082:18;9069:32;9128:18;9120:6;9117:30;9114:117;;;9150:79;;:::i;:::-;9114:117;9255:63;9310:7;9301:6;9290:9;9286:22;9255:63;:::i;:::-;9245:73;;9040:288;8501:834;;;;;:::o;9341:116::-;9411:21;9426:5;9411:21;:::i;:::-;9404:5;9401:32;9391:60;;9447:1;9444;9437:12;9391:60;9341:116;:::o;9463:133::-;9506:5;9544:6;9531:20;9522:29;;9560:30;9584:5;9560:30;:::i;:::-;9463:133;;;;:::o;9602:468::-;9667:6;9675;9724:2;9712:9;9703:7;9699:23;9695:32;9692:119;;;9730:79;;:::i;:::-;9692:119;9850:1;9875:53;9920:7;9911:6;9900:9;9896:22;9875:53;:::i;:::-;9865:63;;9821:117;9977:2;10003:50;10045:7;10036:6;10025:9;10021:22;10003:50;:::i;:::-;9993:60;;9948:115;9602:468;;;;;:::o;10076:114::-;10143:6;10177:5;10171:12;10161:22;;10076:114;;;:::o;10196:184::-;10295:11;10329:6;10324:3;10317:19;10369:4;10364:3;10360:14;10345:29;;10196:184;;;;:::o;10386:132::-;10453:4;10476:3;10468:11;;10506:4;10501:3;10497:14;10489:22;;10386:132;;;:::o;10524:108::-;10601:24;10619:5;10601:24;:::i;:::-;10596:3;10589:37;10524:108;;:::o;10638:179::-;10707:10;10728:46;10770:3;10762:6;10728:46;:::i;:::-;10806:4;10801:3;10797:14;10783:28;;10638:179;;;;:::o;10823:113::-;10893:4;10925;10920:3;10916:14;10908:22;;10823:113;;;:::o;10972:732::-;11091:3;11120:54;11168:5;11120:54;:::i;:::-;11190:86;11269:6;11264:3;11190:86;:::i;:::-;11183:93;;11300:56;11350:5;11300:56;:::i;:::-;11379:7;11410:1;11395:284;11420:6;11417:1;11414:13;11395:284;;;11496:6;11490:13;11523:63;11582:3;11567:13;11523:63;:::i;:::-;11516:70;;11609:60;11662:6;11609:60;:::i;:::-;11599:70;;11455:224;11442:1;11439;11435:9;11430:14;;11395:284;;;11399:14;11695:3;11688:10;;11096:608;;;10972:732;;;;:::o;11710:111::-;11774:6;11808:5;11802:12;11792:22;;11710:111;;;:::o;11827:181::-;11923:11;11957:6;11952:3;11945:19;11997:4;11992:3;11988:14;11973:29;;11827:181;;;;:::o;12014:129::-;12078:4;12101:3;12093:11;;12131:4;12126:3;12122:14;12114:22;;12014:129;;;:::o;12149:99::-;12220:21;12235:5;12220:21;:::i;:::-;12215:3;12208:34;12149:99;;:::o;12254:167::-;12317:10;12338:40;12374:3;12366:6;12338:40;:::i;:::-;12410:4;12405:3;12401:14;12387:28;;12254:167;;;;:::o;12427:110::-;12494:4;12526;12521:3;12517:14;12509:22;;12427:110;;;:::o;12567:708::-;12680:3;12709:51;12754:5;12709:51;:::i;:::-;12776:83;12852:6;12847:3;12776:83;:::i;:::-;12769:90;;12883:53;12930:5;12883:53;:::i;:::-;12959:7;12990:1;12975:275;13000:6;12997:1;12994:13;12975:275;;;13076:6;13070:13;13103:57;13156:3;13141:13;13103:57;:::i;:::-;13096:64;;13183:57;13233:6;13183:57;:::i;:::-;13173:67;;13035:215;13022:1;13019;13015:9;13010:14;;12975:275;;;12979:14;13266:3;13259:10;;12685:590;;;12567:708;;;;:::o;13281:622::-;13496:4;13534:2;13523:9;13519:18;13511:26;;13583:9;13577:4;13573:20;13569:1;13558:9;13554:17;13547:47;13611:108;13714:4;13705:6;13611:108;:::i;:::-;13603:116;;13766:9;13760:4;13756:20;13751:2;13740:9;13736:18;13729:48;13794:102;13891:4;13882:6;13794:102;:::i;:::-;13786:110;;13281:622;;;;;:::o;13909:117::-;14018:1;14015;14008:12;14032:117;14141:1;14138;14131:12;14168:552;14225:8;14235:6;14285:3;14278:4;14270:6;14266:17;14262:27;14252:122;;14293:79;;:::i;:::-;14252:122;14406:6;14393:20;14383:30;;14436:18;14428:6;14425:30;14422:117;;;14458:79;;:::i;:::-;14422:117;14572:4;14564:6;14560:17;14548:29;;14626:3;14618:4;14610:6;14606:17;14596:8;14592:32;14589:41;14586:128;;;14633:79;;:::i;:::-;14586:128;14168:552;;;;;:::o;14726:963::-;14823:6;14831;14839;14847;14855;14904:3;14892:9;14883:7;14879:23;14875:33;14872:120;;;14911:79;;:::i;:::-;14872:120;15031:1;15056:53;15101:7;15092:6;15081:9;15077:22;15056:53;:::i;:::-;15046:63;;15002:117;15158:2;15184:53;15229:7;15220:6;15209:9;15205:22;15184:53;:::i;:::-;15174:63;;15129:118;15286:2;15312:53;15357:7;15348:6;15337:9;15333:22;15312:53;:::i;:::-;15302:63;;15257:118;15442:2;15431:9;15427:18;15414:32;15473:18;15465:6;15462:30;15459:117;;;15495:79;;:::i;:::-;15459:117;15608:64;15664:7;15655:6;15644:9;15640:22;15608:64;:::i;:::-;15590:82;;;;15385:297;14726:963;;;;;;;;:::o;15695:474::-;15763:6;15771;15820:2;15808:9;15799:7;15795:23;15791:32;15788:119;;;15826:79;;:::i;:::-;15788:119;15946:1;15971:53;16016:7;16007:6;15996:9;15992:22;15971:53;:::i;:::-;15961:63;;15917:117;16073:2;16099:53;16144:7;16135:6;16124:9;16120:22;16099:53;:::i;:::-;16089:63;;16044:118;15695:474;;;;;:::o;16175:180::-;16223:77;16220:1;16213:88;16320:4;16317:1;16310:15;16344:4;16341:1;16334:15;16361:320;16405:6;16442:1;16436:4;16432:12;16422:22;;16489:1;16483:4;16479:12;16510:18;16500:81;;16566:4;16558:6;16554:17;16544:27;;16500:81;16628:2;16620:6;16617:14;16597:18;16594:38;16591:84;;16647:18;;:::i;:::-;16591:84;16412:269;16361:320;;;:::o;16687:141::-;16736:4;16759:3;16751:11;;16782:3;16779:1;16772:14;16816:4;16813:1;16803:18;16795:26;;16687:141;;;:::o;16834:93::-;16871:6;16918:2;16913;16906:5;16902:14;16898:23;16888:33;;16834:93;;;:::o;16933:107::-;16977:8;17027:5;17021:4;17017:16;16996:37;;16933:107;;;;:::o;17046:393::-;17115:6;17165:1;17153:10;17149:18;17188:97;17218:66;17207:9;17188:97;:::i;:::-;17306:39;17336:8;17325:9;17306:39;:::i;:::-;17294:51;;17378:4;17374:9;17367:5;17363:21;17354:30;;17427:4;17417:8;17413:19;17406:5;17403:30;17393:40;;17122:317;;17046:393;;;;;:::o;17445:60::-;17473:3;17494:5;17487:12;;17445:60;;;:::o;17511:142::-;17561:9;17594:53;17612:34;17621:24;17639:5;17621:24;:::i;:::-;17612:34;:::i;:::-;17594:53;:::i;:::-;17581:66;;17511:142;;;:::o;17659:75::-;17702:3;17723:5;17716:12;;17659:75;;;:::o;17740:269::-;17850:39;17881:7;17850:39;:::i;:::-;17911:91;17960:41;17984:16;17960:41;:::i;:::-;17952:6;17945:4;17939:11;17911:91;:::i;:::-;17905:4;17898:105;17816:193;17740:269;;;:::o;18015:73::-;18060:3;18015:73;:::o;18094:189::-;18171:32;;:::i;:::-;18212:65;18270:6;18262;18256:4;18212:65;:::i;:::-;18147:136;18094:189;;:::o;18289:186::-;18349:120;18366:3;18359:5;18356:14;18349:120;;;18420:39;18457:1;18450:5;18420:39;:::i;:::-;18393:1;18386:5;18382:13;18373:22;;18349:120;;;18289:186;;:::o;18481:543::-;18582:2;18577:3;18574:11;18571:446;;;18616:38;18648:5;18616:38;:::i;:::-;18700:29;18718:10;18700:29;:::i;:::-;18690:8;18686:44;18883:2;18871:10;18868:18;18865:49;;;18904:8;18889:23;;18865:49;18927:80;18983:22;19001:3;18983:22;:::i;:::-;18973:8;18969:37;18956:11;18927:80;:::i;:::-;18586:431;;18571:446;18481:543;;;:::o;19030:117::-;19084:8;19134:5;19128:4;19124:16;19103:37;;19030:117;;;;:::o;19153:169::-;19197:6;19230:51;19278:1;19274:6;19266:5;19263:1;19259:13;19230:51;:::i;:::-;19226:56;19311:4;19305;19301:15;19291:25;;19204:118;19153:169;;;;:::o;19327:295::-;19403:4;19549:29;19574:3;19568:4;19549:29;:::i;:::-;19541:37;;19611:3;19608:1;19604:11;19598:4;19595:21;19587:29;;19327:295;;;;:::o;19627:1395::-;19744:37;19777:3;19744:37;:::i;:::-;19846:18;19838:6;19835:30;19832:56;;;19868:18;;:::i;:::-;19832:56;19912:38;19944:4;19938:11;19912:38;:::i;:::-;19997:67;20057:6;20049;20043:4;19997:67;:::i;:::-;20091:1;20115:4;20102:17;;20147:2;20139:6;20136:14;20164:1;20159:618;;;;20821:1;20838:6;20835:77;;;20887:9;20882:3;20878:19;20872:26;20863:35;;20835:77;20938:67;20998:6;20991:5;20938:67;:::i;:::-;20932:4;20925:81;20794:222;20129:887;;20159:618;20211:4;20207:9;20199:6;20195:22;20245:37;20277:4;20245:37;:::i;:::-;20304:1;20318:208;20332:7;20329:1;20326:14;20318:208;;;20411:9;20406:3;20402:19;20396:26;20388:6;20381:42;20462:1;20454:6;20450:14;20440:24;;20509:2;20498:9;20494:18;20481:31;;20355:4;20352:1;20348:12;20343:17;;20318:208;;;20554:6;20545:7;20542:19;20539:179;;;20612:9;20607:3;20603:19;20597:26;20655:48;20697:4;20689:6;20685:17;20674:9;20655:48;:::i;:::-;20647:6;20640:64;20562:156;20539:179;20764:1;20760;20752:6;20748:14;20744:22;20738:4;20731:36;20166:611;;;20129:887;;19719:1303;;;19627:1395;;:::o;21028:180::-;21076:77;21073:1;21066:88;21173:4;21170:1;21163:15;21197:4;21194:1;21187:15;21214:194;21254:4;21274:20;21292:1;21274:20;:::i;:::-;21269:25;;21308:20;21326:1;21308:20;:::i;:::-;21303:25;;21352:1;21349;21345:9;21337:17;;21376:1;21370:4;21367:11;21364:37;;;21381:18;;:::i;:::-;21364:37;21214:194;;;;:::o;21414:180::-;21462:77;21459:1;21452:88;21559:4;21556:1;21549:15;21583:4;21580:1;21573:15;21600:180;21648:77;21645:1;21638:88;21745:4;21742:1;21735:15;21769:4;21766:1;21759:15;21786:168;21869:11;21903:6;21898:3;21891:19;21943:4;21938:3;21934:14;21919:29;;21786:168;;;;:::o;21960:114::-;;:::o;22080:362::-;22221:3;22242:65;22305:1;22300:3;22242:65;:::i;:::-;22235:72;;22316:93;22405:3;22316:93;:::i;:::-;22434:1;22429:3;22425:11;22418:18;;22080:362;;;:::o;22448:748::-;22697:4;22735:3;22724:9;22720:19;22712:27;;22749:71;22817:1;22806:9;22802:17;22793:6;22749:71;:::i;:::-;22830:72;22898:2;22887:9;22883:18;22874:6;22830:72;:::i;:::-;22912;22980:2;22969:9;22965:18;22956:6;22912:72;:::i;:::-;23031:9;23025:4;23021:20;23016:2;23005:9;23001:18;22994:48;23059:130;23184:4;23059:130;:::i;:::-;23051:138;;22448:748;;;;;;:::o;23202:149::-;23238:7;23278:66;23271:5;23267:78;23256:89;;23202:149;;;:::o;23357:120::-;23429:23;23446:5;23429:23;:::i;:::-;23422:5;23419:34;23409:62;;23467:1;23464;23457:12;23409:62;23357:120;:::o;23483:141::-;23539:5;23570:6;23564:13;23555:22;;23586:32;23612:5;23586:32;:::i;:::-;23483:141;;;;:::o;23630:349::-;23699:6;23748:2;23736:9;23727:7;23723:23;23719:32;23716:119;;;23754:79;;:::i;:::-;23716:119;23874:1;23899:63;23954:7;23945:6;23934:9;23930:22;23899:63;:::i;:::-;23889:73;;23845:127;23630:349;;;;:::o;23985:148::-;24087:11;24124:3;24109:18;;23985:148;;;;:::o;24139:173::-;24279:25;24275:1;24267:6;24263:14;24256:49;24139:173;:::o;24318:402::-;24478:3;24499:85;24581:2;24576:3;24499:85;:::i;:::-;24492:92;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24318:402;;;:::o;24726:79::-;24765:7;24794:5;24783:16;;24726:79;;;:::o;24811:157::-;24916:45;24936:24;24954:5;24936:24;:::i;:::-;24916:45;:::i;:::-;24911:3;24904:58;24811:157;;:::o;24974:663::-;25215:3;25237:148;25381:3;25237:148;:::i;:::-;25230:155;;25395:75;25466:3;25457:6;25395:75;:::i;:::-;25495:2;25490:3;25486:12;25479:19;;25508:75;25579:3;25570:6;25508:75;:::i;:::-;25608:2;25603:3;25599:12;25592:19;;25628:3;25621:10;;24974:663;;;;;:::o;25643:180::-;25691:77;25688:1;25681:88;25788:4;25785:1;25778:15;25812:4;25809:1;25802:15;25829:176;25861:1;25878:20;25896:1;25878:20;:::i;:::-;25873:25;;25912:20;25930:1;25912:20;:::i;:::-;25907:25;;25951:1;25941:35;;25956:18;;:::i;:::-;25941:35;25997:1;25994;25990:9;25985:14;;25829:176;;;;:::o;26011:223::-;26151:34;26147:1;26139:6;26135:14;26128:58;26220:6;26215:2;26207:6;26203:15;26196:31;26011:223;:::o;26240:402::-;26400:3;26421:85;26503:2;26498:3;26421:85;:::i;:::-;26414:92;;26515:93;26604:3;26515:93;:::i;:::-;26633:2;26628:3;26624:12;26617:19;;26240:402;;;:::o;26648:663::-;26889:3;26911:148;27055:3;26911:148;:::i;:::-;26904:155;;27069:75;27140:3;27131:6;27069:75;:::i;:::-;27169:2;27164:3;27160:12;27153:19;;27182:75;27253:3;27244:6;27182:75;:::i;:::-;27282:2;27277:3;27273:12;27266:19;;27302:3;27295:10;;26648:663;;;;;:::o;27317:390::-;27423:3;27451:39;27484:5;27451:39;:::i;:::-;27506:89;27588:6;27583:3;27506:89;:::i;:::-;27499:96;;27604:65;27662:6;27657:3;27650:4;27643:5;27639:16;27604:65;:::i;:::-;27694:6;27689:3;27685:16;27678:23;;27427:280;27317:390;;;;:::o;27713:242::-;27882:66;27877:3;27870:79;27713:242;:::o;27961:542::-;28184:3;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28311:138;28445:3;28311:138;:::i;:::-;28474:2;28469:3;28465:12;28458:19;;28494:3;28487:10;;27961:542;;;;:::o;28509:242::-;28678:66;28673:3;28666:79;28509:242;:::o;28757:542::-;28980:3;29002:95;29093:3;29084:6;29002:95;:::i;:::-;28995:102;;29107:138;29241:3;29107:138;:::i;:::-;29270:2;29265:3;29261:12;29254:19;;29290:3;29283:10;;28757:542;;;;:::o;29305:170::-;29469:3;29464;29457:16;29305:170;:::o;29477:519::-;29699:3;29717:95;29808:3;29799:6;29717:95;:::i;:::-;29710:102;;29818:137;29951:3;29818:137;:::i;:::-;29976:1;29971:3;29967:11;29960:18;;29991:3;29984:10;;29477:519;;;;:::o;29998:419::-;30178:3;30196:95;30287:3;30278:6;30196:95;:::i;:::-;30189:102;;30304:95;30395:3;30386:6;30304:95;:::i;:::-;30297:102;;30412:3;30405:10;;29998:419;;;;;:::o;30419:171::-;30459:3;30474:20;30492:1;30474:20;:::i;:::-;30469:25;;30504:20;30522:1;30504:20;:::i;:::-;30499:25;;30543:1;30540;30536:9;30529:16;;30560:3;30557:1;30554:10;30551:36;;;30567:18;;:::i;:::-;30551:36;30419:171;;;;:::o;30592:233::-;30756:66;30751:3;30744:79;30592:233;:::o;30827:519::-;31049:3;31060:137;31193:3;31060:137;:::i;:::-;31218:1;31213:3;31209:11;31202:18;;31233:95;31324:3;31315:6;31233:95;:::i;:::-;31226:102;;31341:3;31334:10;;30827:519;;;;:::o;31348:234::-;31513:66;31508:3;31501:79;31348:234;:::o;31584:522::-;31807:3;31818:138;31952:3;31818:138;:::i;:::-;31977:2;31972:3;31968:12;31961:19;;31993:95;32084:3;32075:6;31993:95;:::i;:::-;31986:102;;32101:3;32094:10;;31584:522;;;;:::o;32108:563::-;32244:66;32240:1;32232:6;32228:14;32221:90;32341:34;32336:2;32328:6;32324:15;32317:59;32406:66;32401:2;32393:6;32389:15;32382:91;32503:66;32498:2;32490:6;32486:15;32479:91;32601:66;32595:3;32587:6;32583:16;32576:92;32108:563;:::o;32673:388::-;32833:3;32850:86;32932:3;32927;32850:86;:::i;:::-;32843:93;;32941;33030:3;32941:93;:::i;:::-;33055:3;33050;33046:13;33039:20;;32673:388;;;:::o;33063:525::-;33296:3;33314:95;33405:3;33396:6;33314:95;:::i;:::-;33307:102;;33422:148;33566:3;33422:148;:::i;:::-;33415:155;;33583:3;33576:10;;33063:525;;;;:::o;33610:794::-;33713:3;33746:5;33740:12;33771:36;33797:9;33771:36;:::i;:::-;33819:89;33901:6;33896:3;33819:89;:::i;:::-;33812:96;;33935:1;33924:9;33920:17;33947:1;33942:150;;;;34102:1;34097:305;;;;33913:489;;33942:150;34018:4;34014:9;34003;33999:25;33994:3;33987:38;34076:6;34069:14;34062:22;34054:6;34050:35;34045:3;34041:45;34034:52;;33942:150;;34097:305;34156:38;34188:5;34156:38;:::i;:::-;34212:1;34222:142;34236:6;34233:1;34230:13;34222:142;;;34306:7;34300:14;34296:1;34291:3;34287:11;34280:35;34352:1;34343:7;34339:15;34328:26;;34258:4;34255:1;34251:12;34246:17;;34222:142;;;34389:6;34384:3;34380:16;34373:23;;34104:298;;33913:489;;33717:687;;33610:794;;;;:::o;34406:413::-;34583:3;34601:92;34689:3;34680:6;34601:92;:::i;:::-;34594:99;;34706:95;34797:3;34788:6;34706:95;:::i;:::-;34699:102;;34814:3;34807:10;;34406:413;;;;;:::o;34821:234::-;34986:66;34981:3;34974:79;34821:234;:::o;35057:522::-;35280:3;35291:138;35425:3;35291:138;:::i;:::-;35450:2;35445:3;35441:12;35434:19;;35466:95;35557:3;35548:6;35466:95;:::i;:::-;35459:102;;35574:3;35567:10;;35057:522;;;;:::o;35581:167::-;35741:4;35736:3;35729:17;35581:167;:::o;35750:503::-;35972:3;35986:95;36077:3;36068:6;35986:95;:::i;:::-;35979:102;;36083:137;36216:3;36083:137;:::i;:::-;36237:1;36232:3;36228:11;36221:18;;36248:3;36241:10;;35750:503;;;;:::o;36273:286::-;36369:3;36382:70;36445:6;36440:3;36382:70;:::i;:::-;36375:77;;36454:56;36503:6;36498:3;36491:5;36454:56;:::i;:::-;36527:29;36549:6;36527:29;:::i;:::-;36522:3;36518:39;36511:46;;36273:286;;;;;:::o;36561:608::-;36766:4;36796:3;36785:9;36781:19;36773:27;;36802:71;36870:1;36859:9;36855:17;36846:6;36802:71;:::i;:::-;36875:72;36943:2;36932:9;36928:18;36919:6;36875:72;:::i;:::-;36949;37017:2;37006:9;37002:18;36993:6;36949:72;:::i;:::-;37060:9;37054:4;37050:20;37045:2;37034:9;37030:18;37023:48;37080:86;37161:4;37152:6;37144;37080:86;:::i;:::-;37072:94;;36561:608;;;;;;;;:::o;37171:193::-;37332:29;37327:3;37320:42;37171:193;:::o;37366:506::-;37589:3;37596:138;37730:3;37596:138;:::i;:::-;37751:2;37746:3;37742:12;37735:19;;37763:95;37854:3;37845:6;37763:95;:::i;:::-;37756:102;;37867:3;37860:10;;37366:506;;;;:::o;37874:166::-;38034:3;38029;38022:16;37874:166;:::o;38042:503::-;38264:3;38278:95;38369:3;38360:6;38278:95;:::i;:::-;38271:102;;38375:137;38508:3;38375:137;:::i;:::-;38529:1;38524:3;38520:11;38513:18;;38540:3;38533:10;;38042:503;;;;:::o;38547:166::-;38707:3;38702;38695:16;38547:166;:::o;38715:503::-;38937:3;38951:95;39042:3;39033:6;38951:95;:::i;:::-;38944:102;;39048:137;39181:3;39048:137;:::i;:::-;39202:1;39197:3;39193:11;39186:18;;39213:3;39206:10;;38715:503;;;;:::o;39220:82::-;39262:8;39293:5;39290:1;39286:13;39273:26;;39220:82;;;:::o;39304:700::-;39365:5;39372:4;39388:6;39379:15;;39404:5;39395:14;;39410:592;39431:1;39421:8;39418:15;39410:592;;;39502:4;39497:3;39493:14;39487:4;39484:24;39481:50;;;39511:18;;:::i;:::-;39481:50;39553:1;39543:8;39539:16;39536:387;;;39912:4;39905:5;39901:16;39892:25;;39536:387;39946:4;39940;39936:15;39928:23;;39968:32;39991:8;39968:32;:::i;:::-;39956:44;;39410:592;;;39304:700;;;;;;;:::o;40006:845::-;40060:5;40219:8;40209:40;;40240:1;40231:10;;40242:5;;40209:40;40260:4;40250:36;;40277:1;40268:10;;40279:5;;40250:36;40330:4;40362:1;40357:27;;;;40390:1;40385:143;;;;40323:205;;40357:27;40375:1;40366:10;;40377:5;;;40385:143;40414:3;40404:8;40401:17;40398:43;;;40421:18;;:::i;:::-;40398:43;40462:8;40459:1;40455:16;40446:25;;40489:3;40482:5;40479:14;40476:40;;;40496:18;;:::i;:::-;40476:40;40521:5;;;40323:205;;40613:2;40603:8;40600:16;40594:3;40588:4;40585:13;40581:36;40571:2;40561:8;40558:16;40553:2;40547:4;40544:12;40540:35;40532:87;40529:182;;;40645:8;40639:4;40635:19;40626:28;;40672:3;40665:5;40662:14;40659:40;;;40679:18;;:::i;:::-;40659:40;40704:5;;40529:182;40728:42;40766:3;40756:8;40750:4;40747:1;40728:42;:::i;:::-;40713:57;;;;40794:4;40789:3;40785:14;40778:5;40775:25;40772:51;;;40803:18;;:::i;:::-;40772:51;40844:4;40837:5;40833:16;40824:25;;40006:845;;;;;;:::o;40853:253::-;40911:5;40927:23;40945:4;40927:23;:::i;:::-;40919:31;;40963:25;40979:8;40963:25;:::i;:::-;40951:37;;40999:104;41036:66;41026:8;41020:4;40999:104;:::i;:::-;40990:113;;40853:253;;;;:::o;41108:152::-;41240:16;41236:1;41228:6;41224:14;41217:40;41108:152;:::o;41262:338::-;41404:3;41417:67;41481:2;41476:3;41417:67;:::i;:::-;41410:74;;41485:93;41574:3;41485:93;:::i;:::-;41595:2;41590:3;41586:12;41579:19;;41262:338;;;:::o;41602:391::-;41768:4;41798:2;41787:9;41783:18;41775:26;;41839:9;41833:4;41829:20;41825:1;41814:9;41810:17;41803:47;41859:131;41985:4;41859:131;:::i;:::-;41851:139;;41602:391;;;:::o;41995:149::-;42035:1;42044:20;42062:1;42044:20;:::i;:::-;42039:25;;42070:20;42088:1;42070:20;:::i;:::-;42065:25;;42101:1;42091:35;;42106:18;;:::i;:::-;42091:35;42140:1;42137;42133:9;42128:14;;41995:149;;;;:::o;42146:123::-;42203:5;42226:6;42220:13;42211:22;;42234:33;42261:5;42234:33;:::i;:::-;42146:123;;;;:::o;42271:307::-;42341:6;42382:2;42370:9;42361:7;42357:23;42353:32;42350:119;;;42388:79;;:::i;:::-;42350:119;42492:1;42509:64;42565:7;42556:6;42545:9;42541:22;42509:64;:::i;:::-;42499:74;;42471:104;42271:307;;;;:::o;42580:65::-;42617:7;42638:5;42627:16;;42580:65;;;:::o;42647:67::-;42686:7;42707:5;42696:16;;42647:67;;;:::o;42716:145::-;42813:45;42833:24;42851:5;42833:24;:::i;:::-;42813:45;:::i;:::-;42808:3;42801:58;42716:145;;:::o;42863:353::-;43003:3;43010:75;43081:3;43072:6;43010:75;:::i;:::-;43102:2;43097:3;43093:12;43086:19;;43107:75;43178:3;43169:6;43107:75;:::i;:::-;43199:2;43194:3;43190:12;43183:19;;43211:3;43204:10;;42863:353;;;;;:::o;43218:157::-;43350:21;43346:1;43338:6;43334:14;43327:45;43218:157;:::o;43377:338::-;43519:3;43532:67;43596:2;43591:3;43532:67;:::i;:::-;43525:74;;43600:93;43689:3;43600:93;:::i;:::-;43710:2;43705:3;43701:12;43694:19;;43377:338;;;:::o;43717:391::-;43883:4;43913:2;43902:9;43898:18;43890:26;;43954:9;43948:4;43944:20;43940:1;43929:9;43925:17;43918:47;43974:131;44100:4;43974:131;:::i;:::-;43966:139;;43717:391;;;:::o

Swarm Source

ipfs://c14b1d9505538d7fd93aad835a15075fdcc2518292600c6840b2eb56c56a12d3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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