ETH Price: $3,502.80 (+3.13%)

Contract

0xb49B0A61725A69f36f06c394720DEa462E797Fb4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...209934672024-10-18 15:52:5967 days ago1729266779IN
Fade Away Bunny: FAB Token
0 ETH0.0006806627.14741257
Transfer From209544162024-10-13 4:55:2373 days ago1728795323IN
Fade Away Bunny: FAB Token
0 ETH0.001252328.10191984
Set Approval For...202610662024-07-08 10:02:11169 days ago1720432931IN
Fade Away Bunny: FAB Token
0 ETH0.000108044.30935641
Transfer From201453392024-06-22 6:04:47186 days ago1719036287IN
Fade Away Bunny: FAB Token
0 ETH0.000309142
Set Approval For...192256822024-02-14 10:42:11314 days ago1707907331IN
Fade Away Bunny: FAB Token
0 ETH0.0009783720.82317354
Set Approval For...177249032023-07-19 4:35:59525 days ago1689741359IN
Fade Away Bunny: FAB Token
0 ETH0.0010199421.7467847
Set Approval For...169164042023-03-27 4:39:59639 days ago1679891999IN
Fade Away Bunny: FAB Token
0 ETH0.0004286717.09725607
Set Approval For...168712552023-03-20 20:26:47645 days ago1679344007IN
Fade Away Bunny: FAB Token
0 ETH0.0006185622.83802675
Set Approval For...168712462023-03-20 20:24:59645 days ago1679343899IN
Fade Away Bunny: FAB Token
0 ETH0.0010768222.91843608
Set Approval For...168667572023-03-20 5:19:11646 days ago1679289551IN
Fade Away Bunny: FAB Token
0 ETH0.0006037912.85072347
Set Approval For...168667122023-03-20 5:09:59646 days ago1679288999IN
Fade Away Bunny: FAB Token
0 ETH0.0006079712.96302982
Set Approval For...163210082023-01-02 18:54:11722 days ago1672685651IN
Fade Away Bunny: FAB Token
0 ETH0.0009567520.39946859
Set Approval For...162829932022-12-28 11:36:47727 days ago1672227407IN
Fade Away Bunny: FAB Token
0 ETH0.0006127613.06511776
Set Approval For...162666302022-12-26 4:46:59730 days ago1672030019IN
Fade Away Bunny: FAB Token
0 ETH0.0003167712.6340528
Set Approval For...162666292022-12-26 4:46:47730 days ago1672030007IN
Fade Away Bunny: FAB Token
0 ETH0.0003243312.93557078
Set Approval For...162322662022-12-21 9:44:59734 days ago1671615899IN
Fade Away Bunny: FAB Token
0 ETH0.000624613.29365032
Set Approval For...160932312022-12-01 23:26:47754 days ago1669937207IN
Fade Away Bunny: FAB Token
0 ETH0.0004978410.59591471
Set Approval For...159674582022-11-14 9:44:11771 days ago1668419051IN
Fade Away Bunny: FAB Token
0 ETH0.0006359313.53479751
Set Approval For...159421192022-11-10 20:51:23775 days ago1668113483IN
Fade Away Bunny: FAB Token
0 ETH0.0010366522.06354224
Set Approval For...158614742022-10-30 14:27:59786 days ago1667140079IN
Fade Away Bunny: FAB Token
0 ETH0.0004810310.23813805
Set Approval For...158245832022-10-25 10:44:47791 days ago1666694687IN
Fade Away Bunny: FAB Token
0 ETH0.0004834910.29038392
Set Approval For...156626742022-10-02 19:52:23814 days ago1664740343IN
Fade Away Bunny: FAB Token
0 ETH0.000282676.01629598
Set Approval For...156411842022-09-29 19:48:23817 days ago1664480903IN
Fade Away Bunny: FAB Token
0 ETH0.001184625.25757809
Set Approval For...154544122022-09-01 18:25:40845 days ago1662056740IN
Fade Away Bunny: FAB Token
0 ETH0.0007821416.64664214
Set Approval For...154543702022-09-01 18:16:41845 days ago1662056201IN
Fade Away Bunny: FAB Token
0 ETH0.0011224223.93185686
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FadeAwayBunnyNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-02
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-30
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-24
*/

// File: contracts/libs/Initializable.sol
pragma solidity ^0.8.0;

library EnumerableSetUpgradeable {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

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

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

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

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

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

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}
// File: contracts/libs/EIP712Base.sol



pragma solidity ^0.8.0;


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}
// File: contracts/libs/ContentMixin.sol



pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}
// File: openzeppelin-solidity/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/libs/NativeMetaTransaction.sol



pragma solidity ^0.8.0;



contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}
// File: openzeppelin-solidity/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: openzeppelin-solidity/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: openzeppelin-solidity/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: openzeppelin-solidity/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: openzeppelin-solidity/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet;
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSetUpgradeable.UintSet) _holderTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _holderTokens[to].add(tokenId);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];

        _holderTokens[from].remove(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/ERC721Tradable.sol



pragma solidity ^0.8.0;








contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    address proxyRegistryAddress;
    address public routerAddress;
    uint256 private _currentTokenId = 0;

    modifier onlyRouter() {
        require(msg.sender == routerAddress, "You are not Router");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _initializeEIP712(_name);
    }

    /// @dev Assigns a new address to act as the Router. Only available to the current CEO.
    /// @param _newRouter The address of the new Router
    function setRouter(address _newRouter) external onlyOwner {
        routerAddress = _newRouter;
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function delegatedMintTo(address _to) public onlyRouter returns (uint256) {
        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _incrementTokenId();
        return newTokenId;
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function mintTo(address _to) public onlyOwner returns (uint256) {
        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _incrementTokenId();
        return newTokenId;
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        _currentTokenId++;
    }

    function baseTokenURI() virtual public view returns (string memory);

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), "api/token/", Strings.toString(_tokenId)));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }
}
// File: contracts/FadeAwayBunnyNFT.sol



pragma solidity ^0.8.0;


/**
 * @title Creature
 * Creature - a contract for my non-fungible creatures.
 */
contract FadeAwayBunnyNFT is ERC721Tradable {
    event Birth(address owner, uint256 fadeAwayBunnyId, uint256 matronId, uint256 sireId, bytes32 genes);

    struct FadeAwayBunny {
        bytes32 genes;
        uint64 birthTime;
        uint32 matronId;
        uint32 sireId;
        uint16 generation;
    }
    string baseURI;
    mapping(uint256 => FadeAwayBunny) public bunnies;

    constructor(address _proxyRegistryAddress)
        ERC721Tradable("Fade Away Bunny Collection", "FAB", _proxyRegistryAddress)
    {}

    /// @dev Assigns a new address to act as the base URI. Only available to the current Owner.
    /// @param _baseURI The address of the new base URI
    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function _createFadeAwayBunny(
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        bytes32 _genes,
        address _owner
    )
        internal
        returns (uint256)
    {
        uint256 nextTokenId = delegatedMintTo(_owner);

        bunnies[nextTokenId] = FadeAwayBunny({
            genes: _genes,
            birthTime: uint64(block.timestamp),
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            generation: uint16(_generation)
        });

        emit Birth(_owner, nextTokenId, _matronId, _sireId, _genes);
        return nextTokenId;
    }

    function createFadeAwayBunny(
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        bytes32 _genes,
        address _owner
    )
        public onlyRouter returns (uint)
    {
        return _createFadeAwayBunny(_matronId, _sireId, _generation, _genes, _owner);
    }

    function baseTokenURI() override public view returns (string memory) {
        return baseURI;
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), "api/contract"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fadeAwayBunnyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"matronId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sireId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"genes","type":"bytes32"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bunnies","outputs":[{"internalType":"bytes32","name":"genes","type":"bytes32"},{"internalType":"uint64","name":"birthTime","type":"uint64"},{"internalType":"uint32","name":"matronId","type":"uint32"},{"internalType":"uint32","name":"sireId","type":"uint32"},{"internalType":"uint16","name":"generation","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_sireId","type":"uint256"},{"internalType":"uint256","name":"_generation","type":"uint256"},{"internalType":"bytes32","name":"_genes","type":"bytes32"},{"internalType":"address","name":"_owner","type":"address"}],"name":"createFadeAwayBunny","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"delegatedMintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff02191690831515021790555060006011553480156200003157600080fd5b506040516200564d3803806200564d833981810160405281019062000057919062000510565b6040518060400160405280601a81526020017f4661646520417761792042756e6e7920436f6c6c656374696f6e0000000000008152506040518060400160405280600381526020017f46414200000000000000000000000000000000000000000000000000000000008152508282828160009080519060200190620000de92919062000449565b508060019080519060200190620000f792919062000449565b5050506200011a6200010e6200017660201b60201c565b6200019260201b60201c565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200016c836200025860201b60201c565b5050505062000706565b60006200018d620002da60201b62001b251760201c565b905090565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600b60009054906101000a900460ff1615620002ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a290620005e8565b60405180910390fd5b620002bc816200038d60201b60201c565b6001600b60006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200038657600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506200038a565b3390505b90565b6040518060800160405280604f8152602001620055fe604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620004046200043c60201b60201c565b60001b6040516020016200041d9594939291906200058b565b60405160208183030381529060405280519060200120600c8190555050565b6000804690508091505090565b828054620004579062000659565b90600052602060002090601f0160209004810192826200047b5760008555620004c7565b82601f106200049657805160ff1916838001178555620004c7565b82800160010185558215620004c7579182015b82811115620004c6578251825591602001919060010190620004a9565b5b509050620004d69190620004da565b5090565b5b80821115620004f5576000816000905550600101620004db565b5090565b6000815190506200050a81620006ec565b92915050565b600060208284031215620005295762000528620006be565b5b60006200053984828501620004f9565b91505092915050565b6200054d816200061b565b82525050565b6200055e816200062f565b82525050565b600062000573600e836200060a565b91506200058082620006c3565b602082019050919050565b600060a082019050620005a2600083018862000553565b620005b1602083018762000553565b620005c0604083018662000553565b620005cf606083018562000542565b620005de608083018462000553565b9695505050505050565b60006020820190508181036000830152620006038162000564565b9050919050565b600082825260208201905092915050565b6000620006288262000639565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200067257607f821691505b602082108114156200068957620006886200068f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b620006f7816200061b565b81146200070357600080fd5b50565b614ee880620007166000396000f3fe6080604052600436106101ee5760003560e01c80636180324b1161010d578063b88d4fde116100a0578063d547cfb71161006f578063d547cfb714610754578063e8a3d4851461077f578063e985e9c5146107aa578063f2fde38b146107e7578063fc7cf39814610810576101ee565b8063b88d4fde14610684578063c0d78655146106ad578063c87b56dd146106d6578063cf7bc71714610713576101ee565b8063755edd17116100dc578063755edd17146105c85780638da5cb5b1461060557806395d89b4114610630578063a22cb4651461065b576101ee565b80636180324b146104fa5780636352211e1461053757806370a0823114610574578063715018a6146105b1576101ee565b806323b872dd116101855780633408e470116101545780633408e4701461044057806342842e0e1461046b5780634f6ccce71461049457806355f804b3146104d1576101ee565b806323b872dd146103725780632d0335ab1461039b5780632f745c59146103d85780633268cc5614610415576101ee565b80630c53c51c116101c15780630c53c51c146102c15780630f7e5970146102f157806318160ddd1461031c57806320379ee514610347576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613698565b61084d565b6040516102279190613ea0565b60405180910390f35b34801561023c57600080fd5b506102456108c7565b6040516102529190613fd5565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613768565b610959565b60405161028f9190613da8565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613658565b6109de565b005b6102db60048036038101906102d691906135c1565b610af6565b6040516102e89190613fb3565b60405180910390f35b3480156102fd57600080fd5b50610306610d68565b6040516103139190613fd5565b60405180910390f35b34801561032857600080fd5b50610331610da1565b60405161033e9190614297565b60405180910390f35b34801561035357600080fd5b5061035c610dae565b6040516103699190613ebb565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906134ab565b610db8565b005b3480156103a757600080fd5b506103c260048036038101906103bd919061343e565b610e18565b6040516103cf9190614297565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613658565b610e61565b60405161040c9190614297565b60405180910390f35b34801561042157600080fd5b5061042a610f06565b6040516104379190613da8565b60405180910390f35b34801561044c57600080fd5b50610455610f2c565b6040516104629190614297565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906134ab565b610f39565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613768565b610f59565b6040516104c89190614297565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f3919061371f565b610fca565b005b34801561050657600080fd5b50610521600480360381019061051c919061343e565b611060565b60405161052e9190614297565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190613768565b611119565b60405161056b9190613da8565b60405180910390f35b34801561058057600080fd5b5061059b6004803603810190610596919061343e565b6111cb565b6040516105a89190614297565b60405180910390f35b3480156105bd57600080fd5b506105c6611283565b005b3480156105d457600080fd5b506105ef60048036038101906105ea919061343e565b61130b565b6040516105fc9190614297565b60405180910390f35b34801561061157600080fd5b5061061a6113b0565b6040516106279190613da8565b60405180910390f35b34801561063c57600080fd5b506106456113da565b6040516106529190613fd5565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613581565b61146c565b005b34801561069057600080fd5b506106ab60048036038101906106a691906134fe565b6115ed565b005b3480156106b957600080fd5b506106d460048036038101906106cf919061343e565b61164f565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190613768565b61170f565b60405161070a9190613fd5565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190613768565b611749565b60405161074b959493929190613f1b565b60405180910390f35b34801561076057600080fd5b506107696117c1565b6040516107769190613fd5565b60405180910390f35b34801561078b57600080fd5b50610794611853565b6040516107a19190613fd5565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc919061346b565b611881565b6040516107de9190613ea0565b60405180910390f35b3480156107f357600080fd5b5061080e6004803603810190610809919061343e565b611983565b005b34801561081c57600080fd5b5061083760048036038101906108329190613795565b611a7b565b6040516108449190614297565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c057506108bf82611bd6565b5b9050919050565b6060600080546108d690614565565b80601f016020809104026020016040519081016040528092919081815260200182805461090290614565565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b600061096482611cb8565b6109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099a90614197565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e982611119565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614237565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a79611d24565b73ffffffffffffffffffffffffffffffffffffffff161480610aa85750610aa781610aa2611d24565b611881565b5b610ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ade90614117565b60405180910390fd5b610af18383611d33565b505050565b606060006040518060600160405280600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b798782878787611dec565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906141f7565b60405180910390fd5b610c0b6001600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef590919063ffffffff16565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c8193929190613dc3565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610cb6929190613cf8565b604051602081830303815290604052604051610cd29190613ce1565b6000604051808303816000865af19150503d8060008114610d0f576040519150601f19603f3d011682016040523d82523d6000602084013e610d14565b606091505b509150915081610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090614057565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600980549050905090565b6000600c54905090565b610dc9610dc3611d24565b82611f0b565b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90614257565b60405180910390fd5b610e13838383611fe9565b505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e6c836111cb565b8210610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490613ff7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000804690508091505090565b610f54838383604051806020016040528060008152506115ed565b505050565b6000610f63610da1565b8210610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90614277565b60405180910390fd5b60098281548110610fb857610fb761472c565b5b90600052602060002001549050919050565b610fd2611d24565b73ffffffffffffffffffffffffffffffffffffffff16610ff06113b0565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906141b7565b60405180910390fd5b806012908051906020019061105c929190613213565b5050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614217565b60405180910390fd5b60006110fc612245565b90506111088382612262565b611110612430565b80915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990614157565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123390614137565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128b611d24565b73ffffffffffffffffffffffffffffffffffffffff166112a96113b0565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f6906141b7565b60405180910390fd5b611309600061244a565b565b6000611315611d24565b73ffffffffffffffffffffffffffffffffffffffff166113336113b0565b73ffffffffffffffffffffffffffffffffffffffff1614611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906141b7565b60405180910390fd5b6000611393612245565b905061139f8382612262565b6113a7612430565b80915050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113e990614565565b80601f016020809104026020016040519081016040528092919081815260200182805461141590614565565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050905090565b611474611d24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906140b7565b60405180910390fd5b80600560006114ef611d24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661159c611d24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115e19190613ea0565b60405180910390a35050565b6115fe6115f8611d24565b83611f0b565b61163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490614257565b60405180910390fd5b61164984848484612510565b50505050565b611657611d24565b73ffffffffffffffffffffffffffffffffffffffff166116756113b0565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906141b7565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606117196117c1565b6117228361256c565b604051602001611733929190613d20565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090508060000154908060010160009054906101000a900467ffffffffffffffff16908060010160089054906101000a900463ffffffff169080600101600c9054906101000a900463ffffffff16908060010160109054906101000a900461ffff16905085565b6060601280546117d090614565565b80601f01602080910402602001604051908101604052809291908181526020018280546117fc90614565565b80156118495780601f1061181e57610100808354040283529160200191611849565b820191906000526020600020905b81548152906001019060200180831161182c57829003601f168201915b5050505050905090565b606061185d6117c1565b60405160200161186d9190613d4f565b604051602081830303815290604052905090565b600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118f99190613da8565b60206040518083038186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194991906136f2565b73ffffffffffffffffffffffffffffffffffffffff16141561196f57600191505061197d565b61197984846126cd565b9150505b92915050565b61198b611d24565b73ffffffffffffffffffffffffffffffffffffffff166119a96113b0565b73ffffffffffffffffffffffffffffffffffffffff16146119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f6906141b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614037565b60405180910390fd5b611a788161244a565b50565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614217565b60405180910390fd5b611b1a8686868686612761565b905095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bcf57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611bd3565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb15750611cb0826128bc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611d2e611b25565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683611119565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906140f7565b60405180910390fd5b6001611e70611e6b87612926565b61298e565b83868660405160008152602001604052604051611e909493929190613f6e565b6020604051602081039080840390855afa158015611eb2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611f039190614387565b905092915050565b6000611f1682611cb8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c906140d7565b60405180910390fd5b6000611f6083611119565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fcf57508373ffffffffffffffffffffffffffffffffffffffff16611fb784610959565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fe05750611fdf8185611881565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661200982611119565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612056906141d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690614097565b60405180910390fd5b6120da8383836129c7565b6120e5600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612135919061440e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218c9190614387565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061225d6001601154611ef590919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614177565b60405180910390fd5b6122db81611cb8565b1561231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614077565b60405180910390fd5b612327600083836129c7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123779190614387565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60116000815480929190612443906145c8565b9190505550565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251b848484611fe9565b61252784848484612adb565b612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d90614017565b60405180910390fd5b50505050565b606060008214156125b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c8565b600082905060005b600082146125e65780806125cf906145c8565b915050600a826125df91906143dd565b91506125bc565b60008167ffffffffffffffff8111156126025761260161475b565b5b6040519080825280601f01601f1916602001820160405280156126345781602001600182028036833780820191505090505b5090505b600085146126c15760018261264d919061440e565b9150600a8561265c919061463f565b60306126689190614387565b60f81b81838151811061267e5761267d61472c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ba91906143dd565b9450612638565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061276d83611060565b90506040518060a001604052808581526020014267ffffffffffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018661ffff16815250601360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600101600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160106101000a81548161ffff021916908361ffff1602179055509050507fc5e97953600c388cf075a44f9582c0082e874129b74f682c2c2423e8bee13c5f83828989886040516128a7959493929190613e4d565b60405180910390a18091505095945050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051806080016040528060438152602001614e706043913980519060200120826000015183602001518460400151805190602001206040516020016129719493929190613ed6565b604051602081830303815290604052805190602001209050919050565b6000612998610dae565b826040516020016129aa929190613d71565b604051602081830303815290604052805190602001209050919050565b6129d2838383612c72565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a1557612a1081612c77565b612a54565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a5357612a528382612cc0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9757612a9281612e7f565b612ad6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ad557612ad48282612f50565b5b5b505050565b6000612afc8473ffffffffffffffffffffffffffffffffffffffff16613021565b15612c65578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b25611d24565b8786866040518563ffffffff1660e01b8152600401612b479493929190613e01565b602060405180830381600087803b158015612b6157600080fd5b505af1925050508015612b9257506040513d601f19601f82011682018060405250810190612b8f91906136c5565b60015b612c15573d8060008114612bc2576040519150601f19603f3d011682016040523d82523d6000602084013e612bc7565b606091505b50600081511415612c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0490614017565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6a565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ccd846111cb565b612cd7919061440e565b9050600060086000848152602001908152602001600020549050818114612dbc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009055612e7883600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061303490919063ffffffff16565b5050505050565b60006001600980549050612e93919061440e565b90506000600a6000848152602001908152602001600020549050600060098381548110612ec357612ec261472c565b5b906000526020600020015490508060098381548110612ee557612ee461472c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3457612f336146fd565b5b6001900381819060005260206000200160009055905550505050565b6000612f5b836111cb565b9050612fae82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061304e90919063ffffffff16565b5081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000613046836000018360001b613068565b905092915050565b6000613060836000018360001b613180565b905092915050565b6000808360010160008481526020019081526020016000205490506000811461317457600060018261309a919061440e565b90506000600186600001805490506130b2919061440e565b905060008660000182815481106130cc576130cb61472c565b5b90600052602060002001549050808760000184815481106130f0576130ef61472c565b5b906000526020600020018190555060018361310b9190614387565b8760010160008381526020019081526020016000208190555086600001805480613138576131376146fd565b5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061317a565b60009150505b92915050565b600061318c83836131f0565b6131e55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506131ea565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461321f90614565565b90600052602060002090601f0160209004810192826132415760008555613288565b82601f1061325a57805160ff1916838001178555613288565b82800160010185558215613288579182015b8281111561328757825182559160200191906001019061326c565b5b5090506132959190613299565b5090565b5b808211156132b257600081600090555060010161329a565b5090565b60006132c96132c4846142d7565b6142b2565b9050828152602081018484840111156132e5576132e461478f565b5b6132f0848285614523565b509392505050565b600061330b61330684614308565b6142b2565b9050828152602081018484840111156133275761332661478f565b5b613332848285614523565b509392505050565b60008135905061334981614dce565b92915050565b60008135905061335e81614de5565b92915050565b60008135905061337381614dfc565b92915050565b60008135905061338881614e13565b92915050565b60008151905061339d81614e13565b92915050565b600082601f8301126133b8576133b761478a565b5b81356133c88482602086016132b6565b91505092915050565b6000815190506133e081614e2a565b92915050565b600082601f8301126133fb576133fa61478a565b5b813561340b8482602086016132f8565b91505092915050565b60008135905061342381614e41565b92915050565b60008135905061343881614e58565b92915050565b60006020828403121561345457613453614799565b5b60006134628482850161333a565b91505092915050565b6000806040838503121561348257613481614799565b5b60006134908582860161333a565b92505060206134a18582860161333a565b9150509250929050565b6000806000606084860312156134c4576134c3614799565b5b60006134d28682870161333a565b93505060206134e38682870161333a565b92505060406134f486828701613414565b9150509250925092565b6000806000806080858703121561351857613517614799565b5b60006135268782880161333a565b94505060206135378782880161333a565b935050604061354887828801613414565b925050606085013567ffffffffffffffff81111561356957613568614794565b5b613575878288016133a3565b91505092959194509250565b6000806040838503121561359857613597614799565b5b60006135a68582860161333a565b92505060206135b78582860161334f565b9150509250929050565b600080600080600060a086880312156135dd576135dc614799565b5b60006135eb8882890161333a565b955050602086013567ffffffffffffffff81111561360c5761360b614794565b5b613618888289016133a3565b945050604061362988828901613364565b935050606061363a88828901613364565b925050608061364b88828901613429565b9150509295509295909350565b6000806040838503121561366f5761366e614799565b5b600061367d8582860161333a565b925050602061368e85828601613414565b9150509250929050565b6000602082840312156136ae576136ad614799565b5b60006136bc84828501613379565b91505092915050565b6000602082840312156136db576136da614799565b5b60006136e98482850161338e565b91505092915050565b60006020828403121561370857613707614799565b5b6000613716848285016133d1565b91505092915050565b60006020828403121561373557613734614799565b5b600082013567ffffffffffffffff81111561375357613752614794565b5b61375f848285016133e6565b91505092915050565b60006020828403121561377e5761377d614799565b5b600061378c84828501613414565b91505092915050565b600080600080600060a086880312156137b1576137b0614799565b5b60006137bf88828901613414565b95505060206137d088828901613414565b94505060406137e188828901613414565b93505060606137f288828901613364565b92505060806138038882890161333a565b9150509295509295909350565b61381981614454565b82525050565b61382881614442565b82525050565b61383f61383a82614442565b614611565b82525050565b61384e81614466565b82525050565b61385d81614472565b82525050565b61387461386f82614472565b614623565b82525050565b600061388582614339565b61388f818561434f565b935061389f818560208601614532565b6138a88161479e565b840191505092915050565b60006138be82614339565b6138c88185614360565b93506138d8818560208601614532565b80840191505092915050565b60006138ef82614344565b6138f9818561436b565b9350613909818560208601614532565b6139128161479e565b840191505092915050565b600061392882614344565b613932818561437c565b9350613942818560208601614532565b80840191505092915050565b600061395b602b8361436b565b9150613966826147bc565b604082019050919050565b600061397e60328361436b565b91506139898261480b565b604082019050919050565b60006139a160268361436b565b91506139ac8261485a565b604082019050919050565b60006139c4601c8361436b565b91506139cf826148a9565b602082019050919050565b60006139e7601c8361436b565b91506139f2826148d2565b602082019050919050565b6000613a0a60028361437c565b9150613a15826148fb565b600282019050919050565b6000613a2d60248361436b565b9150613a3882614924565b604082019050919050565b6000613a5060198361436b565b9150613a5b82614973565b602082019050919050565b6000613a73602c8361436b565b9150613a7e8261499c565b604082019050919050565b6000613a9660258361436b565b9150613aa1826149eb565b604082019050919050565b6000613ab960388361436b565b9150613ac482614a3a565b604082019050919050565b6000613adc602a8361436b565b9150613ae782614a89565b604082019050919050565b6000613aff60298361436b565b9150613b0a82614ad8565b604082019050919050565b6000613b22600a8361437c565b9150613b2d82614b27565b600a82019050919050565b6000613b4560208361436b565b9150613b5082614b50565b602082019050919050565b6000613b68602c8361436b565b9150613b7382614b79565b604082019050919050565b6000613b8b60208361436b565b9150613b9682614bc8565b602082019050919050565b6000613bae600c8361437c565b9150613bb982614bf1565b600c82019050919050565b6000613bd160298361436b565b9150613bdc82614c1a565b604082019050919050565b6000613bf460218361436b565b9150613bff82614c69565b604082019050919050565b6000613c1760128361436b565b9150613c2282614cb8565b602082019050919050565b6000613c3a60218361436b565b9150613c4582614ce1565b604082019050919050565b6000613c5d60318361436b565b9150613c6882614d30565b604082019050919050565b6000613c80602c8361436b565b9150613c8b82614d7f565b604082019050919050565b613c9f816144ba565b82525050565b613cae816144e8565b82525050565b613cbd816144f2565b82525050565b613ccc81614502565b82525050565b613cdb81614516565b82525050565b6000613ced82846138b3565b915081905092915050565b6000613d0482856138b3565b9150613d10828461382e565b6014820191508190509392505050565b6000613d2c828561391d565b9150613d3782613b15565b9150613d43828461391d565b91508190509392505050565b6000613d5b828461391d565b9150613d6682613ba1565b915081905092915050565b6000613d7c826139fd565b9150613d888285613863565b602082019150613d988284613863565b6020820191508190509392505050565b6000602082019050613dbd600083018461381f565b92915050565b6000606082019050613dd8600083018661381f565b613de56020830185613810565b8181036040830152613df7818461387a565b9050949350505050565b6000608082019050613e16600083018761381f565b613e23602083018661381f565b613e306040830185613ca5565b8181036060830152613e42818461387a565b905095945050505050565b600060a082019050613e62600083018861381f565b613e6f6020830187613ca5565b613e7c6040830186613ca5565b613e896060830185613ca5565b613e966080830184613854565b9695505050505050565b6000602082019050613eb56000830184613845565b92915050565b6000602082019050613ed06000830184613854565b92915050565b6000608082019050613eeb6000830187613854565b613ef86020830186613ca5565b613f05604083018561381f565b613f126060830184613854565b95945050505050565b600060a082019050613f306000830188613854565b613f3d6020830187613cc3565b613f4a6040830186613cb4565b613f576060830185613cb4565b613f646080830184613c96565b9695505050505050565b6000608082019050613f836000830187613854565b613f906020830186613cd2565b613f9d6040830185613854565b613faa6060830184613854565b95945050505050565b60006020820190508181036000830152613fcd818461387a565b905092915050565b60006020820190508181036000830152613fef81846138e4565b905092915050565b600060208201905081810360008301526140108161394e565b9050919050565b6000602082019050818103600083015261403081613971565b9050919050565b6000602082019050818103600083015261405081613994565b9050919050565b60006020820190508181036000830152614070816139b7565b9050919050565b60006020820190508181036000830152614090816139da565b9050919050565b600060208201905081810360008301526140b081613a20565b9050919050565b600060208201905081810360008301526140d081613a43565b9050919050565b600060208201905081810360008301526140f081613a66565b9050919050565b6000602082019050818103600083015261411081613a89565b9050919050565b6000602082019050818103600083015261413081613aac565b9050919050565b6000602082019050818103600083015261415081613acf565b9050919050565b6000602082019050818103600083015261417081613af2565b9050919050565b6000602082019050818103600083015261419081613b38565b9050919050565b600060208201905081810360008301526141b081613b5b565b9050919050565b600060208201905081810360008301526141d081613b7e565b9050919050565b600060208201905081810360008301526141f081613bc4565b9050919050565b6000602082019050818103600083015261421081613be7565b9050919050565b6000602082019050818103600083015261423081613c0a565b9050919050565b6000602082019050818103600083015261425081613c2d565b9050919050565b6000602082019050818103600083015261427081613c50565b9050919050565b6000602082019050818103600083015261429081613c73565b9050919050565b60006020820190506142ac6000830184613ca5565b92915050565b60006142bc6142cd565b90506142c88282614597565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f2576142f161475b565b5b6142fb8261479e565b9050602081019050919050565b600067ffffffffffffffff8211156143235761432261475b565b5b61432c8261479e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614392826144e8565b915061439d836144e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d2576143d1614670565b5b828201905092915050565b60006143e8826144e8565b91506143f3836144e8565b9250826144035761440261469f565b5b828204905092915050565b6000614419826144e8565b9150614424836144e8565b92508282101561443757614436614670565b5b828203905092915050565b600061444d826144c8565b9050919050565b600061445f826144c8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006144b382614442565b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614550578082015181840152602081019050614535565b8381111561455f576000848401525b50505050565b6000600282049050600182168061457d57607f821691505b60208210811415614591576145906146ce565b5b50919050565b6145a08261479e565b810181811067ffffffffffffffff821117156145bf576145be61475b565b5b80604052505050565b60006145d3826144e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561460657614605614670565b5b600182019050919050565b600061461c8261462d565b9050919050565b6000819050919050565b6000614638826147af565b9050919050565b600061464a826144e8565b9150614655836144e8565b9250826146655761466461469f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6170692f746f6b656e2f00000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6170692f636f6e74726163740000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420526f757465720000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614dd781614442565b8114614de257600080fd5b50565b614dee81614466565b8114614df957600080fd5b50565b614e0581614472565b8114614e1057600080fd5b50565b614e1c8161447c565b8114614e2757600080fd5b50565b614e33816144a8565b8114614e3e57600080fd5b50565b614e4a816144e8565b8114614e5557600080fd5b50565b614e6181614516565b8114614e6c57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212200b11dbcf048452e5032862e41ce8d4b1d87714a76d60f1665f32d5121440c70264736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80636180324b1161010d578063b88d4fde116100a0578063d547cfb71161006f578063d547cfb714610754578063e8a3d4851461077f578063e985e9c5146107aa578063f2fde38b146107e7578063fc7cf39814610810576101ee565b8063b88d4fde14610684578063c0d78655146106ad578063c87b56dd146106d6578063cf7bc71714610713576101ee565b8063755edd17116100dc578063755edd17146105c85780638da5cb5b1461060557806395d89b4114610630578063a22cb4651461065b576101ee565b80636180324b146104fa5780636352211e1461053757806370a0823114610574578063715018a6146105b1576101ee565b806323b872dd116101855780633408e470116101545780633408e4701461044057806342842e0e1461046b5780634f6ccce71461049457806355f804b3146104d1576101ee565b806323b872dd146103725780632d0335ab1461039b5780632f745c59146103d85780633268cc5614610415576101ee565b80630c53c51c116101c15780630c53c51c146102c15780630f7e5970146102f157806318160ddd1461031c57806320379ee514610347576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613698565b61084d565b6040516102279190613ea0565b60405180910390f35b34801561023c57600080fd5b506102456108c7565b6040516102529190613fd5565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613768565b610959565b60405161028f9190613da8565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613658565b6109de565b005b6102db60048036038101906102d691906135c1565b610af6565b6040516102e89190613fb3565b60405180910390f35b3480156102fd57600080fd5b50610306610d68565b6040516103139190613fd5565b60405180910390f35b34801561032857600080fd5b50610331610da1565b60405161033e9190614297565b60405180910390f35b34801561035357600080fd5b5061035c610dae565b6040516103699190613ebb565b60405180910390f35b34801561037e57600080fd5b50610399600480360381019061039491906134ab565b610db8565b005b3480156103a757600080fd5b506103c260048036038101906103bd919061343e565b610e18565b6040516103cf9190614297565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613658565b610e61565b60405161040c9190614297565b60405180910390f35b34801561042157600080fd5b5061042a610f06565b6040516104379190613da8565b60405180910390f35b34801561044c57600080fd5b50610455610f2c565b6040516104629190614297565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906134ab565b610f39565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613768565b610f59565b6040516104c89190614297565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f3919061371f565b610fca565b005b34801561050657600080fd5b50610521600480360381019061051c919061343e565b611060565b60405161052e9190614297565b60405180910390f35b34801561054357600080fd5b5061055e60048036038101906105599190613768565b611119565b60405161056b9190613da8565b60405180910390f35b34801561058057600080fd5b5061059b6004803603810190610596919061343e565b6111cb565b6040516105a89190614297565b60405180910390f35b3480156105bd57600080fd5b506105c6611283565b005b3480156105d457600080fd5b506105ef60048036038101906105ea919061343e565b61130b565b6040516105fc9190614297565b60405180910390f35b34801561061157600080fd5b5061061a6113b0565b6040516106279190613da8565b60405180910390f35b34801561063c57600080fd5b506106456113da565b6040516106529190613fd5565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613581565b61146c565b005b34801561069057600080fd5b506106ab60048036038101906106a691906134fe565b6115ed565b005b3480156106b957600080fd5b506106d460048036038101906106cf919061343e565b61164f565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190613768565b61170f565b60405161070a9190613fd5565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190613768565b611749565b60405161074b959493929190613f1b565b60405180910390f35b34801561076057600080fd5b506107696117c1565b6040516107769190613fd5565b60405180910390f35b34801561078b57600080fd5b50610794611853565b6040516107a19190613fd5565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc919061346b565b611881565b6040516107de9190613ea0565b60405180910390f35b3480156107f357600080fd5b5061080e6004803603810190610809919061343e565b611983565b005b34801561081c57600080fd5b5061083760048036038101906108329190613795565b611a7b565b6040516108449190614297565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c057506108bf82611bd6565b5b9050919050565b6060600080546108d690614565565b80601f016020809104026020016040519081016040528092919081815260200182805461090290614565565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b600061096482611cb8565b6109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099a90614197565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e982611119565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614237565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a79611d24565b73ffffffffffffffffffffffffffffffffffffffff161480610aa85750610aa781610aa2611d24565b611881565b5b610ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ade90614117565b60405180910390fd5b610af18383611d33565b505050565b606060006040518060600160405280600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b798782878787611dec565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906141f7565b60405180910390fd5b610c0b6001600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef590919063ffffffff16565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c8193929190613dc3565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610cb6929190613cf8565b604051602081830303815290604052604051610cd29190613ce1565b6000604051808303816000865af19150503d8060008114610d0f576040519150601f19603f3d011682016040523d82523d6000602084013e610d14565b606091505b509150915081610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090614057565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600980549050905090565b6000600c54905090565b610dc9610dc3611d24565b82611f0b565b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90614257565b60405180910390fd5b610e13838383611fe9565b505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e6c836111cb565b8210610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490613ff7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000804690508091505090565b610f54838383604051806020016040528060008152506115ed565b505050565b6000610f63610da1565b8210610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90614277565b60405180910390fd5b60098281548110610fb857610fb761472c565b5b90600052602060002001549050919050565b610fd2611d24565b73ffffffffffffffffffffffffffffffffffffffff16610ff06113b0565b73ffffffffffffffffffffffffffffffffffffffff1614611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d906141b7565b60405180910390fd5b806012908051906020019061105c929190613213565b5050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614217565b60405180910390fd5b60006110fc612245565b90506111088382612262565b611110612430565b80915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990614157565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123390614137565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128b611d24565b73ffffffffffffffffffffffffffffffffffffffff166112a96113b0565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f6906141b7565b60405180910390fd5b611309600061244a565b565b6000611315611d24565b73ffffffffffffffffffffffffffffffffffffffff166113336113b0565b73ffffffffffffffffffffffffffffffffffffffff1614611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906141b7565b60405180910390fd5b6000611393612245565b905061139f8382612262565b6113a7612430565b80915050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113e990614565565b80601f016020809104026020016040519081016040528092919081815260200182805461141590614565565b80156114625780601f1061143757610100808354040283529160200191611462565b820191906000526020600020905b81548152906001019060200180831161144557829003601f168201915b5050505050905090565b611474611d24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906140b7565b60405180910390fd5b80600560006114ef611d24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661159c611d24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115e19190613ea0565b60405180910390a35050565b6115fe6115f8611d24565b83611f0b565b61163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490614257565b60405180910390fd5b61164984848484612510565b50505050565b611657611d24565b73ffffffffffffffffffffffffffffffffffffffff166116756113b0565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906141b7565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606117196117c1565b6117228361256c565b604051602001611733929190613d20565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090508060000154908060010160009054906101000a900467ffffffffffffffff16908060010160089054906101000a900463ffffffff169080600101600c9054906101000a900463ffffffff16908060010160109054906101000a900461ffff16905085565b6060601280546117d090614565565b80601f01602080910402602001604051908101604052809291908181526020018280546117fc90614565565b80156118495780601f1061181e57610100808354040283529160200191611849565b820191906000526020600020905b81548152906001019060200180831161182c57829003601f168201915b5050505050905090565b606061185d6117c1565b60405160200161186d9190613d4f565b604051602081830303815290604052905090565b600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118f99190613da8565b60206040518083038186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194991906136f2565b73ffffffffffffffffffffffffffffffffffffffff16141561196f57600191505061197d565b61197984846126cd565b9150505b92915050565b61198b611d24565b73ffffffffffffffffffffffffffffffffffffffff166119a96113b0565b73ffffffffffffffffffffffffffffffffffffffff16146119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f6906141b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614037565b60405180910390fd5b611a788161244a565b50565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614217565b60405180910390fd5b611b1a8686868686612761565b905095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bcf57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611bd3565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb15750611cb0826128bc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611d2e611b25565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da683611119565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906140f7565b60405180910390fd5b6001611e70611e6b87612926565b61298e565b83868660405160008152602001604052604051611e909493929190613f6e565b6020604051602081039080840390855afa158015611eb2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611f039190614387565b905092915050565b6000611f1682611cb8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c906140d7565b60405180910390fd5b6000611f6083611119565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fcf57508373ffffffffffffffffffffffffffffffffffffffff16611fb784610959565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fe05750611fdf8185611881565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661200982611119565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612056906141d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690614097565b60405180910390fd5b6120da8383836129c7565b6120e5600082611d33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612135919061440e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218c9190614387565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061225d6001601154611ef590919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614177565b60405180910390fd5b6122db81611cb8565b1561231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614077565b60405180910390fd5b612327600083836129c7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123779190614387565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60116000815480929190612443906145c8565b9190505550565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61251b848484611fe9565b61252784848484612adb565b612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d90614017565b60405180910390fd5b50505050565b606060008214156125b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c8565b600082905060005b600082146125e65780806125cf906145c8565b915050600a826125df91906143dd565b91506125bc565b60008167ffffffffffffffff8111156126025761260161475b565b5b6040519080825280601f01601f1916602001820160405280156126345781602001600182028036833780820191505090505b5090505b600085146126c15760018261264d919061440e565b9150600a8561265c919061463f565b60306126689190614387565b60f81b81838151811061267e5761267d61472c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ba91906143dd565b9450612638565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061276d83611060565b90506040518060a001604052808581526020014267ffffffffffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018661ffff16815250601360008381526020019081526020016000206000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600101600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160106101000a81548161ffff021916908361ffff1602179055509050507fc5e97953600c388cf075a44f9582c0082e874129b74f682c2c2423e8bee13c5f83828989886040516128a7959493929190613e4d565b60405180910390a18091505095945050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051806080016040528060438152602001614e706043913980519060200120826000015183602001518460400151805190602001206040516020016129719493929190613ed6565b604051602081830303815290604052805190602001209050919050565b6000612998610dae565b826040516020016129aa929190613d71565b604051602081830303815290604052805190602001209050919050565b6129d2838383612c72565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a1557612a1081612c77565b612a54565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a5357612a528382612cc0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9757612a9281612e7f565b612ad6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ad557612ad48282612f50565b5b5b505050565b6000612afc8473ffffffffffffffffffffffffffffffffffffffff16613021565b15612c65578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b25611d24565b8786866040518563ffffffff1660e01b8152600401612b479493929190613e01565b602060405180830381600087803b158015612b6157600080fd5b505af1925050508015612b9257506040513d601f19601f82011682018060405250810190612b8f91906136c5565b60015b612c15573d8060008114612bc2576040519150601f19603f3d011682016040523d82523d6000602084013e612bc7565b606091505b50600081511415612c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0490614017565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6a565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ccd846111cb565b612cd7919061440e565b9050600060086000848152602001908152602001600020549050818114612dbc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009055612e7883600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061303490919063ffffffff16565b5050505050565b60006001600980549050612e93919061440e565b90506000600a6000848152602001908152602001600020549050600060098381548110612ec357612ec261472c565b5b906000526020600020015490508060098381548110612ee557612ee461472c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3457612f336146fd565b5b6001900381819060005260206000200160009055905550505050565b6000612f5b836111cb565b9050612fae82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061304e90919063ffffffff16565b5081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000613046836000018360001b613068565b905092915050565b6000613060836000018360001b613180565b905092915050565b6000808360010160008481526020019081526020016000205490506000811461317457600060018261309a919061440e565b90506000600186600001805490506130b2919061440e565b905060008660000182815481106130cc576130cb61472c565b5b90600052602060002001549050808760000184815481106130f0576130ef61472c565b5b906000526020600020018190555060018361310b9190614387565b8760010160008381526020019081526020016000208190555086600001805480613138576131376146fd565b5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061317a565b60009150505b92915050565b600061318c83836131f0565b6131e55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506131ea565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461321f90614565565b90600052602060002090601f0160209004810192826132415760008555613288565b82601f1061325a57805160ff1916838001178555613288565b82800160010185558215613288579182015b8281111561328757825182559160200191906001019061326c565b5b5090506132959190613299565b5090565b5b808211156132b257600081600090555060010161329a565b5090565b60006132c96132c4846142d7565b6142b2565b9050828152602081018484840111156132e5576132e461478f565b5b6132f0848285614523565b509392505050565b600061330b61330684614308565b6142b2565b9050828152602081018484840111156133275761332661478f565b5b613332848285614523565b509392505050565b60008135905061334981614dce565b92915050565b60008135905061335e81614de5565b92915050565b60008135905061337381614dfc565b92915050565b60008135905061338881614e13565b92915050565b60008151905061339d81614e13565b92915050565b600082601f8301126133b8576133b761478a565b5b81356133c88482602086016132b6565b91505092915050565b6000815190506133e081614e2a565b92915050565b600082601f8301126133fb576133fa61478a565b5b813561340b8482602086016132f8565b91505092915050565b60008135905061342381614e41565b92915050565b60008135905061343881614e58565b92915050565b60006020828403121561345457613453614799565b5b60006134628482850161333a565b91505092915050565b6000806040838503121561348257613481614799565b5b60006134908582860161333a565b92505060206134a18582860161333a565b9150509250929050565b6000806000606084860312156134c4576134c3614799565b5b60006134d28682870161333a565b93505060206134e38682870161333a565b92505060406134f486828701613414565b9150509250925092565b6000806000806080858703121561351857613517614799565b5b60006135268782880161333a565b94505060206135378782880161333a565b935050604061354887828801613414565b925050606085013567ffffffffffffffff81111561356957613568614794565b5b613575878288016133a3565b91505092959194509250565b6000806040838503121561359857613597614799565b5b60006135a68582860161333a565b92505060206135b78582860161334f565b9150509250929050565b600080600080600060a086880312156135dd576135dc614799565b5b60006135eb8882890161333a565b955050602086013567ffffffffffffffff81111561360c5761360b614794565b5b613618888289016133a3565b945050604061362988828901613364565b935050606061363a88828901613364565b925050608061364b88828901613429565b9150509295509295909350565b6000806040838503121561366f5761366e614799565b5b600061367d8582860161333a565b925050602061368e85828601613414565b9150509250929050565b6000602082840312156136ae576136ad614799565b5b60006136bc84828501613379565b91505092915050565b6000602082840312156136db576136da614799565b5b60006136e98482850161338e565b91505092915050565b60006020828403121561370857613707614799565b5b6000613716848285016133d1565b91505092915050565b60006020828403121561373557613734614799565b5b600082013567ffffffffffffffff81111561375357613752614794565b5b61375f848285016133e6565b91505092915050565b60006020828403121561377e5761377d614799565b5b600061378c84828501613414565b91505092915050565b600080600080600060a086880312156137b1576137b0614799565b5b60006137bf88828901613414565b95505060206137d088828901613414565b94505060406137e188828901613414565b93505060606137f288828901613364565b92505060806138038882890161333a565b9150509295509295909350565b61381981614454565b82525050565b61382881614442565b82525050565b61383f61383a82614442565b614611565b82525050565b61384e81614466565b82525050565b61385d81614472565b82525050565b61387461386f82614472565b614623565b82525050565b600061388582614339565b61388f818561434f565b935061389f818560208601614532565b6138a88161479e565b840191505092915050565b60006138be82614339565b6138c88185614360565b93506138d8818560208601614532565b80840191505092915050565b60006138ef82614344565b6138f9818561436b565b9350613909818560208601614532565b6139128161479e565b840191505092915050565b600061392882614344565b613932818561437c565b9350613942818560208601614532565b80840191505092915050565b600061395b602b8361436b565b9150613966826147bc565b604082019050919050565b600061397e60328361436b565b91506139898261480b565b604082019050919050565b60006139a160268361436b565b91506139ac8261485a565b604082019050919050565b60006139c4601c8361436b565b91506139cf826148a9565b602082019050919050565b60006139e7601c8361436b565b91506139f2826148d2565b602082019050919050565b6000613a0a60028361437c565b9150613a15826148fb565b600282019050919050565b6000613a2d60248361436b565b9150613a3882614924565b604082019050919050565b6000613a5060198361436b565b9150613a5b82614973565b602082019050919050565b6000613a73602c8361436b565b9150613a7e8261499c565b604082019050919050565b6000613a9660258361436b565b9150613aa1826149eb565b604082019050919050565b6000613ab960388361436b565b9150613ac482614a3a565b604082019050919050565b6000613adc602a8361436b565b9150613ae782614a89565b604082019050919050565b6000613aff60298361436b565b9150613b0a82614ad8565b604082019050919050565b6000613b22600a8361437c565b9150613b2d82614b27565b600a82019050919050565b6000613b4560208361436b565b9150613b5082614b50565b602082019050919050565b6000613b68602c8361436b565b9150613b7382614b79565b604082019050919050565b6000613b8b60208361436b565b9150613b9682614bc8565b602082019050919050565b6000613bae600c8361437c565b9150613bb982614bf1565b600c82019050919050565b6000613bd160298361436b565b9150613bdc82614c1a565b604082019050919050565b6000613bf460218361436b565b9150613bff82614c69565b604082019050919050565b6000613c1760128361436b565b9150613c2282614cb8565b602082019050919050565b6000613c3a60218361436b565b9150613c4582614ce1565b604082019050919050565b6000613c5d60318361436b565b9150613c6882614d30565b604082019050919050565b6000613c80602c8361436b565b9150613c8b82614d7f565b604082019050919050565b613c9f816144ba565b82525050565b613cae816144e8565b82525050565b613cbd816144f2565b82525050565b613ccc81614502565b82525050565b613cdb81614516565b82525050565b6000613ced82846138b3565b915081905092915050565b6000613d0482856138b3565b9150613d10828461382e565b6014820191508190509392505050565b6000613d2c828561391d565b9150613d3782613b15565b9150613d43828461391d565b91508190509392505050565b6000613d5b828461391d565b9150613d6682613ba1565b915081905092915050565b6000613d7c826139fd565b9150613d888285613863565b602082019150613d988284613863565b6020820191508190509392505050565b6000602082019050613dbd600083018461381f565b92915050565b6000606082019050613dd8600083018661381f565b613de56020830185613810565b8181036040830152613df7818461387a565b9050949350505050565b6000608082019050613e16600083018761381f565b613e23602083018661381f565b613e306040830185613ca5565b8181036060830152613e42818461387a565b905095945050505050565b600060a082019050613e62600083018861381f565b613e6f6020830187613ca5565b613e7c6040830186613ca5565b613e896060830185613ca5565b613e966080830184613854565b9695505050505050565b6000602082019050613eb56000830184613845565b92915050565b6000602082019050613ed06000830184613854565b92915050565b6000608082019050613eeb6000830187613854565b613ef86020830186613ca5565b613f05604083018561381f565b613f126060830184613854565b95945050505050565b600060a082019050613f306000830188613854565b613f3d6020830187613cc3565b613f4a6040830186613cb4565b613f576060830185613cb4565b613f646080830184613c96565b9695505050505050565b6000608082019050613f836000830187613854565b613f906020830186613cd2565b613f9d6040830185613854565b613faa6060830184613854565b95945050505050565b60006020820190508181036000830152613fcd818461387a565b905092915050565b60006020820190508181036000830152613fef81846138e4565b905092915050565b600060208201905081810360008301526140108161394e565b9050919050565b6000602082019050818103600083015261403081613971565b9050919050565b6000602082019050818103600083015261405081613994565b9050919050565b60006020820190508181036000830152614070816139b7565b9050919050565b60006020820190508181036000830152614090816139da565b9050919050565b600060208201905081810360008301526140b081613a20565b9050919050565b600060208201905081810360008301526140d081613a43565b9050919050565b600060208201905081810360008301526140f081613a66565b9050919050565b6000602082019050818103600083015261411081613a89565b9050919050565b6000602082019050818103600083015261413081613aac565b9050919050565b6000602082019050818103600083015261415081613acf565b9050919050565b6000602082019050818103600083015261417081613af2565b9050919050565b6000602082019050818103600083015261419081613b38565b9050919050565b600060208201905081810360008301526141b081613b5b565b9050919050565b600060208201905081810360008301526141d081613b7e565b9050919050565b600060208201905081810360008301526141f081613bc4565b9050919050565b6000602082019050818103600083015261421081613be7565b9050919050565b6000602082019050818103600083015261423081613c0a565b9050919050565b6000602082019050818103600083015261425081613c2d565b9050919050565b6000602082019050818103600083015261427081613c50565b9050919050565b6000602082019050818103600083015261429081613c73565b9050919050565b60006020820190506142ac6000830184613ca5565b92915050565b60006142bc6142cd565b90506142c88282614597565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f2576142f161475b565b5b6142fb8261479e565b9050602081019050919050565b600067ffffffffffffffff8211156143235761432261475b565b5b61432c8261479e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614392826144e8565b915061439d836144e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143d2576143d1614670565b5b828201905092915050565b60006143e8826144e8565b91506143f3836144e8565b9250826144035761440261469f565b5b828204905092915050565b6000614419826144e8565b9150614424836144e8565b92508282101561443757614436614670565b5b828203905092915050565b600061444d826144c8565b9050919050565b600061445f826144c8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006144b382614442565b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614550578082015181840152602081019050614535565b8381111561455f576000848401525b50505050565b6000600282049050600182168061457d57607f821691505b60208210811415614591576145906146ce565b5b50919050565b6145a08261479e565b810181811067ffffffffffffffff821117156145bf576145be61475b565b5b80604052505050565b60006145d3826144e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561460657614605614670565b5b600182019050919050565b600061461c8261462d565b9050919050565b6000819050919050565b6000614638826147af565b9050919050565b600061464a826144e8565b9150614655836144e8565b9250826146655761466461469f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6170692f746f6b656e2f00000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6170692f636f6e74726163740000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420526f757465720000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614dd781614442565b8114614de257600080fd5b50565b614dee81614466565b8114614df957600080fd5b50565b614e0581614472565b8114614e1057600080fd5b50565b614e1c8161447c565b8114614e2757600080fd5b50565b614e33816144a8565b8114614e3e57600080fd5b50565b614e4a816144e8565b8114614e5557600080fd5b50565b614e6181614516565b8114614e6c57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212200b11dbcf048452e5032862e41ce8d4b1d87714a76d60f1665f32d5121440c70264736f6c63430008070033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

69722:2039:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59591:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47249:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48808:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48331:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20119:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9565:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60231:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10574:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49698:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21696:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59899:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66570:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10683:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50108:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60421:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70420:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67415:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46943:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46673:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26884:94;;;;;;;;;;;;;:::i;:::-;;67781:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26233:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47418:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49101:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50364:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67168:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68483:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70067:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;71507:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71617:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68804:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27133:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71187:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59591:224;59693:4;59732:35;59717:50;;;:11;:50;;;;:90;;;;59771:36;59795:11;59771:23;:36::i;:::-;59717:90;59710:97;;59591:224;;;:::o;47249:100::-;47303:13;47336:5;47329:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47249:100;:::o;48808:221::-;48884:7;48912:16;48920:7;48912;:16::i;:::-;48904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48997:15;:24;49013:7;48997:24;;;;;;;;;;;;;;;;;;;;;48990:31;;48808:221;;;:::o;48331:411::-;48412:13;48428:23;48443:7;48428:14;:23::i;:::-;48412:39;;48476:5;48470:11;;:2;:11;;;;48462:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48570:5;48554:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48579:37;48596:5;48603:12;:10;:12::i;:::-;48579:16;:37::i;:::-;48554:62;48532:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;48713:21;48722:2;48726:7;48713:8;:21::i;:::-;48401:341;48331:411;;:::o;20119:1151::-;20320:12;20345:29;20377:152;;;;;;;;20415:6;:19;20422:11;20415:19;;;;;;;;;;;;;;;;20377:152;;;;20455:11;20377:152;;;;;;20500:17;20377:152;;;20345:184;;20564:45;20571:11;20584:6;20592:4;20598;20604;20564:6;:45::i;:::-;20542:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;20759:26;20783:1;20759:6;:19;20766:11;20759:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;20737:6;:19;20744:11;20737:19;;;;;;;;;;;;;;;:48;;;;20803:126;20841:11;20875:10;20901:17;20803:126;;;;;;;;:::i;:::-;;;;;;;;21040:12;21054:23;21089:4;21081:18;;21131:17;21150:11;21114:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21081:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21039:134;;;;21192:7;21184:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;21252:10;21245:17;;;;;20119:1151;;;;;;;:::o;9565:43::-;;;;;;;;;;;;;;;;;;;:::o;60231:113::-;60292:7;60319:10;:17;;;;60312:24;;60231:113;:::o;10574:101::-;10625:7;10652:15;;10645:22;;10574:101;:::o;49698:339::-;49893:41;49912:12;:10;:12::i;:::-;49926:7;49893:18;:41::i;:::-;49885:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50001:28;50011:4;50017:2;50021:7;50001:9;:28::i;:::-;49698:339;;;:::o;21696:107::-;21749:13;21783:6;:12;21790:4;21783:12;;;;;;;;;;;;;;;;21775:20;;21696:107;;;:::o;59899:256::-;59996:7;60032:23;60049:5;60032:16;:23::i;:::-;60024:5;:31;60016:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60121:12;:19;60134:5;60121:19;;;;;;;;;;;;;;;:26;60141:5;60121:26;;;;;;;;;;;;60114:33;;59899:256;;;;:::o;66570:28::-;;;;;;;;;;;;;:::o;10683:161::-;10726:7;10746:10;10797:9;10791:15;;10834:2;10827:9;;;10683:161;:::o;50108:185::-;50246:39;50263:4;50269:2;50273:7;50246:39;;;;;;;;;;;;:16;:39::i;:::-;50108:185;;;:::o;60421:233::-;60496:7;60532:30;:28;:30::i;:::-;60524:5;:38;60516:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;60629:10;60640:5;60629:17;;;;;;;;:::i;:::-;;;;;;;;;;60622:24;;60421:233;;;:::o;70420:100::-;26464:12;:10;:12::i;:::-;26453:23;;:7;:5;:7::i;:::-;:23;;;26445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70504:8:::1;70494:7;:18;;;;;;;;;;;;:::i;:::-;;70420:100:::0;:::o;67415:222::-;67480:7;66704:13;;;;;;;;;;;66690:27;;:10;:27;;;66682:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67500:18:::1;67521:17;:15;:17::i;:::-;67500:38;;67549:22;67555:3;67560:10;67549:5;:22::i;:::-;67582:19;:17;:19::i;:::-;67619:10;67612:17;;;67415:222:::0;;;:::o;46943:239::-;47015:7;47035:13;47051:7;:16;47059:7;47051:16;;;;;;;;;;;;;;;;;;;;;47035:32;;47103:1;47086:19;;:5;:19;;;;47078:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47169:5;47162:12;;;46943:239;;;:::o;46673:208::-;46745:7;46790:1;46773:19;;:5;:19;;;;46765:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46857:9;:16;46867:5;46857:16;;;;;;;;;;;;;;;;46850:23;;46673:208;;;:::o;26884:94::-;26464:12;:10;:12::i;:::-;26453:23;;:7;:5;:7::i;:::-;:23;;;26445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26949:21:::1;26967:1;26949:9;:21::i;:::-;26884:94::o:0;67781:212::-;67836:7;26464:12;:10;:12::i;:::-;26453:23;;:7;:5;:7::i;:::-;:23;;;26445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67856:18:::1;67877:17;:15;:17::i;:::-;67856:38;;67905:22;67911:3;67916:10;67905:5;:22::i;:::-;67938:19;:17;:19::i;:::-;67975:10;67968:17;;;67781:212:::0;;;:::o;26233:87::-;26279:7;26306:6;;;;;;;;;;;26299:13;;26233:87;:::o;47418:104::-;47474:13;47507:7;47500:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47418:104;:::o;49101:295::-;49216:12;:10;:12::i;:::-;49204:24;;:8;:24;;;;49196:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49316:8;49271:18;:32;49290:12;:10;:12::i;:::-;49271:32;;;;;;;;;;;;;;;:42;49304:8;49271:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49369:8;49340:48;;49355:12;:10;:12::i;:::-;49340:48;;;49379:8;49340:48;;;;;;:::i;:::-;;;;;;;;49101:295;;:::o;50364:328::-;50539:41;50558:12;:10;:12::i;:::-;50572:7;50539:18;:41::i;:::-;50531:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50645:39;50659:4;50665:2;50669:7;50678:5;50645:13;:39::i;:::-;50364:328;;;;:::o;67168:103::-;26464:12;:10;:12::i;:::-;26453:23;;:7;:5;:7::i;:::-;:23;;;26445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67253:10:::1;67237:13;;:26;;;;;;;;;;;;;;;;;;67168:103:::0;:::o;68483:189::-;68549:13;68606:14;:12;:14::i;:::-;68636:26;68653:8;68636:16;:26::i;:::-;68589:74;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68575:89;;68483:189;;;:::o;70067:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71507:102::-;71561:13;71594:7;71587:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71507:102;:::o;71617:141::-;71661:13;71718:14;:12;:14::i;:::-;71701:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;71687:63;;71617:141;:::o;68804:445::-;68929:4;69014:27;69058:20;;;;;;;;;;;69014:65;;69135:8;69094:49;;69102:13;:21;;;69124:5;69102:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69094:49;;;69090:93;;;69167:4;69160:11;;;;;69090:93;69202:39;69225:5;69232:8;69202:22;:39::i;:::-;69195:46;;;68804:445;;;;;:::o;27133:192::-;26464:12;:10;:12::i;:::-;26453:23;;:7;:5;:7::i;:::-;:23;;;26445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27242:1:::1;27222:22;;:8;:22;;;;27214:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27298:19;27308:8;27298:9;:19::i;:::-;27133:192:::0;:::o;71187:312::-;71393:4;66704:13;;;;;;;;;;;66690:27;;:10;:27;;;66682:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71422:69:::1;71443:9;71454:7;71463:11;71476:6;71484;71422:20;:69::i;:::-;71415:76;;71187:312:::0;;;;;;;:::o;11589:650::-;11660:22;11726:4;11704:27;;:10;:27;;;11700:508;;;11748:18;11769:8;;11748:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11792:13;11808:8;;:15;;11792:31;;12060:42;12030:5;12023;12019:17;12013:24;11987:134;11977:144;;11847:289;;11700:508;;;12185:10;12168:28;;11700:508;11589:650;:::o;46304:305::-;46406:4;46458:25;46443:40;;;:11;:40;;;;:105;;;;46515:33;46500:48;;;:11;:48;;;;46443:105;:158;;;;46565:36;46589:11;46565:23;:36::i;:::-;46443:158;46423:178;;46304:305;;;:::o;52202:127::-;52267:4;52319:1;52291:30;;:7;:16;52299:7;52291:16;;;;;;;;;;;;;;;;;;;;;:30;;;;52284:37;;52202:127;;;:::o;69393:161::-;69483:14;69522:24;:22;:24::i;:::-;69515:31;;69393:161;:::o;56184:174::-;56286:2;56259:15;:24;56275:7;56259:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56342:7;56338:2;56304:46;;56313:23;56328:7;56313:14;:23::i;:::-;56304:46;;;;;;;;;;;;56184:174;;:::o;21811:486::-;21989:4;22032:1;22014:20;;:6;:20;;;;22006:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22130:159;22158:47;22177:27;22197:6;22177:19;:27::i;:::-;22158:18;:47::i;:::-;22224:4;22247;22270;22130:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22107:182;;:6;:182;;;22087:202;;21811:486;;;;;;;:::o;15044:98::-;15102:7;15133:1;15129;:5;;;;:::i;:::-;15122:12;;15044:98;;;;:::o;52496:348::-;52589:4;52614:16;52622:7;52614;:16::i;:::-;52606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52690:13;52706:23;52721:7;52706:14;:23::i;:::-;52690:39;;52759:5;52748:16;;:7;:16;;;:51;;;;52792:7;52768:31;;:20;52780:7;52768:11;:20::i;:::-;:31;;;52748:51;:87;;;;52803:32;52820:5;52827:7;52803:16;:32::i;:::-;52748:87;52740:96;;;52496:348;;;;:::o;55488:578::-;55647:4;55620:31;;:23;55635:7;55620:14;:23::i;:::-;:31;;;55612:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55730:1;55716:16;;:2;:16;;;;55708:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55786:39;55807:4;55813:2;55817:7;55786:20;:39::i;:::-;55890:29;55907:1;55911:7;55890:8;:29::i;:::-;55951:1;55932:9;:15;55942:4;55932:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;55980:1;55963:9;:13;55973:2;55963:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;56011:2;55992:7;:16;56000:7;55992:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56050:7;56046:2;56031:27;;56040:4;56031:27;;;;;;;;;;;;55488:578;;;:::o;68141:106::-;68190:7;68217:22;68237:1;68217:15;;:19;;:22;;;;:::i;:::-;68210:29;;68141:106;:::o;54180:382::-;54274:1;54260:16;;:2;:16;;;;54252:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54333:16;54341:7;54333;:16::i;:::-;54332:17;54324:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54395:45;54424:1;54428:2;54432:7;54395:20;:45::i;:::-;54470:1;54453:9;:13;54463:2;54453:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;54501:2;54482:7;:16;54490:7;54482:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54546:7;54542:2;54521:33;;54538:1;54521:33;;;;;;;;;;;;54180:382;;:::o;68326:73::-;68374:15;;:17;;;;;;;;;:::i;:::-;;;;;;68326:73::o;27333:173::-;27389:16;27408:6;;;;;;;;;;;27389:25;;27434:8;27425:6;;:17;;;;;;;;;;;;;;;;;;27489:8;27458:40;;27479:8;27458:40;;;;;;;;;;;;27378:128;27333:173;:::o;51574:315::-;51731:28;51741:4;51747:2;51751:7;51731:9;:28::i;:::-;51778:48;51801:4;51807:2;51811:7;51820:5;51778:22;:48::i;:::-;51770:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;51574:315;;;;:::o;22621:723::-;22677:13;22907:1;22898:5;:10;22894:53;;;22925:10;;;;;;;;;;;;;;;;;;;;;22894:53;22957:12;22972:5;22957:20;;22988:14;23013:78;23028:1;23020:4;:9;23013:78;;23046:8;;;;;:::i;:::-;;;;23077:2;23069:10;;;;;:::i;:::-;;;23013:78;;;23101:19;23133:6;23123:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23101:39;;23151:154;23167:1;23158:5;:10;23151:154;;23195:1;23185:11;;;;;:::i;:::-;;;23262:2;23254:5;:10;;;;:::i;:::-;23241:2;:24;;;;:::i;:::-;23228:39;;23211:6;23218;23211:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23291:2;23282:11;;;;;:::i;:::-;;;23151:154;;;23329:6;23315:21;;;;;22621:723;;;;:::o;49467:164::-;49564:4;49588:18;:25;49607:5;49588:25;;;;;;;;;;;;;;;:35;49614:8;49588:35;;;;;;;;;;;;;;;;;;;;;;;;;49581:42;;49467:164;;;;:::o;70528:651::-;70735:7;70760:19;70782:23;70798:6;70782:15;:23::i;:::-;70760:45;;70841:229;;;;;;;;70877:6;70841:229;;;;70916:15;70841:229;;;;;;70964:9;70841:229;;;;;;71004:7;70841:229;;;;;;71046:11;70841:229;;;;;70818:7;:20;70826:11;70818:20;;;;;;;;;;;:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71088:54;71094:6;71102:11;71115:9;71126:7;71135:6;71088:54;;;;;;;;;;:::i;:::-;;;;;;;;71160:11;71153:18;;;70528:651;;;;;;;:::o;38251:157::-;38336:4;38375:25;38360:40;;;:11;:40;;;;38353:47;;38251:157;;;:::o;21278:410::-;21388:7;19455:100;;;;;;;;;;;;;;;;;19435:127;;;;;;21542:6;:12;;;21577:6;:11;;;21621:6;:24;;;21611:35;;;;;;21461:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21433:247;;;;;;21413:267;;21278:410;;;:::o;11213:258::-;11312:7;11414:20;:18;:20::i;:::-;11436:11;11385:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11357:106;;;;;;11337:126;;11213:258;;;:::o;61267:589::-;61411:45;61438:4;61444:2;61448:7;61411:26;:45::i;:::-;61489:1;61473:18;;:4;:18;;;61469:187;;;61508:40;61540:7;61508:31;:40::i;:::-;61469:187;;;61578:2;61570:10;;:4;:10;;;61566:90;;61597:47;61630:4;61636:7;61597:32;:47::i;:::-;61566:90;61469:187;61684:1;61670:16;;:2;:16;;;61666:183;;;61703:45;61740:7;61703:36;:45::i;:::-;61666:183;;;61776:4;61770:10;;:2;:10;;;61766:83;;61797:40;61825:2;61829:7;61797:27;:40::i;:::-;61766:83;61666:183;61267:589;;;:::o;56923:799::-;57078:4;57099:15;:2;:13;;;:15::i;:::-;57095:620;;;57151:2;57135:36;;;57172:12;:10;:12::i;:::-;57186:4;57192:7;57201:5;57135:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57131:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57394:1;57377:6;:13;:18;57373:272;;;57420:60;;;;;;;;;;:::i;:::-;;;;;;;;57373:272;57595:6;57589:13;57580:6;57576:2;57572:15;57565:38;57131:529;57268:41;;;57258:51;;;:6;:51;;;;57251:58;;;;;57095:620;57699:4;57692:11;;56923:799;;;;;;;:::o;58294:126::-;;;;:::o;62620:164::-;62724:10;:17;;;;62697:15;:24;62713:7;62697:24;;;;;;;;;;;:44;;;;62752:10;62768:7;62752:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62620:164;:::o;63411:1036::-;63677:22;63727:1;63702:22;63719:4;63702:16;:22::i;:::-;:26;;;;:::i;:::-;63677:51;;63739:18;63760:17;:26;63778:7;63760:26;;;;;;;;;;;;63739:47;;63907:14;63893:10;:28;63889:328;;63938:19;63960:12;:18;63973:4;63960:18;;;;;;;;;;;;;;;:34;63979:14;63960:34;;;;;;;;;;;;63938:56;;64044:11;64011:12;:18;64024:4;64011:18;;;;;;;;;;;;;;;:30;64030:10;64011:30;;;;;;;;;;;:44;;;;64161:10;64128:17;:30;64146:11;64128:30;;;;;;;;;;;:43;;;;63923:294;63889:328;64313:17;:26;64331:7;64313:26;;;;;;;;;;;64306:33;;;64357:12;:18;64370:4;64357:18;;;;;;;;;;;;;;;:34;64376:14;64357:34;;;;;;;;;;;64350:41;;;64404:35;64431:7;64404:13;:19;64418:4;64404:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;63492:955;;63411:1036;;:::o;64742:1079::-;64995:22;65040:1;65020:10;:17;;;;:21;;;;:::i;:::-;64995:46;;65052:18;65073:15;:24;65089:7;65073:24;;;;;;;;;;;;65052:45;;65424:19;65446:10;65457:14;65446:26;;;;;;;;:::i;:::-;;;;;;;;;;65424:48;;65510:11;65485:10;65496;65485:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;65621:10;65590:15;:28;65606:11;65590:28;;;;;;;;;;;:41;;;;65762:15;:24;65778:7;65762:24;;;;;;;;;;;65755:31;;;65797:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64813:1008;;;64742:1079;:::o;62157:262::-;62242:14;62259:20;62276:2;62259:16;:20::i;:::-;62242:37;;62290:30;62312:7;62290:13;:17;62304:2;62290:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62358:7;62331:12;:16;62344:2;62331:16;;;;;;;;;;;;;;;:24;62348:6;62331:24;;;;;;;;;;;:34;;;;62405:6;62376:17;:26;62394:7;62376:26;;;;;;;;;;;:35;;;;62231:188;62157:262;;:::o;28287:387::-;28347:4;28555:12;28622:7;28610:20;28602:28;;28665:1;28658:4;:8;28651:15;;;28287:387;;;:::o;8072:137::-;8142:4;8166:35;8174:3;:10;;8194:5;8186:14;;8166:7;:35::i;:::-;8159:42;;8072:137;;;;:::o;7765:131::-;7832:4;7856:32;7861:3;:10;;7881:5;7873:14;;7856:4;:32::i;:::-;7849:39;;7765:131;;;;:::o;1725:1544::-;1791:4;1909:18;1930:3;:12;;:19;1943:5;1930:19;;;;;;;;;;;;1909:40;;1980:1;1966:10;:15;1962:1300;;2328:21;2365:1;2352:10;:14;;;;:::i;:::-;2328:38;;2381:17;2422:1;2401:3;:11;;:18;;;;:22;;;;:::i;:::-;2381:42;;2668:17;2688:3;:11;;2700:9;2688:22;;;;;;;;:::i;:::-;;;;;;;;;;2668:42;;2834:9;2805:3;:11;;2817:13;2805:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;2953:1;2937:13;:17;;;;:::i;:::-;2911:3;:12;;:23;2924:9;2911:23;;;;;;;;;;;:43;;;;3063:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3158:3;:12;;:19;3171:5;3158:19;;;;;;;;;;;3151:26;;;3201:4;3194:11;;;;;;;;1962:1300;3245:5;3238:12;;;1725:1544;;;;;:::o;1135:414::-;1198:4;1220:21;1230:3;1235:5;1220:9;:21::i;:::-;1215:327;;1258:3;:11;;1275:5;1258:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:3;:11;;:18;;;;1419:3;:12;;:19;1432:5;1419:19;;;;;;;;;;;:40;;;;1481:4;1474:11;;;;1215:327;1525:5;1518:12;;1135:414;;;;;:::o;3355:129::-;3428:4;3475:1;3452:3;:12;;:19;3465:5;3452:19;;;;;;;;;;;;:24;;3445:31;;3355:129;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1917:201::-;2003:5;2034:6;2028:13;2019:22;;2050:62;2106:5;2050:62;:::i;:::-;1917:201;;;;:::o;2138:340::-;2194:5;2243:3;2236:4;2228:6;2224:17;2220:27;2210:122;;2251:79;;:::i;:::-;2210:122;2368:6;2355:20;2393:79;2468:3;2460:6;2453:4;2445:6;2441:17;2393:79;:::i;:::-;2384:88;;2200:278;2138:340;;;;:::o;2484:139::-;2530:5;2568:6;2555:20;2546:29;;2584:33;2611:5;2584:33;:::i;:::-;2484:139;;;;:::o;2629:135::-;2673:5;2711:6;2698:20;2689:29;;2727:31;2752:5;2727:31;:::i;:::-;2629:135;;;;:::o;2770:329::-;2829:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;2770:329;;;;:::o;3105:474::-;3173:6;3181;3230:2;3218:9;3209:7;3205:23;3201:32;3198:119;;;3236:79;;:::i;:::-;3198:119;3356:1;3381:53;3426:7;3417:6;3406:9;3402:22;3381:53;:::i;:::-;3371:63;;3327:117;3483:2;3509:53;3554:7;3545:6;3534:9;3530:22;3509:53;:::i;:::-;3499:63;;3454:118;3105:474;;;;;:::o;3585:619::-;3662:6;3670;3678;3727:2;3715:9;3706:7;3702:23;3698:32;3695:119;;;3733:79;;:::i;:::-;3695:119;3853:1;3878:53;3923:7;3914:6;3903:9;3899:22;3878:53;:::i;:::-;3868:63;;3824:117;3980:2;4006:53;4051:7;4042:6;4031:9;4027:22;4006:53;:::i;:::-;3996:63;;3951:118;4108:2;4134:53;4179:7;4170:6;4159:9;4155:22;4134:53;:::i;:::-;4124:63;;4079:118;3585:619;;;;;:::o;4210:943::-;4305:6;4313;4321;4329;4378:3;4366:9;4357:7;4353:23;4349:33;4346:120;;;4385:79;;:::i;:::-;4346:120;4505:1;4530:53;4575:7;4566:6;4555:9;4551:22;4530:53;:::i;:::-;4520:63;;4476:117;4632:2;4658:53;4703:7;4694:6;4683:9;4679:22;4658:53;:::i;:::-;4648:63;;4603:118;4760:2;4786:53;4831:7;4822:6;4811:9;4807:22;4786:53;:::i;:::-;4776:63;;4731:118;4916:2;4905:9;4901:18;4888:32;4947:18;4939:6;4936:30;4933:117;;;4969:79;;:::i;:::-;4933:117;5074:62;5128:7;5119:6;5108:9;5104:22;5074:62;:::i;:::-;5064:72;;4859:287;4210:943;;;;;;;:::o;5159:468::-;5224:6;5232;5281:2;5269:9;5260:7;5256:23;5252:32;5249:119;;;5287:79;;:::i;:::-;5249:119;5407:1;5432:53;5477:7;5468:6;5457:9;5453:22;5432:53;:::i;:::-;5422:63;;5378:117;5534:2;5560:50;5602:7;5593:6;5582:9;5578:22;5560:50;:::i;:::-;5550:60;;5505:115;5159:468;;;;;:::o;5633:1085::-;5735:6;5743;5751;5759;5767;5816:3;5804:9;5795:7;5791:23;5787:33;5784:120;;;5823:79;;:::i;:::-;5784:120;5943:1;5968:53;6013:7;6004:6;5993:9;5989:22;5968:53;:::i;:::-;5958:63;;5914:117;6098:2;6087:9;6083:18;6070:32;6129:18;6121:6;6118:30;6115:117;;;6151:79;;:::i;:::-;6115:117;6256:62;6310:7;6301:6;6290:9;6286:22;6256:62;:::i;:::-;6246:72;;6041:287;6367:2;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6338:118;6495:2;6521:53;6566:7;6557:6;6546:9;6542:22;6521:53;:::i;:::-;6511:63;;6466:118;6623:3;6650:51;6693:7;6684:6;6673:9;6669:22;6650:51;:::i;:::-;6640:61;;6594:117;5633:1085;;;;;;;;:::o;6724:474::-;6792:6;6800;6849:2;6837:9;6828:7;6824:23;6820:32;6817:119;;;6855:79;;:::i;:::-;6817:119;6975:1;7000:53;7045:7;7036:6;7025:9;7021:22;7000:53;:::i;:::-;6990:63;;6946:117;7102:2;7128:53;7173:7;7164:6;7153:9;7149:22;7128:53;:::i;:::-;7118:63;;7073:118;6724:474;;;;;:::o;7204:327::-;7262:6;7311:2;7299:9;7290:7;7286:23;7282:32;7279:119;;;7317:79;;:::i;:::-;7279:119;7437:1;7462:52;7506:7;7497:6;7486:9;7482:22;7462:52;:::i;:::-;7452:62;;7408:116;7204:327;;;;:::o;7537:349::-;7606:6;7655:2;7643:9;7634:7;7630:23;7626:32;7623:119;;;7661:79;;:::i;:::-;7623:119;7781:1;7806:63;7861:7;7852:6;7841:9;7837:22;7806:63;:::i;:::-;7796:73;;7752:127;7537:349;;;;:::o;7892:409::-;7991:6;8040:2;8028:9;8019:7;8015:23;8011:32;8008:119;;;8046:79;;:::i;:::-;8008:119;8166:1;8191:93;8276:7;8267:6;8256:9;8252:22;8191:93;:::i;:::-;8181:103;;8137:157;7892:409;;;;:::o;8307:509::-;8376:6;8425:2;8413:9;8404:7;8400:23;8396:32;8393:119;;;8431:79;;:::i;:::-;8393:119;8579:1;8568:9;8564:17;8551:31;8609:18;8601:6;8598:30;8595:117;;;8631:79;;:::i;:::-;8595:117;8736:63;8791:7;8782:6;8771:9;8767:22;8736:63;:::i;:::-;8726:73;;8522:287;8307:509;;;;:::o;8822:329::-;8881:6;8930:2;8918:9;8909:7;8905:23;8901:32;8898:119;;;8936:79;;:::i;:::-;8898:119;9056:1;9081:53;9126:7;9117:6;9106:9;9102:22;9081:53;:::i;:::-;9071:63;;9027:117;8822:329;;;;:::o;9157:911::-;9252:6;9260;9268;9276;9284;9333:3;9321:9;9312:7;9308:23;9304:33;9301:120;;;9340:79;;:::i;:::-;9301:120;9460:1;9485:53;9530:7;9521:6;9510:9;9506:22;9485:53;:::i;:::-;9475:63;;9431:117;9587:2;9613:53;9658:7;9649:6;9638:9;9634:22;9613:53;:::i;:::-;9603:63;;9558:118;9715:2;9741:53;9786:7;9777:6;9766:9;9762:22;9741:53;:::i;:::-;9731:63;;9686:118;9843:2;9869:53;9914:7;9905:6;9894:9;9890:22;9869:53;:::i;:::-;9859:63;;9814:118;9971:3;9998:53;10043:7;10034:6;10023:9;10019:22;9998:53;:::i;:::-;9988:63;;9942:119;9157:911;;;;;;;;:::o;10074:142::-;10177:32;10203:5;10177:32;:::i;:::-;10172:3;10165:45;10074:142;;:::o;10222:118::-;10309:24;10327:5;10309:24;:::i;:::-;10304:3;10297:37;10222:118;;:::o;10346:157::-;10451:45;10471:24;10489:5;10471:24;:::i;:::-;10451:45;:::i;:::-;10446:3;10439:58;10346:157;;:::o;10509:109::-;10590:21;10605:5;10590:21;:::i;:::-;10585:3;10578:34;10509:109;;:::o;10624:118::-;10711:24;10729:5;10711:24;:::i;:::-;10706:3;10699:37;10624:118;;:::o;10748:157::-;10853:45;10873:24;10891:5;10873:24;:::i;:::-;10853:45;:::i;:::-;10848:3;10841:58;10748:157;;:::o;10911:360::-;10997:3;11025:38;11057:5;11025:38;:::i;:::-;11079:70;11142:6;11137:3;11079:70;:::i;:::-;11072:77;;11158:52;11203:6;11198:3;11191:4;11184:5;11180:16;11158:52;:::i;:::-;11235:29;11257:6;11235:29;:::i;:::-;11230:3;11226:39;11219:46;;11001:270;10911:360;;;;:::o;11277:373::-;11381:3;11409:38;11441:5;11409:38;:::i;:::-;11463:88;11544:6;11539:3;11463:88;:::i;:::-;11456:95;;11560:52;11605:6;11600:3;11593:4;11586:5;11582:16;11560:52;:::i;:::-;11637:6;11632:3;11628:16;11621:23;;11385:265;11277:373;;;;:::o;11656:364::-;11744:3;11772:39;11805:5;11772:39;:::i;:::-;11827:71;11891:6;11886:3;11827:71;:::i;:::-;11820:78;;11907:52;11952:6;11947:3;11940:4;11933:5;11929:16;11907:52;:::i;:::-;11984:29;12006:6;11984:29;:::i;:::-;11979:3;11975:39;11968:46;;11748:272;11656:364;;;;:::o;12026:377::-;12132:3;12160:39;12193:5;12160:39;:::i;:::-;12215:89;12297:6;12292:3;12215:89;:::i;:::-;12208:96;;12313:52;12358:6;12353:3;12346:4;12339:5;12335:16;12313:52;:::i;:::-;12390:6;12385:3;12381:16;12374:23;;12136:267;12026:377;;;;:::o;12409:366::-;12551:3;12572:67;12636:2;12631:3;12572:67;:::i;:::-;12565:74;;12648:93;12737:3;12648:93;:::i;:::-;12766:2;12761:3;12757:12;12750:19;;12409:366;;;:::o;12781:::-;12923:3;12944:67;13008:2;13003:3;12944:67;:::i;:::-;12937:74;;13020:93;13109:3;13020:93;:::i;:::-;13138:2;13133:3;13129:12;13122:19;;12781:366;;;:::o;13153:::-;13295:3;13316:67;13380:2;13375:3;13316:67;:::i;:::-;13309:74;;13392:93;13481:3;13392:93;:::i;:::-;13510:2;13505:3;13501:12;13494:19;;13153:366;;;:::o;13525:::-;13667:3;13688:67;13752:2;13747:3;13688:67;:::i;:::-;13681:74;;13764:93;13853:3;13764:93;:::i;:::-;13882:2;13877:3;13873:12;13866:19;;13525:366;;;:::o;13897:::-;14039:3;14060:67;14124:2;14119:3;14060:67;:::i;:::-;14053:74;;14136:93;14225:3;14136:93;:::i;:::-;14254:2;14249:3;14245:12;14238:19;;13897:366;;;:::o;14269:400::-;14429:3;14450:84;14532:1;14527:3;14450:84;:::i;:::-;14443:91;;14543:93;14632:3;14543:93;:::i;:::-;14661:1;14656:3;14652:11;14645:18;;14269:400;;;:::o;14675:366::-;14817:3;14838:67;14902:2;14897:3;14838:67;:::i;:::-;14831:74;;14914:93;15003:3;14914:93;:::i;:::-;15032:2;15027:3;15023:12;15016:19;;14675:366;;;:::o;15047:::-;15189:3;15210:67;15274:2;15269:3;15210:67;:::i;:::-;15203:74;;15286:93;15375:3;15286:93;:::i;:::-;15404:2;15399:3;15395:12;15388:19;;15047:366;;;:::o;15419:::-;15561:3;15582:67;15646:2;15641:3;15582:67;:::i;:::-;15575:74;;15658:93;15747:3;15658:93;:::i;:::-;15776:2;15771:3;15767:12;15760:19;;15419:366;;;:::o;15791:::-;15933:3;15954:67;16018:2;16013:3;15954:67;:::i;:::-;15947:74;;16030:93;16119:3;16030:93;:::i;:::-;16148:2;16143:3;16139:12;16132:19;;15791:366;;;:::o;16163:::-;16305:3;16326:67;16390:2;16385:3;16326:67;:::i;:::-;16319:74;;16402:93;16491:3;16402:93;:::i;:::-;16520:2;16515:3;16511:12;16504:19;;16163:366;;;:::o;16535:::-;16677:3;16698:67;16762:2;16757:3;16698:67;:::i;:::-;16691:74;;16774:93;16863:3;16774:93;:::i;:::-;16892:2;16887:3;16883:12;16876:19;;16535:366;;;:::o;16907:::-;17049:3;17070:67;17134:2;17129:3;17070:67;:::i;:::-;17063:74;;17146:93;17235:3;17146:93;:::i;:::-;17264:2;17259:3;17255:12;17248:19;;16907:366;;;:::o;17279:402::-;17439:3;17460:85;17542:2;17537:3;17460:85;:::i;:::-;17453:92;;17554:93;17643:3;17554:93;:::i;:::-;17672:2;17667:3;17663:12;17656:19;;17279:402;;;:::o;17687:366::-;17829:3;17850:67;17914:2;17909:3;17850:67;:::i;:::-;17843:74;;17926:93;18015:3;17926:93;:::i;:::-;18044:2;18039:3;18035:12;18028:19;;17687:366;;;:::o;18059:::-;18201:3;18222:67;18286:2;18281:3;18222:67;:::i;:::-;18215:74;;18298:93;18387:3;18298:93;:::i;:::-;18416:2;18411:3;18407:12;18400:19;;18059:366;;;:::o;18431:::-;18573:3;18594:67;18658:2;18653:3;18594:67;:::i;:::-;18587:74;;18670:93;18759:3;18670:93;:::i;:::-;18788:2;18783:3;18779:12;18772:19;;18431:366;;;:::o;18803:402::-;18963:3;18984:85;19066:2;19061:3;18984:85;:::i;:::-;18977:92;;19078:93;19167:3;19078:93;:::i;:::-;19196:2;19191:3;19187:12;19180:19;;18803:402;;;:::o;19211:366::-;19353:3;19374:67;19438:2;19433:3;19374:67;:::i;:::-;19367:74;;19450:93;19539:3;19450:93;:::i;:::-;19568:2;19563:3;19559:12;19552:19;;19211:366;;;:::o;19583:::-;19725:3;19746:67;19810:2;19805:3;19746:67;:::i;:::-;19739:74;;19822:93;19911:3;19822:93;:::i;:::-;19940:2;19935:3;19931:12;19924:19;;19583:366;;;:::o;19955:::-;20097:3;20118:67;20182:2;20177:3;20118:67;:::i;:::-;20111:74;;20194:93;20283:3;20194:93;:::i;:::-;20312:2;20307:3;20303:12;20296:19;;19955:366;;;:::o;20327:::-;20469:3;20490:67;20554:2;20549:3;20490:67;:::i;:::-;20483:74;;20566:93;20655:3;20566:93;:::i;:::-;20684:2;20679:3;20675:12;20668:19;;20327:366;;;:::o;20699:::-;20841:3;20862:67;20926:2;20921:3;20862:67;:::i;:::-;20855:74;;20938:93;21027:3;20938:93;:::i;:::-;21056:2;21051:3;21047:12;21040:19;;20699:366;;;:::o;21071:::-;21213:3;21234:67;21298:2;21293:3;21234:67;:::i;:::-;21227:74;;21310:93;21399:3;21310:93;:::i;:::-;21428:2;21423:3;21419:12;21412:19;;21071:366;;;:::o;21443:115::-;21528:23;21545:5;21528:23;:::i;:::-;21523:3;21516:36;21443:115;;:::o;21564:118::-;21651:24;21669:5;21651:24;:::i;:::-;21646:3;21639:37;21564:118;;:::o;21688:115::-;21773:23;21790:5;21773:23;:::i;:::-;21768:3;21761:36;21688:115;;:::o;21809:::-;21894:23;21911:5;21894:23;:::i;:::-;21889:3;21882:36;21809:115;;:::o;21930:112::-;22013:22;22029:5;22013:22;:::i;:::-;22008:3;22001:35;21930:112;;:::o;22048:271::-;22178:3;22200:93;22289:3;22280:6;22200:93;:::i;:::-;22193:100;;22310:3;22303:10;;22048:271;;;;:::o;22325:412::-;22483:3;22505:93;22594:3;22585:6;22505:93;:::i;:::-;22498:100;;22608:75;22679:3;22670:6;22608:75;:::i;:::-;22708:2;22703:3;22699:12;22692:19;;22728:3;22721:10;;22325:412;;;;;:::o;22743:701::-;23024:3;23046:95;23137:3;23128:6;23046:95;:::i;:::-;23039:102;;23158:148;23302:3;23158:148;:::i;:::-;23151:155;;23323:95;23414:3;23405:6;23323:95;:::i;:::-;23316:102;;23435:3;23428:10;;22743:701;;;;;:::o;23450:541::-;23683:3;23705:95;23796:3;23787:6;23705:95;:::i;:::-;23698:102;;23817:148;23961:3;23817:148;:::i;:::-;23810:155;;23982:3;23975:10;;23450:541;;;;:::o;23997:663::-;24238:3;24260:148;24404:3;24260:148;:::i;:::-;24253:155;;24418:75;24489:3;24480:6;24418:75;:::i;:::-;24518:2;24513:3;24509:12;24502:19;;24531:75;24602:3;24593:6;24531:75;:::i;:::-;24631:2;24626:3;24622:12;24615:19;;24651:3;24644:10;;23997:663;;;;;:::o;24666:222::-;24759:4;24797:2;24786:9;24782:18;24774:26;;24810:71;24878:1;24867:9;24863:17;24854:6;24810:71;:::i;:::-;24666:222;;;;:::o;24894:561::-;25077:4;25115:2;25104:9;25100:18;25092:26;;25128:71;25196:1;25185:9;25181:17;25172:6;25128:71;:::i;:::-;25209:88;25293:2;25282:9;25278:18;25269:6;25209:88;:::i;:::-;25344:9;25338:4;25334:20;25329:2;25318:9;25314:18;25307:48;25372:76;25443:4;25434:6;25372:76;:::i;:::-;25364:84;;24894:561;;;;;;:::o;25461:640::-;25656:4;25694:3;25683:9;25679:19;25671:27;;25708:71;25776:1;25765:9;25761:17;25752:6;25708:71;:::i;:::-;25789:72;25857:2;25846:9;25842:18;25833:6;25789:72;:::i;:::-;25871;25939:2;25928:9;25924:18;25915:6;25871:72;:::i;:::-;25990:9;25984:4;25980:20;25975:2;25964:9;25960:18;25953:48;26018:76;26089:4;26080:6;26018:76;:::i;:::-;26010:84;;25461:640;;;;;;;:::o;26107:664::-;26312:4;26350:3;26339:9;26335:19;26327:27;;26364:71;26432:1;26421:9;26417:17;26408:6;26364:71;:::i;:::-;26445:72;26513:2;26502:9;26498:18;26489:6;26445:72;:::i;:::-;26527;26595:2;26584:9;26580:18;26571:6;26527:72;:::i;:::-;26609;26677:2;26666:9;26662:18;26653:6;26609:72;:::i;:::-;26691:73;26759:3;26748:9;26744:19;26735:6;26691:73;:::i;:::-;26107:664;;;;;;;;:::o;26777:210::-;26864:4;26902:2;26891:9;26887:18;26879:26;;26915:65;26977:1;26966:9;26962:17;26953:6;26915:65;:::i;:::-;26777:210;;;;:::o;26993:222::-;27086:4;27124:2;27113:9;27109:18;27101:26;;27137:71;27205:1;27194:9;27190:17;27181:6;27137:71;:::i;:::-;26993:222;;;;:::o;27221:553::-;27398:4;27436:3;27425:9;27421:19;27413:27;;27450:71;27518:1;27507:9;27503:17;27494:6;27450:71;:::i;:::-;27531:72;27599:2;27588:9;27584:18;27575:6;27531:72;:::i;:::-;27613;27681:2;27670:9;27666:18;27657:6;27613:72;:::i;:::-;27695;27763:2;27752:9;27748:18;27739:6;27695:72;:::i;:::-;27221:553;;;;;;;:::o;27780:648::-;27977:4;28015:3;28004:9;28000:19;27992:27;;28029:71;28097:1;28086:9;28082:17;28073:6;28029:71;:::i;:::-;28110:70;28176:2;28165:9;28161:18;28152:6;28110:70;:::i;:::-;28190;28256:2;28245:9;28241:18;28232:6;28190:70;:::i;:::-;28270;28336:2;28325:9;28321:18;28312:6;28270:70;:::i;:::-;28350:71;28416:3;28405:9;28401:19;28392:6;28350:71;:::i;:::-;27780:648;;;;;;;;:::o;28434:545::-;28607:4;28645:3;28634:9;28630:19;28622:27;;28659:71;28727:1;28716:9;28712:17;28703:6;28659:71;:::i;:::-;28740:68;28804:2;28793:9;28789:18;28780:6;28740:68;:::i;:::-;28818:72;28886:2;28875:9;28871:18;28862:6;28818:72;:::i;:::-;28900;28968:2;28957:9;28953:18;28944:6;28900:72;:::i;:::-;28434:545;;;;;;;:::o;28985:309::-;29096:4;29134:2;29123:9;29119:18;29111:26;;29183:9;29177:4;29173:20;29169:1;29158:9;29154:17;29147:47;29211:76;29282:4;29273:6;29211:76;:::i;:::-;29203:84;;28985:309;;;;:::o;29300:313::-;29413:4;29451:2;29440:9;29436:18;29428:26;;29500:9;29494:4;29490:20;29486:1;29475:9;29471:17;29464:47;29528:78;29601:4;29592:6;29528:78;:::i;:::-;29520:86;;29300:313;;;;:::o;29619:419::-;29785:4;29823:2;29812:9;29808:18;29800:26;;29872:9;29866:4;29862:20;29858:1;29847:9;29843:17;29836:47;29900:131;30026:4;29900:131;:::i;:::-;29892:139;;29619:419;;;:::o;30044:::-;30210:4;30248:2;30237:9;30233:18;30225:26;;30297:9;30291:4;30287:20;30283:1;30272:9;30268:17;30261:47;30325:131;30451:4;30325:131;:::i;:::-;30317:139;;30044:419;;;:::o;30469:::-;30635:4;30673:2;30662:9;30658:18;30650:26;;30722:9;30716:4;30712:20;30708:1;30697:9;30693:17;30686:47;30750:131;30876:4;30750:131;:::i;:::-;30742:139;;30469:419;;;:::o;30894:::-;31060:4;31098:2;31087:9;31083:18;31075:26;;31147:9;31141:4;31137:20;31133:1;31122:9;31118:17;31111:47;31175:131;31301:4;31175:131;:::i;:::-;31167:139;;30894:419;;;:::o;31319:::-;31485:4;31523:2;31512:9;31508:18;31500:26;;31572:9;31566:4;31562:20;31558:1;31547:9;31543:17;31536:47;31600:131;31726:4;31600:131;:::i;:::-;31592:139;;31319:419;;;:::o;31744:::-;31910:4;31948:2;31937:9;31933:18;31925:26;;31997:9;31991:4;31987:20;31983:1;31972:9;31968:17;31961:47;32025:131;32151:4;32025:131;:::i;:::-;32017:139;;31744:419;;;:::o;32169:::-;32335:4;32373:2;32362:9;32358:18;32350:26;;32422:9;32416:4;32412:20;32408:1;32397:9;32393:17;32386:47;32450:131;32576:4;32450:131;:::i;:::-;32442:139;;32169:419;;;:::o;32594:::-;32760:4;32798:2;32787:9;32783:18;32775:26;;32847:9;32841:4;32837:20;32833:1;32822:9;32818:17;32811:47;32875:131;33001:4;32875:131;:::i;:::-;32867:139;;32594:419;;;:::o;33019:::-;33185:4;33223:2;33212:9;33208:18;33200:26;;33272:9;33266:4;33262:20;33258:1;33247:9;33243:17;33236:47;33300:131;33426:4;33300:131;:::i;:::-;33292:139;;33019:419;;;:::o;33444:::-;33610:4;33648:2;33637:9;33633:18;33625:26;;33697:9;33691:4;33687:20;33683:1;33672:9;33668:17;33661:47;33725:131;33851:4;33725:131;:::i;:::-;33717:139;;33444:419;;;:::o;33869:::-;34035:4;34073:2;34062:9;34058:18;34050:26;;34122:9;34116:4;34112:20;34108:1;34097:9;34093:17;34086:47;34150:131;34276:4;34150:131;:::i;:::-;34142:139;;33869:419;;;:::o;34294:::-;34460:4;34498:2;34487:9;34483:18;34475:26;;34547:9;34541:4;34537:20;34533:1;34522:9;34518:17;34511:47;34575:131;34701:4;34575:131;:::i;:::-;34567:139;;34294:419;;;:::o;34719:::-;34885:4;34923:2;34912:9;34908:18;34900:26;;34972:9;34966:4;34962:20;34958:1;34947:9;34943:17;34936:47;35000:131;35126:4;35000:131;:::i;:::-;34992:139;;34719:419;;;:::o;35144:::-;35310:4;35348:2;35337:9;35333:18;35325:26;;35397:9;35391:4;35387:20;35383:1;35372:9;35368:17;35361:47;35425:131;35551:4;35425:131;:::i;:::-;35417:139;;35144:419;;;:::o;35569:::-;35735:4;35773:2;35762:9;35758:18;35750:26;;35822:9;35816:4;35812:20;35808:1;35797:9;35793:17;35786:47;35850:131;35976:4;35850:131;:::i;:::-;35842:139;;35569:419;;;:::o;35994:::-;36160:4;36198:2;36187:9;36183:18;36175:26;;36247:9;36241:4;36237:20;36233:1;36222:9;36218:17;36211:47;36275:131;36401:4;36275:131;:::i;:::-;36267:139;;35994:419;;;:::o;36419:::-;36585:4;36623:2;36612:9;36608:18;36600:26;;36672:9;36666:4;36662:20;36658:1;36647:9;36643:17;36636:47;36700:131;36826:4;36700:131;:::i;:::-;36692:139;;36419:419;;;:::o;36844:::-;37010:4;37048:2;37037:9;37033:18;37025:26;;37097:9;37091:4;37087:20;37083:1;37072:9;37068:17;37061:47;37125:131;37251:4;37125:131;:::i;:::-;37117:139;;36844:419;;;:::o;37269:::-;37435:4;37473:2;37462:9;37458:18;37450:26;;37522:9;37516:4;37512:20;37508:1;37497:9;37493:17;37486:47;37550:131;37676:4;37550:131;:::i;:::-;37542:139;;37269:419;;;:::o;37694:::-;37860:4;37898:2;37887:9;37883:18;37875:26;;37947:9;37941:4;37937:20;37933:1;37922:9;37918:17;37911:47;37975:131;38101:4;37975:131;:::i;:::-;37967:139;;37694:419;;;:::o;38119:::-;38285:4;38323:2;38312:9;38308:18;38300:26;;38372:9;38366:4;38362:20;38358:1;38347:9;38343:17;38336:47;38400:131;38526:4;38400:131;:::i;:::-;38392:139;;38119:419;;;:::o;38544:222::-;38637:4;38675:2;38664:9;38660:18;38652:26;;38688:71;38756:1;38745:9;38741:17;38732:6;38688:71;:::i;:::-;38544:222;;;;:::o;38772:129::-;38806:6;38833:20;;:::i;:::-;38823:30;;38862:33;38890:4;38882:6;38862:33;:::i;:::-;38772:129;;;:::o;38907:75::-;38940:6;38973:2;38967:9;38957:19;;38907:75;:::o;38988:307::-;39049:4;39139:18;39131:6;39128:30;39125:56;;;39161:18;;:::i;:::-;39125:56;39199:29;39221:6;39199:29;:::i;:::-;39191:37;;39283:4;39277;39273:15;39265:23;;38988:307;;;:::o;39301:308::-;39363:4;39453:18;39445:6;39442:30;39439:56;;;39475:18;;:::i;:::-;39439:56;39513:29;39535:6;39513:29;:::i;:::-;39505:37;;39597:4;39591;39587:15;39579:23;;39301:308;;;:::o;39615:98::-;39666:6;39700:5;39694:12;39684:22;;39615:98;;;:::o;39719:99::-;39771:6;39805:5;39799:12;39789:22;;39719:99;;;:::o;39824:168::-;39907:11;39941:6;39936:3;39929:19;39981:4;39976:3;39972:14;39957:29;;39824:168;;;;:::o;39998:147::-;40099:11;40136:3;40121:18;;39998:147;;;;:::o;40151:169::-;40235:11;40269:6;40264:3;40257:19;40309:4;40304:3;40300:14;40285:29;;40151:169;;;;:::o;40326:148::-;40428:11;40465:3;40450:18;;40326:148;;;;:::o;40480:305::-;40520:3;40539:20;40557:1;40539:20;:::i;:::-;40534:25;;40573:20;40591:1;40573:20;:::i;:::-;40568:25;;40727:1;40659:66;40655:74;40652:1;40649:81;40646:107;;;40733:18;;:::i;:::-;40646:107;40777:1;40774;40770:9;40763:16;;40480:305;;;;:::o;40791:185::-;40831:1;40848:20;40866:1;40848:20;:::i;:::-;40843:25;;40882:20;40900:1;40882:20;:::i;:::-;40877:25;;40921:1;40911:35;;40926:18;;:::i;:::-;40911:35;40968:1;40965;40961:9;40956:14;;40791:185;;;;:::o;40982:191::-;41022:4;41042:20;41060:1;41042:20;:::i;:::-;41037:25;;41076:20;41094:1;41076:20;:::i;:::-;41071:25;;41115:1;41112;41109:8;41106:34;;;41120:18;;:::i;:::-;41106:34;41165:1;41162;41158:9;41150:17;;40982:191;;;;:::o;41179:96::-;41216:7;41245:24;41263:5;41245:24;:::i;:::-;41234:35;;41179:96;;;:::o;41281:104::-;41326:7;41355:24;41373:5;41355:24;:::i;:::-;41344:35;;41281:104;;;:::o;41391:90::-;41425:7;41468:5;41461:13;41454:21;41443:32;;41391:90;;;:::o;41487:77::-;41524:7;41553:5;41542:16;;41487:77;;;:::o;41570:149::-;41606:7;41646:66;41639:5;41635:78;41624:89;;41570:149;;;:::o;41725:125::-;41791:7;41820:24;41838:5;41820:24;:::i;:::-;41809:35;;41725:125;;;:::o;41856:89::-;41892:7;41932:6;41925:5;41921:18;41910:29;;41856:89;;;:::o;41951:126::-;41988:7;42028:42;42021:5;42017:54;42006:65;;41951:126;;;:::o;42083:77::-;42120:7;42149:5;42138:16;;42083:77;;;:::o;42166:93::-;42202:7;42242:10;42235:5;42231:22;42220:33;;42166:93;;;:::o;42265:101::-;42301:7;42341:18;42334:5;42330:30;42319:41;;42265:101;;;:::o;42372:86::-;42407:7;42447:4;42440:5;42436:16;42425:27;;42372:86;;;:::o;42464:154::-;42548:6;42543:3;42538;42525:30;42610:1;42601:6;42596:3;42592:16;42585:27;42464:154;;;:::o;42624:307::-;42692:1;42702:113;42716:6;42713:1;42710:13;42702:113;;;42801:1;42796:3;42792:11;42786:18;42782:1;42777:3;42773:11;42766:39;42738:2;42735:1;42731:10;42726:15;;42702:113;;;42833:6;42830:1;42827:13;42824:101;;;42913:1;42904:6;42899:3;42895:16;42888:27;42824:101;42673:258;42624:307;;;:::o;42937:320::-;42981:6;43018:1;43012:4;43008:12;42998:22;;43065:1;43059:4;43055:12;43086:18;43076:81;;43142:4;43134:6;43130:17;43120:27;;43076:81;43204:2;43196:6;43193:14;43173:18;43170:38;43167:84;;;43223:18;;:::i;:::-;43167:84;42988:269;42937:320;;;:::o;43263:281::-;43346:27;43368:4;43346:27;:::i;:::-;43338:6;43334:40;43476:6;43464:10;43461:22;43440:18;43428:10;43425:34;43422:62;43419:88;;;43487:18;;:::i;:::-;43419:88;43527:10;43523:2;43516:22;43306:238;43263:281;;:::o;43550:233::-;43589:3;43612:24;43630:5;43612:24;:::i;:::-;43603:33;;43658:66;43651:5;43648:77;43645:103;;;43728:18;;:::i;:::-;43645:103;43775:1;43768:5;43764:13;43757:20;;43550:233;;;:::o;43789:100::-;43828:7;43857:26;43877:5;43857:26;:::i;:::-;43846:37;;43789:100;;;:::o;43895:79::-;43934:7;43963:5;43952:16;;43895:79;;;:::o;43980:94::-;44019:7;44048:20;44062:5;44048:20;:::i;:::-;44037:31;;43980:94;;;:::o;44080:176::-;44112:1;44129:20;44147:1;44129:20;:::i;:::-;44124:25;;44163:20;44181:1;44163:20;:::i;:::-;44158:25;;44202:1;44192:35;;44207:18;;:::i;:::-;44192:35;44248:1;44245;44241:9;44236:14;;44080:176;;;;:::o;44262:180::-;44310:77;44307:1;44300:88;44407:4;44404:1;44397:15;44431:4;44428:1;44421:15;44448:180;44496:77;44493:1;44486:88;44593:4;44590:1;44583:15;44617:4;44614:1;44607:15;44634:180;44682:77;44679:1;44672:88;44779:4;44776:1;44769:15;44803:4;44800:1;44793:15;44820:180;44868:77;44865:1;44858:88;44965:4;44962:1;44955:15;44989:4;44986:1;44979:15;45006:180;45054:77;45051:1;45044:88;45151:4;45148:1;45141:15;45175:4;45172:1;45165:15;45192:180;45240:77;45237:1;45230:88;45337:4;45334:1;45327:15;45361:4;45358:1;45351:15;45378:117;45487:1;45484;45477:12;45501:117;45610:1;45607;45600:12;45624:117;45733:1;45730;45723:12;45747:117;45856:1;45853;45846:12;45870:102;45911:6;45962:2;45958:7;45953:2;45946:5;45942:14;45938:28;45928:38;;45870:102;;;:::o;45978:94::-;46011:8;46059:5;46055:2;46051:14;46030:35;;45978:94;;;:::o;46078:230::-;46218:34;46214:1;46206:6;46202:14;46195:58;46287:13;46282:2;46274:6;46270:15;46263:38;46078:230;:::o;46314:237::-;46454:34;46450:1;46442:6;46438:14;46431:58;46523:20;46518:2;46510:6;46506:15;46499:45;46314:237;:::o;46557:225::-;46697:34;46693:1;46685:6;46681:14;46674:58;46766:8;46761:2;46753:6;46749:15;46742:33;46557:225;:::o;46788:178::-;46928:30;46924:1;46916:6;46912:14;46905:54;46788:178;:::o;46972:::-;47112:30;47108:1;47100:6;47096:14;47089:54;46972:178;:::o;47156:214::-;47296:66;47292:1;47284:6;47280:14;47273:90;47156:214;:::o;47376:223::-;47516:34;47512:1;47504:6;47500:14;47493:58;47585:6;47580:2;47572:6;47568:15;47561:31;47376:223;:::o;47605:175::-;47745:27;47741:1;47733:6;47729:14;47722:51;47605:175;:::o;47786:231::-;47926:34;47922:1;47914:6;47910:14;47903:58;47995:14;47990:2;47982:6;47978:15;47971:39;47786:231;:::o;48023:224::-;48163:34;48159:1;48151:6;48147:14;48140:58;48232:7;48227:2;48219:6;48215:15;48208:32;48023:224;:::o;48253:243::-;48393:34;48389:1;48381:6;48377:14;48370:58;48462:26;48457:2;48449:6;48445:15;48438:51;48253:243;:::o;48502:229::-;48642:34;48638:1;48630:6;48626:14;48619:58;48711:12;48706:2;48698:6;48694:15;48687:37;48502:229;:::o;48737:228::-;48877:34;48873:1;48865:6;48861:14;48854:58;48946:11;48941:2;48933:6;48929:15;48922:36;48737:228;:::o;48971:160::-;49111:12;49107:1;49099:6;49095:14;49088:36;48971:160;:::o;49137:182::-;49277:34;49273:1;49265:6;49261:14;49254:58;49137:182;:::o;49325:231::-;49465:34;49461:1;49453:6;49449:14;49442:58;49534:14;49529:2;49521:6;49517:15;49510:39;49325:231;:::o;49562:182::-;49702:34;49698:1;49690:6;49686:14;49679:58;49562:182;:::o;49750:162::-;49890:14;49886:1;49878:6;49874:14;49867:38;49750:162;:::o;49918:228::-;50058:34;50054:1;50046:6;50042:14;50035:58;50127:11;50122:2;50114:6;50110:15;50103:36;49918:228;:::o;50152:220::-;50292:34;50288:1;50280:6;50276:14;50269:58;50361:3;50356:2;50348:6;50344:15;50337:28;50152:220;:::o;50378:168::-;50518:20;50514:1;50506:6;50502:14;50495:44;50378:168;:::o;50552:220::-;50692:34;50688:1;50680:6;50676:14;50669:58;50761:3;50756:2;50748:6;50744:15;50737:28;50552:220;:::o;50778:236::-;50918:34;50914:1;50906:6;50902:14;50895:58;50987:19;50982:2;50974:6;50970:15;50963:44;50778:236;:::o;51020:231::-;51160:34;51156:1;51148:6;51144:14;51137:58;51229:14;51224:2;51216:6;51212:15;51205:39;51020:231;:::o;51257:122::-;51330:24;51348:5;51330:24;:::i;:::-;51323:5;51320:35;51310:63;;51369:1;51366;51359:12;51310:63;51257:122;:::o;51385:116::-;51455:21;51470:5;51455:21;:::i;:::-;51448:5;51445:32;51435:60;;51491:1;51488;51481:12;51435:60;51385:116;:::o;51507:122::-;51580:24;51598:5;51580:24;:::i;:::-;51573:5;51570:35;51560:63;;51619:1;51616;51609:12;51560:63;51507:122;:::o;51635:120::-;51707:23;51724:5;51707:23;:::i;:::-;51700:5;51697:34;51687:62;;51745:1;51742;51735:12;51687:62;51635:120;:::o;51761:180::-;51863:53;51910:5;51863:53;:::i;:::-;51856:5;51853:64;51843:92;;51931:1;51928;51921:12;51843:92;51761:180;:::o;51947:122::-;52020:24;52038:5;52020:24;:::i;:::-;52013:5;52010:35;52000:63;;52059:1;52056;52049:12;52000:63;51947:122;:::o;52075:118::-;52146:22;52162:5;52146:22;:::i;:::-;52139:5;52136:33;52126:61;;52183:1;52180;52173:12;52126:61;52075:118;:::o

Swarm Source

ipfs://0b11dbcf048452e5032862e41ce8d4b1d87714a76d60f1665f32d5121440c702

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

A collection of 300 bunnies from the Fade Away Bunny manga by Shiori Kawana. Breed & customise bunnies while participating in the $PILL economy.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.