ETH Price: $3,276.26 (+0.88%)
Gas: 2 Gwei

Token

TAMAGV2 NiftyGotchi (TAMAGV2)
 

Overview

Max Total Supply

118 TAMAGV2

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 TAMAGV2
0x4ce7d126dcb606008a711b46c2d8df50d88e4244
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TAMAG2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-20
*/

// File: @openzeppelin\contracts\GSN\Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: contracts\MyOwnable.sol



pragma solidity ^0.6.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.
 */
contract MyOwnable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract.
     */
    constructor (address o) internal {
        _owner = o;
        emit OwnershipTransferred(address(0), o);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File: node_modules\@openzeppelin\contracts\introspection\IERC165.sol



pragma solidity ^0.6.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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721.sol



pragma solidity ^0.6.2;


/**
 * @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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721Metadata.sol



pragma solidity ^0.6.2;


/**
 * @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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721Enumerable.sol



pragma solidity ^0.6.2;


/**
 * @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: node_modules\@openzeppelin\contracts\token\ERC721\IERC721Receiver.sol



pragma solidity ^0.6.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: node_modules\@openzeppelin\contracts\introspection\ERC165.sol



pragma solidity ^0.6.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: node_modules\@openzeppelin\contracts\math\SafeMath.sol



pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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



pragma solidity ^0.6.2;

/**
 * @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 in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules\@openzeppelin\contracts\utils\EnumerableSet.sol



pragma solidity ^0.6.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
library EnumerableSet {
    // 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];
    }

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

// File: node_modules\@openzeppelin\contracts\utils\EnumerableMap.sol



pragma solidity ^0.6.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

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

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry 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.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

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

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

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

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        return _get(map, key, "EnumerableMap: nonexistent key");
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(value)));
    }

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

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

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

   /**
    * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint256(value)));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key), errorMessage)));
    }
}

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



pragma solidity ^0.6.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: node_modules\@openzeppelin\contracts\token\ERC721\ERC721.sol



pragma solidity ^0.6.0;












/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

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

        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];

        // If there is no base URI, return the token URI.
        if (bytes(_baseURI).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(_baseURI, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = 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 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 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 returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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 = ownerOf(tokenId);

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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(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);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

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

// File: @openzeppelin\contracts\token\ERC721\ERC721Burnable.sol



pragma solidity ^0.6.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: @openzeppelin\contracts\utils\Pausable.sol



pragma solidity ^0.6.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: node_modules\@openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol



pragma solidity ^0.6.0;


/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

// File: node_modules\@openzeppelin\contracts\token\ERC1155\ERC1155Receiver.sol



pragma solidity ^0.6.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    constructor() public {
        _registerInterface(
            ERC1155Receiver(0).onERC1155Received.selector ^
            ERC1155Receiver(0).onERC1155BatchReceived.selector
        );
    }
}

// File: @openzeppelin\contracts\token\ERC1155\ERC1155Holder.sol



pragma solidity ^0.6.0;


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// File: contracts\TAMAG2.sol

pragma solidity ^0.6.0;





interface EquipmentContract{
    function balanceOf(address a, uint256 id) external view returns (uint256);
    function safeBatchTransferFrom(address a, address b,uint256[] memory ids, uint256[] memory bals, bytes memory data) external;
    function safeTransferFrom(address a, address b, uint256 id, uint256 amt, bytes memory data) external;
}
contract TAMAGProperties {
    mapping (uint256 => uint256) public traits;
    mapping (uint256 => uint256) public idToNounce;
}
contract TAMAG2 is MyOwnable, Pausable, ERC721, TAMAGProperties, ERC721Burnable, ERC1155Holder {
    uint256 _tokenIds;
    address public hatchery;
    address public signerAddress;
    address public manager;

    modifier onlyManager() {
        require(_msgSender() == manager || _msgSender() == owner(), "Only manager or owner!");
        _;
    }
    modifier onlyHatchery() {
        require((_msgSender() == owner()) || (hatchery == address(0))|| (_msgSender() == hatchery), "Only owner or hatchery");
        _;
    }
    
    constructor(address _signerAddress, address owner) public MyOwnable(owner) ERC721("TAMAGV2 NiftyGotchi", "TAMAGV2") {
        signerAddress = _signerAddress;
        pause();
    }
    function exists(uint256 tokenId) public view returns (bool){
        return _exists(tokenId);
    }
    function setTokenId(uint256 i) public onlyOwner {
        _tokenIds = i;
    }
     function setHatchery(address a) public onlyOwner {
        hatchery = a;
    }
    function setSignerAddress(address a) public onlyOwner {
        signerAddress = a;
    }
    function setManagerAddress(address a) public onlyOwner {
        manager = a;
    }

    function pause() public onlyOwner {
        _pause();
    }
    function unpause() public onlyOwner {
        _unpause();
    }
    function getAndIncrementNounce(uint256 tokenId) public onlyManager returns (uint256) {
        uint256 n = idToNounce[tokenId];
        idToNounce[tokenId] += 1;
        return n;
    }
   
    function getTrait(uint256 tokenId) public view returns (uint256){
        return traits[tokenId];
    }

    // contract to be paused and set to max tokenIds first.
    function hatch(address player, uint256 trait, string memory tokenURI)
        public onlyHatchery
        whenNotPaused
        returns (uint256)
    {
        _tokenIds = _tokenIds.add(1);

        uint256 newItemId = _tokenIds;
        traits[newItemId] = trait;
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
    function managerMint(address to, uint256 id, uint256 nounce) public onlyManager{
        _mint(to, id);
        idToNounce[id] = nounce;
    }
    function managerSetTokenURI(uint256 id, string memory tokenURI) public onlyManager{
        _setTokenURI(id, tokenURI);
    }
    function managerSetTraitAndURI(uint256 id, uint256 _traits, string memory tokenURI) public onlyManager{
        _setTokenURI(id, tokenURI);
        traits[id] = _traits;
    }

   
    // stuff about equipping
    EquipmentContract public equipmentContract;
    uint256 public NUM_SLOTS = 20;
    // tamag -> slot -> equip
    mapping (uint256 => mapping(uint256 => uint256)) tamagToEquipped;
    // equip -> tamag -> slot 
    mapping (uint256 => mapping(uint256 => uint256)) equippedToTamagSlot;
    mapping (uint256 => EnumerableSet.UintSet) tamagToEquippedTma;

    function burn(uint256 tamagId) public virtual override {
        require(tamagToEquippedTma[tamagId].length() == 0, "tamag still has equips");
        super.burn(tamagId);
    }
    function getEquipAtSlot(uint256 tamagId, uint256 slot) public view isValidSlotNum(slot) returns (uint256){
        return tamagToEquipped[tamagId][slot];
    }

    function getEquippedSlot(uint256 tamagId, uint256 equipId) public view returns (uint256){
        return equippedToTamagSlot[equipId][tamagId];
    }

    event Equipped(uint256 tamagId, uint256 equipId, uint256 slot);
    event UnEquipped(uint256 tamagId, uint256 equipId, uint256 slot);

    modifier isValidSlotNum(uint256 slot) {
        require(slot > 0 && slot < NUM_SLOTS, "Invalid slot"); // slot 0 is used to indicate absence of equipment
        _;
    }

    function isEquipped(uint256 tamagId, uint256 equipId) public view returns (bool){
        return equippedToTamagSlot[equipId][tamagId] > 0; 
    }

    function setSlotNumber(uint256 slots) public onlyOwner {
        NUM_SLOTS = slots;
    }
    function setEquipmentContract(address a) public onlyOwner{
        equipmentContract = EquipmentContract(a);
    }
    function getNumEquipped(uint256 tamagId) public view returns(uint256){
        return tamagToEquippedTma[tamagId].length();
    }

    // nounce is incremented outside of this function by the manager.
    function equipNoChangeGif(address owner, uint256 tamagId, uint256 equipId, uint256 slot) public onlyManager isValidSlotNum(slot){
        equipmentContract.safeTransferFrom(owner, address(this), equipId, 1, "0x0");

        require(equippedToTamagSlot[equipId][tamagId] == 0, "Equip already equipped!");
        require(tamagToEquipped[tamagId][slot] == 0, "Equip slot already taken up");

        // now equip
        tamagToEquipped[tamagId][slot] = equipId;
        equippedToTamagSlot[equipId][tamagId] = slot;
        tamagToEquippedTma[tamagId].add(equipId);
        emit Equipped(tamagId, equipId, slot);
    }
   
    // nounce is incremented outside of this function by the manager.
    // i can unequip if: 
    // 1) i own the tamag
    // 2) the equip was equipped by me.
    function unequipNoChangeGif(address owner, uint256 tamagId, uint256 equipId, uint256 slot) public onlyManager isValidSlotNum(slot){
        require(equippedToTamagSlot[equipId][tamagId] > 0 && tamagToEquipped[tamagId][slot] == equipId, "item not currently equipped to tamag");
        
        tamagToEquipped[tamagId][slot] = 0;
        equippedToTamagSlot[equipId][tamagId] = 0;
        tamagToEquippedTma[tamagId].remove(equipId);
        emit UnEquipped(tamagId, equipId, slot);
        
        equipmentContract.safeTransferFrom(address(this), owner, equipId, 1, "0x0");
    }   

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"owner","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":"uint256","name":"tamagId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"equipId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slot","type":"uint256"}],"name":"Equipped","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tamagId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"equipId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slot","type":"uint256"}],"name":"UnEquipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NUM_SLOTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tamagId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tamagId","type":"uint256"},{"internalType":"uint256","name":"equipId","type":"uint256"},{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"equipNoChangeGif","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"equipmentContract","outputs":[{"internalType":"contract EquipmentContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAndIncrementNounce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tamagId","type":"uint256"},{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"getEquipAtSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tamagId","type":"uint256"},{"internalType":"uint256","name":"equipId","type":"uint256"}],"name":"getEquippedSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tamagId","type":"uint256"}],"name":"getNumEquipped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTrait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"trait","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"hatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hatchery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToNounce","outputs":[{"internalType":"uint256","name":"","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":"uint256","name":"tamagId","type":"uint256"},{"internalType":"uint256","name":"equipId","type":"uint256"}],"name":"isEquipped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nounce","type":"uint256"}],"name":"managerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"managerSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_traits","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"managerSetTraitAndURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"address","name":"a","type":"address"}],"name":"setEquipmentContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setHatchery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setManagerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slots","type":"uint256"}],"name":"setSlotNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"setTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"","type":"uint256"}],"name":"traits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tamagId","type":"uint256"},{"internalType":"uint256","name":"equipId","type":"uint256"},{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"unequipNoChangeGif","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260146012553480156200001657600080fd5b506040516200632c3803806200632c833981810160405260408110156200003c57600080fd5b8101908080519060200190929190805190602001909291905050506040518060400160405280601381526020017f54414d41475632204e69667479476f74636869000000000000000000000000008152506040518060400160405280600781526020017f54414d414756320000000000000000000000000000000000000000000000000081525082806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060008060146101000a81548160ff021916908315150217905550620001926301ffc9a760e01b6200028860201b60201c565b8160079080519060200190620001aa92919062000579565b508060089080519060200190620001c392919062000579565b50620001dc6380ac58cd60e01b6200028860201b60201c565b620001f4635b5e139f60e01b6200028860201b60201c565b6200020c63780e9d6360e01b6200028860201b60201c565b50506200022f63bc197c8160e01b63f23a6e6160e01b186200028860201b60201c565b81600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002806200039160201b60201c565b50506200061f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b620003a16200047460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000462576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b620004726200047c60201b60201c565b565b600033905090565b600060149054906101000a900460ff161562000500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200054c6200047460201b60201c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005bc57805160ff1916838001178555620005ed565b82800160010185558215620005ed579182015b82811115620005ec578251825591602001919060010190620005cf565b5b509050620005fc919062000600565b5090565b5b808211156200061b57600081600090555060010162000601565b5090565b615cfd806200062f6000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80635c975abb1161019d578063a22cb465116100e9578063c929ccf3116100a2578063e985e9c51161007c578063e985e9c514611518578063f23a6e6114611592578063f2fde38b146116d4578063f438d918146117185761030c565b8063c929ccf314611478578063cce37daa146114a6578063d6e560d6146114d45761030c565b8063a22cb46514610f82578063a5f59c4314610fd2578063acb586df14611034578063b88d4fde14611076578063bc197c811461117b578063c87b56dd146113d15761030c565b8063715018a6116101565780638456cb59116101305780638456cb5914610e75578063847dee7e14610e7f5780638da5cb5b14610ecb57806395d89b4114610eff5761030c565b8063715018a614610d265780637855811114610d30578063806a52e114610e295761030c565b80635c975abb14610acc5780635d986cd314610aec5780636352211e14610bb15780636af94adc14610c095780636c0360eb14610c4b57806370a0823114610cce5761030c565b80632d72225b1161025c57806342966c68116102155780634f558e79116101ef5780634f558e79146109ce5780634f6ccce714610a1257806352d68d6c14610a545780635b7633d014610a985761030c565b806342966c6814610938578063481c6a751461096657806348b164d21461099a5761030c565b80632d72225b146107965780632f745c59146107d85780633e806ee51461083a5780633f4ba83a1461087c578063414319081461088657806342842e0e146108ca5761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461066457806319042e761461068257806323b872dd146106d05780632a2ea50f1461073e5761030c565b8063095ea7b314610580578063118292e6146105ce578063119f0ef8146106305761030c565b806301ffc9a714610311578063046dc16614610374578063062fd1ae146103b857806306d4a389146103d657806306fdde03146104a5578063081812fc14610528575b600080fd5b61035c6004803603602081101561032757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061175a565b60405180821515815260200191505060405180910390f35b6103b66004803603602081101561038a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117c2565b005b6103c06118ce565b6040518082815260200191505060405180910390f35b6104a3600480360360608110156103ec57600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561041d57600080fd5b82018360208201111561042f57600080fd5b8035906020019184600183028401116401000000008311171561045157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118d4565b005b6104ad611a09565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ed5780820151818401526020810190506104d2565b50505050905090810190601f16801561051a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105546004803603602081101561053e57600080fd5b8101908080359060200190929190505050611aab565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105cc6004803603604081101561059657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b46565b005b61062e600480360360808110156105e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611c8a565b005b610638612121565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066c612147565b6040518082815260200191505060405180910390f35b6106b86004803603604081101561069857600080fd5b810190808035906020019092919080359060200190929190505050612158565b60405180821515815260200191505060405180910390f35b61073c600480360360608110156106e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612189565b005b6107946004803603606081101561075457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506121ff565b005b6107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612334565b6040518082815260200191505060405180910390f35b610824600480360360408110156107ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061234c565b6040518082815260200191505060405180910390f35b6108666004803603602081101561085057600080fd5b81019080803590602001909291905050506123a7565b6040518082815260200191505060405180910390f35b6108846124fa565b005b6108c86004803603602081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125cc565b005b610936600480360360608110156108e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506126d8565b005b6109646004803603602081101561094e57600080fd5b81019080803590602001909291905050506126f8565b005b61096e612794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a26127ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109fa600480360360208110156109e457600080fd5b81019080803590602001909291905050506127e0565b60405180821515815260200191505060405180910390f35b610a3e60048036036020811015610a2857600080fd5b81019080803590602001909291905050506127f2565b6040518082815260200191505060405180910390f35b610a9660048036036020811015610a6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b005b610aa0612921565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ad4612947565b60405180821515815260200191505060405180910390f35b610baf60048036036040811015610b0257600080fd5b810190808035906020019092919080359060200190640100000000811115610b2957600080fd5b820183602082011115610b3b57600080fd5b80359060200191846001830284011164010000000083111715610b5d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061295d565b005b610bdd60048036036020811015610bc757600080fd5b8101908080359060200190929190505050612a79565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c3560048036036020811015610c1f57600080fd5b8101908080359060200190929190505050612ab0565b6040518082815260200191505060405180910390f35b610c53612ac8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c93578082015181840152602081019050610c78565b50505050905090810190601f168015610cc05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d1060048036036020811015610ce457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b6a565b6040518082815260200191505060405180910390f35b610d2e612c3f565b005b610e1360048036036060811015610d4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d8d57600080fd5b820183602082011115610d9f57600080fd5b80359060200191846001830284011164010000000083111715610dc157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612dc5565b6040518082815260200191505060405180910390f35b610e5f60048036036040811015610e3f57600080fd5b81019080803590602001909291908035906020019092919050505061300b565b6040518082815260200191505060405180910390f35b610e7d6130bf565b005b610eb560048036036040811015610e9557600080fd5b810190808035906020019092919080359060200190929190505050613191565b6040518082815260200191505060405180910390f35b610ed36131c0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f076131e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f47578082015181840152602081019050610f2c565b50505050905090810190601f168015610f745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061328b565b005b61103260048036036080811015610fe857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050613441565b005b6110606004803603602081101561104a57600080fd5b8101908080359060200190929190505050613852565b6040518082815260200191505060405180910390f35b6111796004803603608081101561108c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110f357600080fd5b82018360208201111561110557600080fd5b8035906020019184600183028401116401000000008311171561112757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061386f565b005b61139c600480360360a081101561119157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156111ee57600080fd5b82018360208201111561120057600080fd5b8035906020019184602083028401116401000000008311171561122257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128257600080fd5b82018360208201111561129457600080fd5b803590602001918460208302840111640100000000831117156112b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561131657600080fd5b82018360208201111561132857600080fd5b8035906020019184600183028401116401000000008311171561134a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138e7565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6113fd600480360360208110156113e757600080fd5b81019080803590602001909291905050506138fc565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561143d578082015181840152602081019050611422565b50505050905090810190601f16801561146a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6114a46004803603602081101561148e57600080fd5b8101908080359060200190929190505050613be5565b005b6114d2600480360360208110156114bc57600080fd5b8101908080359060200190929190505050613cb7565b005b611516600480360360208110156114ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d89565b005b61157a6004803603604081101561152e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e95565b60405180821515815260200191505060405180910390f35b61169f600480360360a08110156115a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561161957600080fd5b82018360208201111561162b57600080fd5b8035906020019184600183028401116401000000008311171561164d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613f29565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b611716600480360360208110156116ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f3e565b005b6117446004803603602081101561172e57600080fd5b8101908080359060200190929190505050614149565b6040518082815260200191505060405180910390f35b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6117ca61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461188a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661191561416d565b73ffffffffffffffffffffffffffffffffffffffff161480611970575061193a6131c0565b73ffffffffffffffffffffffffffffffffffffffff1661195861416d565b73ffffffffffffffffffffffffffffffffffffffff16145b6119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b6119ec8382614175565b81600b600085815260200190815260200160002081905550505050565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa15780601f10611a7657610100808354040283529160200191611aa1565b820191906000526020600020905b815481529060010190602001808311611a8457829003601f168201915b5050505050905090565b6000611ab6826141ff565b611b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b72602c913960400191505060405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b5182612a79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615c226021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611bf761416d565b73ffffffffffffffffffffffffffffffffffffffff161480611c265750611c2581611c2061416d565b613e95565b5b611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180615ac56038913960400191505060405180910390fd5b611c85838361421c565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ccb61416d565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cf06131c0565b73ffffffffffffffffffffffffffffffffffffffff16611d0e61416d565b73ffffffffffffffffffffffffffffffffffffffff16145b611d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b80600081118015611daa575060125481105b611e1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a86308660016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200180602001828103825260038152602001807f307830000000000000000000000000000000000000000000000000000000000081525060200195505050505050600060405180830381600087803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b5050505060006014600085815260200190815260200160002060008681526020019081526020016000205414611fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f457175697020616c72656164792065717569707065642100000000000000000081525060200191505060405180910390fd5b6000601360008681526020019081526020016000206000848152602001908152602001600020541461205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457175697020736c6f7420616c72656164792074616b656e207570000000000081525060200191505060405180910390fd5b826013600086815260200190815260200160002060008481526020019081526020016000208190555081601460008581526020019081526020016000206000868152602001908152602001600020819055506120d283601560008781526020019081526020016000206142d590919063ffffffff16565b507faa072a32deda4d55f73cecc4309b5c5b0401b1cd6c98acc14e3ba7913e4b291484848460405180848152602001838152602001828152602001935050505060405180910390a15050505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061215360036142ef565b905090565b6000806014600084815260200190815260200160002060008581526020019081526020016000205411905092915050565b61219a61219461416d565b82614304565b6121ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c436031913960400191505060405180910390fd5b6121fa8383836143f8565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661224061416d565b73ffffffffffffffffffffffffffffffffffffffff16148061229b57506122656131c0565b73ffffffffffffffffffffffffffffffffffffffff1661228361416d565b73ffffffffffffffffffffffffffffffffffffffff16145b61230d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b612317838361463b565b80600c600084815260200190815260200160002081905550505050565b600b6020528060005260406000206000915090505481565b600061239f82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061482f90919063ffffffff16565b905092915050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123ea61416d565b73ffffffffffffffffffffffffffffffffffffffff161480612445575061240f6131c0565b73ffffffffffffffffffffffffffffffffffffffff1661242d61416d565b73ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b6000600c60008481526020019081526020016000205490506001600c60008581526020019081526020016000206000828254019250508190555080915050919050565b61250261416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6125ca614849565b565b6125d461416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126f38383836040518060200160405280600081525061386f565b505050565b60006127156015600084815260200190815260200160002061493b565b14612788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f74616d6167207374696c6c20686173206571756970730000000000000000000081525060200191505060405180910390fd5b61279181614950565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127eb826141ff565b9050919050565b6000806128098360036149c290919063ffffffff16565b50905080915050919050565b61281d61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060149054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661299e61416d565b73ffffffffffffffffffffffffffffffffffffffff1614806129f957506129c36131c0565b73ffffffffffffffffffffffffffffffffffffffff166129e161416d565b73ffffffffffffffffffffffffffffffffffffffff16145b612a6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b612a758282614175565b5050565b6000612aa982604051806060016040528060298152602001615b276029913960036149ee9092919063ffffffff16565b9050919050565b600c6020528060005260406000206000915090505481565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b605780601f10612b3557610100808354040283529160200191612b60565b820191906000526020600020905b815481529060010190602001808311612b4357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615afd602a913960400191505060405180910390fd5b612c38600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061493b565b9050919050565b612c4761416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000612dcf6131c0565b73ffffffffffffffffffffffffffffffffffffffff16612ded61416d565b73ffffffffffffffffffffffffffffffffffffffff161480612e5d5750600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612ebc5750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ea461416d565b73ffffffffffffffffffffffffffffffffffffffff16145b612f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206f776e6572206f722068617463686572790000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615612fb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612fc76001600d54614a0d90919063ffffffff16565b600d819055506000600d54905083600b600083815260200190815260200160002081905550612ff6858261463b565b6130008184614175565b809150509392505050565b60008160008111801561301f575060125481105b613091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b6013600085815260200190815260200160002060008481526020019081526020016000205491505092915050565b6130c761416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613187576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61318f614a95565b565b600060146000838152602001908152602001600020600084815260200190815260200160002054905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132815780601f1061325657610100808354040283529160200191613281565b820191906000526020600020905b81548152906001019060200180831161326457829003601f168201915b5050505050905090565b61329361416d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613334576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b806006600061334161416d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166133ee61416d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661348261416d565b73ffffffffffffffffffffffffffffffffffffffff1614806134dd57506134a76131c0565b73ffffffffffffffffffffffffffffffffffffffff166134c561416d565b73ffffffffffffffffffffffffffffffffffffffff16145b61354f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b80600081118015613561575060125481105b6135d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006014600085815260200190815260200160002060008681526020019081526020016000205411801561362a57508260136000868152602001908152602001600020600084815260200190815260200160002054145b61367f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615ca46024913960400191505060405180910390fd5b6000601360008681526020019081526020016000206000848152602001908152602001600020819055506000601460008581526020019081526020016000206000868152602001908152602001600020819055506136f88360156000878152602001908152602001600020614b8990919063ffffffff16565b507f519820b1f569a6e5e0f6a8a9e81e83fb6890d7641fd1af83ae4107eb0f5e4f4084848460405180848152602001838152602001828152602001935050505060405180910390a1601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a30878660016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200180602001828103825260038152602001807f307830000000000000000000000000000000000000000000000000000000000081525060200195505050505050600060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050505050505050565b6000600b6000838152602001908152602001600020549050919050565b61388061387a61416d565b83614304565b6138d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c436031913960400191505060405180910390fd5b6138e184848484614ba3565b50505050565b600063bc197c8160e01b905095945050505050565b6060613907826141ff565b61395c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615bf3602f913960400191505060405180910390fd5b6060600960008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a055780601f106139da57610100808354040283529160200191613a05565b820191906000526020600020905b8154815290600101906020018083116139e857829003601f168201915b505050505090506000600a8054600181600116156101000203166002900490501415613a345780915050613be0565b600081511115613b0d57600a816040516020018083805460018160011615610100020316600290048015613a9f5780601f10613a7d576101008083540402835291820191613a9f565b820191906000526020600020905b815481529060010190602001808311613a8b575b505082805190602001908083835b60208310613ad05780518252602082019150602081019050602083039250613aad565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050613be0565b600a613b1884614c15565b6040516020018083805460018160011615610100020316600290048015613b765780601f10613b54576101008083540402835291820191613b76565b820191906000526020600020905b815481529060010190602001808311613b62575b505082805190602001908083835b60208310613ba75780518252602082019150602081019050602083039250613b84565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529150505b919050565b613bed61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b613cbf61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060128190555050565b613d9161416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b613f4661416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561408c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615a4f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006141666015600084815260200190815260200160002061493b565b9050919050565b600033905090565b61417e826141ff565b6141d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b9e602c913960400191505060405180910390fd5b806009600084815260200190815260200160002090805190602001906141fa929190615915565b505050565b6000614215826003614d5c90919063ffffffff16565b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661428f83612a79565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006142e7836000018360001b614d76565b905092915050565b60006142fd82600001614de6565b9050919050565b600061430f826141ff565b614364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615a99602c913960400191505060405180910390fd5b600061436f83612a79565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806143de57508373ffffffffffffffffffffffffffffffffffffffff166143c684611aab565b73ffffffffffffffffffffffffffffffffffffffff16145b806143ef57506143ee8185613e95565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661441882612a79565b73ffffffffffffffffffffffffffffffffffffffff1614614484576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615bca6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561450a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615a756024913960400191505060405180910390fd5b614515838383614df7565b61452060008261421c565b61457181600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b8990919063ffffffff16565b506145c381600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206142d590919063ffffffff16565b506145da81836003614dfc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6146e7816141ff565b1561475a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b61476660008383614df7565b6147b781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206142d590919063ffffffff16565b506147ce81836003614dfc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061483e8360000183614e31565b60001c905092915050565b600060149054906101000a900460ff166148cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61490e61416d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061494982600001614eb4565b9050919050565b61496161495b61416d565b82614304565b6149b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615c746030913960400191505060405180910390fd5b6149bf81614ec5565b50565b6000806000806149d58660000186614fff565b915091508160001c8160001c9350935050509250929050565b6000614a01846000018460001b84615098565b60001c90509392505050565b600080828401905083811015614a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600060149054906101000a900460ff1615614b18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614b5c61416d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000614b9b836000018360001b61518e565b905092915050565b614bae8484846143f8565b614bba84848484615276565b614c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615a1d6032913960400191505060405180910390fd5b50505050565b60606000821415614c5d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614d57565b600082905060005b60008214614c87578080600101915050600a8281614c7f57fe5b049150614c65565b60608167ffffffffffffffff81118015614ca057600080fd5b506040519080825280601f01601f191660200182016040528015614cd35781602001600182028036833780820191505090505b50905060006001830390508593505b60008414614d4f57600a8481614cf457fe5b0660300160f81b82828060019003935081518110614d0e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481614d4757fe5b049350614ce2565b819450505050505b919050565b6000614d6e836000018360001b61548f565b905092915050565b6000614d8283836154b2565b614ddb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614de0565b600090505b92915050565b600081600001805490509050919050565b505050565b6000614e28846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6154d5565b90509392505050565b600081836000018054905011614e92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159fb6022913960400191505060405180910390fd5b826000018281548110614ea157fe5b9060005260206000200154905092915050565b600081600001805490509050919050565b6000614ed082612a79565b9050614ede81600084614df7565b614ee960008361421c565b60006009600084815260200190815260200160002080546001816001161561010002031660029004905014614f3857600960008381526020019081526020016000206000614f379190615995565b5b614f8982600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b8990919063ffffffff16565b50614f9e8260036155b190919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082846000018054905011615061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b506022913960400191505060405180910390fd5b600084600001848154811061507257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061515f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615124578082015181840152602081019050615109565b50505050905090810190601f1680156151515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061517257fe5b9060005260206000209060020201600101549150509392505050565b6000808360010160008481526020019081526020016000205490506000811461526a57600060018203905060006001866000018054905003905060008660000182815481106151d957fe5b90600052602060002001549050808760000184815481106151f657fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061522e57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050615270565b60009150505b92915050565b60006152978473ffffffffffffffffffffffffffffffffffffffff166155cb565b6152a45760019050615487565b606061540e63150b7a0260e01b6152b961416d565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561533d578082015181840152602081019050615322565b50505050905090810190601f16801561536a5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a1d603291398773ffffffffffffffffffffffffffffffffffffffff166155de9092919063ffffffff16565b9050600081806020019051602081101561542757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080846001016000858152602001908152602001600020549050600081141561557c578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506155aa565b8285600001600183038154811061558f57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60006155c3836000018360001b6155f6565b905092915050565b600080823b905060008111915050919050565b60606155ed848460008561570f565b90509392505050565b60008083600101600084815260200190815260200160002054905060008114615703576000600182039050600060018660000180549050039050600086600001828154811061564157fe5b906000526020600020906002020190508087600001848154811061566157fe5b90600052602060002090600202016000820154816000015560018201548160010155905050600183018760010160008360000154815260200190815260200160002081905550866000018054806156b457fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615709565b60009150505b92915050565b606061571a856155cb565b61578c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106157dc57805182526020820191506020810190506020830392506157b9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461583e576040519150601f19603f3d011682016040523d82523d6000602084013e615843565b606091505b5091509150811561585857809250505061590d565b60008151111561586b5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158d25780820151818401526020810190506158b7565b50505050905090810190601f1680156158ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061595657805160ff1916838001178555615984565b82800160010185558215615984579182015b82811115615983578251825591602001919060010190615968565b5b50905061599191906159dd565b5090565b50805460018160011615610100020316600290046000825580601f106159bb57506159da565b601f0160209004906000526020600020908101906159d991906159dd565b5b50565b5b808211156159f65760008160009055506001016159de565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646974656d206e6f742063757272656e746c7920657175697070656420746f2074616d6167a2646970667358221220126e2180119e7fd6366bc5b6250a5bc433f28e7a2074d24fc0677f2676997ba464736f6c634300060c00330000000000000000000000008ef9a1a12e0b7e92f11d112f51ae1054ddc0e37d000000000000000000000000c2884de64ceff15211bb884a1e84f5aead9fdc7c

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80635c975abb1161019d578063a22cb465116100e9578063c929ccf3116100a2578063e985e9c51161007c578063e985e9c514611518578063f23a6e6114611592578063f2fde38b146116d4578063f438d918146117185761030c565b8063c929ccf314611478578063cce37daa146114a6578063d6e560d6146114d45761030c565b8063a22cb46514610f82578063a5f59c4314610fd2578063acb586df14611034578063b88d4fde14611076578063bc197c811461117b578063c87b56dd146113d15761030c565b8063715018a6116101565780638456cb59116101305780638456cb5914610e75578063847dee7e14610e7f5780638da5cb5b14610ecb57806395d89b4114610eff5761030c565b8063715018a614610d265780637855811114610d30578063806a52e114610e295761030c565b80635c975abb14610acc5780635d986cd314610aec5780636352211e14610bb15780636af94adc14610c095780636c0360eb14610c4b57806370a0823114610cce5761030c565b80632d72225b1161025c57806342966c68116102155780634f558e79116101ef5780634f558e79146109ce5780634f6ccce714610a1257806352d68d6c14610a545780635b7633d014610a985761030c565b806342966c6814610938578063481c6a751461096657806348b164d21461099a5761030c565b80632d72225b146107965780632f745c59146107d85780633e806ee51461083a5780633f4ba83a1461087c578063414319081461088657806342842e0e146108ca5761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461066457806319042e761461068257806323b872dd146106d05780632a2ea50f1461073e5761030c565b8063095ea7b314610580578063118292e6146105ce578063119f0ef8146106305761030c565b806301ffc9a714610311578063046dc16614610374578063062fd1ae146103b857806306d4a389146103d657806306fdde03146104a5578063081812fc14610528575b600080fd5b61035c6004803603602081101561032757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061175a565b60405180821515815260200191505060405180910390f35b6103b66004803603602081101561038a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117c2565b005b6103c06118ce565b6040518082815260200191505060405180910390f35b6104a3600480360360608110156103ec57600080fd5b8101908080359060200190929190803590602001909291908035906020019064010000000081111561041d57600080fd5b82018360208201111561042f57600080fd5b8035906020019184600183028401116401000000008311171561045157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118d4565b005b6104ad611a09565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ed5780820151818401526020810190506104d2565b50505050905090810190601f16801561051a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105546004803603602081101561053e57600080fd5b8101908080359060200190929190505050611aab565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105cc6004803603604081101561059657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b46565b005b61062e600480360360808110156105e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611c8a565b005b610638612121565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066c612147565b6040518082815260200191505060405180910390f35b6106b86004803603604081101561069857600080fd5b810190808035906020019092919080359060200190929190505050612158565b60405180821515815260200191505060405180910390f35b61073c600480360360608110156106e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612189565b005b6107946004803603606081101561075457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506121ff565b005b6107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612334565b6040518082815260200191505060405180910390f35b610824600480360360408110156107ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061234c565b6040518082815260200191505060405180910390f35b6108666004803603602081101561085057600080fd5b81019080803590602001909291905050506123a7565b6040518082815260200191505060405180910390f35b6108846124fa565b005b6108c86004803603602081101561089c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125cc565b005b610936600480360360608110156108e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506126d8565b005b6109646004803603602081101561094e57600080fd5b81019080803590602001909291905050506126f8565b005b61096e612794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a26127ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109fa600480360360208110156109e457600080fd5b81019080803590602001909291905050506127e0565b60405180821515815260200191505060405180910390f35b610a3e60048036036020811015610a2857600080fd5b81019080803590602001909291905050506127f2565b6040518082815260200191505060405180910390f35b610a9660048036036020811015610a6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612815565b005b610aa0612921565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ad4612947565b60405180821515815260200191505060405180910390f35b610baf60048036036040811015610b0257600080fd5b810190808035906020019092919080359060200190640100000000811115610b2957600080fd5b820183602082011115610b3b57600080fd5b80359060200191846001830284011164010000000083111715610b5d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061295d565b005b610bdd60048036036020811015610bc757600080fd5b8101908080359060200190929190505050612a79565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c3560048036036020811015610c1f57600080fd5b8101908080359060200190929190505050612ab0565b6040518082815260200191505060405180910390f35b610c53612ac8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c93578082015181840152602081019050610c78565b50505050905090810190601f168015610cc05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d1060048036036020811015610ce457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b6a565b6040518082815260200191505060405180910390f35b610d2e612c3f565b005b610e1360048036036060811015610d4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d8d57600080fd5b820183602082011115610d9f57600080fd5b80359060200191846001830284011164010000000083111715610dc157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612dc5565b6040518082815260200191505060405180910390f35b610e5f60048036036040811015610e3f57600080fd5b81019080803590602001909291908035906020019092919050505061300b565b6040518082815260200191505060405180910390f35b610e7d6130bf565b005b610eb560048036036040811015610e9557600080fd5b810190808035906020019092919080359060200190929190505050613191565b6040518082815260200191505060405180910390f35b610ed36131c0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f076131e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f47578082015181840152602081019050610f2c565b50505050905090810190601f168015610f745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061328b565b005b61103260048036036080811015610fe857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050613441565b005b6110606004803603602081101561104a57600080fd5b8101908080359060200190929190505050613852565b6040518082815260200191505060405180910390f35b6111796004803603608081101561108c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110f357600080fd5b82018360208201111561110557600080fd5b8035906020019184600183028401116401000000008311171561112757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061386f565b005b61139c600480360360a081101561119157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156111ee57600080fd5b82018360208201111561120057600080fd5b8035906020019184602083028401116401000000008311171561122257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561128257600080fd5b82018360208201111561129457600080fd5b803590602001918460208302840111640100000000831117156112b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561131657600080fd5b82018360208201111561132857600080fd5b8035906020019184600183028401116401000000008311171561134a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138e7565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6113fd600480360360208110156113e757600080fd5b81019080803590602001909291905050506138fc565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561143d578082015181840152602081019050611422565b50505050905090810190601f16801561146a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6114a46004803603602081101561148e57600080fd5b8101908080359060200190929190505050613be5565b005b6114d2600480360360208110156114bc57600080fd5b8101908080359060200190929190505050613cb7565b005b611516600480360360208110156114ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d89565b005b61157a6004803603604081101561152e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e95565b60405180821515815260200191505060405180910390f35b61169f600480360360a08110156115a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561161957600080fd5b82018360208201111561162b57600080fd5b8035906020019184600183028401116401000000008311171561164d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613f29565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b611716600480360360208110156116ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f3e565b005b6117446004803603602081101561172e57600080fd5b8101908080359060200190929190505050614149565b6040518082815260200191505060405180910390f35b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6117ca61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461188a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661191561416d565b73ffffffffffffffffffffffffffffffffffffffff161480611970575061193a6131c0565b73ffffffffffffffffffffffffffffffffffffffff1661195861416d565b73ffffffffffffffffffffffffffffffffffffffff16145b6119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b6119ec8382614175565b81600b600085815260200190815260200160002081905550505050565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa15780601f10611a7657610100808354040283529160200191611aa1565b820191906000526020600020905b815481529060010190602001808311611a8457829003601f168201915b5050505050905090565b6000611ab6826141ff565b611b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b72602c913960400191505060405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611b5182612a79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615c226021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611bf761416d565b73ffffffffffffffffffffffffffffffffffffffff161480611c265750611c2581611c2061416d565b613e95565b5b611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180615ac56038913960400191505060405180910390fd5b611c85838361421c565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ccb61416d565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cf06131c0565b73ffffffffffffffffffffffffffffffffffffffff16611d0e61416d565b73ffffffffffffffffffffffffffffffffffffffff16145b611d98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b80600081118015611daa575060125481105b611e1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a86308660016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200180602001828103825260038152602001807f307830000000000000000000000000000000000000000000000000000000000081525060200195505050505050600060405180830381600087803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b5050505060006014600085815260200190815260200160002060008681526020019081526020016000205414611fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f457175697020616c72656164792065717569707065642100000000000000000081525060200191505060405180910390fd5b6000601360008681526020019081526020016000206000848152602001908152602001600020541461205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f457175697020736c6f7420616c72656164792074616b656e207570000000000081525060200191505060405180910390fd5b826013600086815260200190815260200160002060008481526020019081526020016000208190555081601460008581526020019081526020016000206000868152602001908152602001600020819055506120d283601560008781526020019081526020016000206142d590919063ffffffff16565b507faa072a32deda4d55f73cecc4309b5c5b0401b1cd6c98acc14e3ba7913e4b291484848460405180848152602001838152602001828152602001935050505060405180910390a15050505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061215360036142ef565b905090565b6000806014600084815260200190815260200160002060008581526020019081526020016000205411905092915050565b61219a61219461416d565b82614304565b6121ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c436031913960400191505060405180910390fd5b6121fa8383836143f8565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661224061416d565b73ffffffffffffffffffffffffffffffffffffffff16148061229b57506122656131c0565b73ffffffffffffffffffffffffffffffffffffffff1661228361416d565b73ffffffffffffffffffffffffffffffffffffffff16145b61230d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b612317838361463b565b80600c600084815260200190815260200160002081905550505050565b600b6020528060005260406000206000915090505481565b600061239f82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061482f90919063ffffffff16565b905092915050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123ea61416d565b73ffffffffffffffffffffffffffffffffffffffff161480612445575061240f6131c0565b73ffffffffffffffffffffffffffffffffffffffff1661242d61416d565b73ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b6000600c60008481526020019081526020016000205490506001600c60008581526020019081526020016000206000828254019250508190555080915050919050565b61250261416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6125ca614849565b565b6125d461416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126f38383836040518060200160405280600081525061386f565b505050565b60006127156015600084815260200190815260200160002061493b565b14612788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f74616d6167207374696c6c20686173206571756970730000000000000000000081525060200191505060405180910390fd5b61279181614950565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127eb826141ff565b9050919050565b6000806128098360036149c290919063ffffffff16565b50905080915050919050565b61281d61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060149054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661299e61416d565b73ffffffffffffffffffffffffffffffffffffffff1614806129f957506129c36131c0565b73ffffffffffffffffffffffffffffffffffffffff166129e161416d565b73ffffffffffffffffffffffffffffffffffffffff16145b612a6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b612a758282614175565b5050565b6000612aa982604051806060016040528060298152602001615b276029913960036149ee9092919063ffffffff16565b9050919050565b600c6020528060005260406000206000915090505481565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b605780601f10612b3557610100808354040283529160200191612b60565b820191906000526020600020905b815481529060010190602001808311612b4357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615afd602a913960400191505060405180910390fd5b612c38600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061493b565b9050919050565b612c4761416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000612dcf6131c0565b73ffffffffffffffffffffffffffffffffffffffff16612ded61416d565b73ffffffffffffffffffffffffffffffffffffffff161480612e5d5750600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612ebc5750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ea461416d565b73ffffffffffffffffffffffffffffffffffffffff16145b612f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206f776e6572206f722068617463686572790000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615612fb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612fc76001600d54614a0d90919063ffffffff16565b600d819055506000600d54905083600b600083815260200190815260200160002081905550612ff6858261463b565b6130008184614175565b809150509392505050565b60008160008111801561301f575060125481105b613091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b6013600085815260200190815260200160002060008481526020019081526020016000205491505092915050565b6130c761416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613187576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61318f614a95565b565b600060146000838152602001908152602001600020600084815260200190815260200160002054905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132815780601f1061325657610100808354040283529160200191613281565b820191906000526020600020905b81548152906001019060200180831161326457829003601f168201915b5050505050905090565b61329361416d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613334576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b806006600061334161416d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166133ee61416d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661348261416d565b73ffffffffffffffffffffffffffffffffffffffff1614806134dd57506134a76131c0565b73ffffffffffffffffffffffffffffffffffffffff166134c561416d565b73ffffffffffffffffffffffffffffffffffffffff16145b61354f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4f6e6c79206d616e61676572206f72206f776e6572210000000000000000000081525060200191505060405180910390fd5b80600081118015613561575060125481105b6135d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420736c6f74000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006014600085815260200190815260200160002060008681526020019081526020016000205411801561362a57508260136000868152602001908152602001600020600084815260200190815260200160002054145b61367f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615ca46024913960400191505060405180910390fd5b6000601360008681526020019081526020016000206000848152602001908152602001600020819055506000601460008581526020019081526020016000206000868152602001908152602001600020819055506136f88360156000878152602001908152602001600020614b8990919063ffffffff16565b507f519820b1f569a6e5e0f6a8a9e81e83fb6890d7641fd1af83ae4107eb0f5e4f4084848460405180848152602001838152602001828152602001935050505060405180910390a1601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a30878660016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200180602001828103825260038152602001807f307830000000000000000000000000000000000000000000000000000000000081525060200195505050505050600060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050505050505050565b6000600b6000838152602001908152602001600020549050919050565b61388061387a61416d565b83614304565b6138d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c436031913960400191505060405180910390fd5b6138e184848484614ba3565b50505050565b600063bc197c8160e01b905095945050505050565b6060613907826141ff565b61395c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615bf3602f913960400191505060405180910390fd5b6060600960008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a055780601f106139da57610100808354040283529160200191613a05565b820191906000526020600020905b8154815290600101906020018083116139e857829003601f168201915b505050505090506000600a8054600181600116156101000203166002900490501415613a345780915050613be0565b600081511115613b0d57600a816040516020018083805460018160011615610100020316600290048015613a9f5780601f10613a7d576101008083540402835291820191613a9f565b820191906000526020600020905b815481529060010190602001808311613a8b575b505082805190602001908083835b60208310613ad05780518252602082019150602081019050602083039250613aad565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050613be0565b600a613b1884614c15565b6040516020018083805460018160011615610100020316600290048015613b765780601f10613b54576101008083540402835291820191613b76565b820191906000526020600020905b815481529060010190602001808311613b62575b505082805190602001908083835b60208310613ba75780518252602082019150602081019050602083039250613b84565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529150505b919050565b613bed61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b613cbf61416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060128190555050565b613d9161416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b613f4661416d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561408c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615a4f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006141666015600084815260200190815260200160002061493b565b9050919050565b600033905090565b61417e826141ff565b6141d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b9e602c913960400191505060405180910390fd5b806009600084815260200190815260200160002090805190602001906141fa929190615915565b505050565b6000614215826003614d5c90919063ffffffff16565b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661428f83612a79565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006142e7836000018360001b614d76565b905092915050565b60006142fd82600001614de6565b9050919050565b600061430f826141ff565b614364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615a99602c913960400191505060405180910390fd5b600061436f83612a79565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806143de57508373ffffffffffffffffffffffffffffffffffffffff166143c684611aab565b73ffffffffffffffffffffffffffffffffffffffff16145b806143ef57506143ee8185613e95565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661441882612a79565b73ffffffffffffffffffffffffffffffffffffffff1614614484576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615bca6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561450a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615a756024913960400191505060405180910390fd5b614515838383614df7565b61452060008261421c565b61457181600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b8990919063ffffffff16565b506145c381600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206142d590919063ffffffff16565b506145da81836003614dfc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6146e7816141ff565b1561475a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b61476660008383614df7565b6147b781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206142d590919063ffffffff16565b506147ce81836003614dfc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061483e8360000183614e31565b60001c905092915050565b600060149054906101000a900460ff166148cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61490e61416d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061494982600001614eb4565b9050919050565b61496161495b61416d565b82614304565b6149b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615c746030913960400191505060405180910390fd5b6149bf81614ec5565b50565b6000806000806149d58660000186614fff565b915091508160001c8160001c9350935050509250929050565b6000614a01846000018460001b84615098565b60001c90509392505050565b600080828401905083811015614a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600060149054906101000a900460ff1615614b18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614b5c61416d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000614b9b836000018360001b61518e565b905092915050565b614bae8484846143f8565b614bba84848484615276565b614c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615a1d6032913960400191505060405180910390fd5b50505050565b60606000821415614c5d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614d57565b600082905060005b60008214614c87578080600101915050600a8281614c7f57fe5b049150614c65565b60608167ffffffffffffffff81118015614ca057600080fd5b506040519080825280601f01601f191660200182016040528015614cd35781602001600182028036833780820191505090505b50905060006001830390508593505b60008414614d4f57600a8481614cf457fe5b0660300160f81b82828060019003935081518110614d0e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481614d4757fe5b049350614ce2565b819450505050505b919050565b6000614d6e836000018360001b61548f565b905092915050565b6000614d8283836154b2565b614ddb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614de0565b600090505b92915050565b600081600001805490509050919050565b505050565b6000614e28846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6154d5565b90509392505050565b600081836000018054905011614e92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159fb6022913960400191505060405180910390fd5b826000018281548110614ea157fe5b9060005260206000200154905092915050565b600081600001805490509050919050565b6000614ed082612a79565b9050614ede81600084614df7565b614ee960008361421c565b60006009600084815260200190815260200160002080546001816001161561010002031660029004905014614f3857600960008381526020019081526020016000206000614f379190615995565b5b614f8982600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b8990919063ffffffff16565b50614f9e8260036155b190919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008082846000018054905011615061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b506022913960400191505060405180910390fd5b600084600001848154811061507257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061515f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615124578082015181840152602081019050615109565b50505050905090810190601f1680156151515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061517257fe5b9060005260206000209060020201600101549150509392505050565b6000808360010160008481526020019081526020016000205490506000811461526a57600060018203905060006001866000018054905003905060008660000182815481106151d957fe5b90600052602060002001549050808760000184815481106151f657fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061522e57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050615270565b60009150505b92915050565b60006152978473ffffffffffffffffffffffffffffffffffffffff166155cb565b6152a45760019050615487565b606061540e63150b7a0260e01b6152b961416d565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561533d578082015181840152602081019050615322565b50505050905090810190601f16801561536a5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a1d603291398773ffffffffffffffffffffffffffffffffffffffff166155de9092919063ffffffff16565b9050600081806020019051602081101561542757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080846001016000858152602001908152602001600020549050600081141561557c578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506155aa565b8285600001600183038154811061558f57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60006155c3836000018360001b6155f6565b905092915050565b600080823b905060008111915050919050565b60606155ed848460008561570f565b90509392505050565b60008083600101600084815260200190815260200160002054905060008114615703576000600182039050600060018660000180549050039050600086600001828154811061564157fe5b906000526020600020906002020190508087600001848154811061566157fe5b90600052602060002090600202016000820154816000015560018201548160010155905050600183018760010160008360000154815260200190815260200160002081905550866000018054806156b457fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615709565b60009150505b92915050565b606061571a856155cb565b61578c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106157dc57805182526020820191506020810190506020830392506157b9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461583e576040519150601f19603f3d011682016040523d82523d6000602084013e615843565b606091505b5091509150811561585857809250505061590d565b60008151111561586b5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158d25780820151818401526020810190506158b7565b50505050905090810190601f1680156158ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061595657805160ff1916838001178555615984565b82800160010185558215615984579182015b82811115615983578251825591602001919060010190615968565b5b50905061599191906159dd565b5090565b50805460018160011615610100020316600290046000825580601f106159bb57506159da565b601f0160209004906000526020600020908101906159d991906159dd565b5b50565b5b808211156159f65760008160009055506001016159de565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646974656d206e6f742063757272656e746c7920657175697070656420746f2074616d6167a2646970667358221220126e2180119e7fd6366bc5b6250a5bc433f28e7a2074d24fc0677f2676997ba464736f6c634300060c0033

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

0000000000000000000000008ef9a1a12e0b7e92f11d112f51ae1054ddc0e37d000000000000000000000000c2884de64ceff15211bb884a1e84f5aead9fdc7c

-----Decoded View---------------
Arg [0] : _signerAddress (address): 0x8EF9A1A12e0B7E92f11d112f51Ae1054Ddc0E37D
Arg [1] : owner (address): 0xC2884De64ceFF15211Bb884a1E84F5aeaD9fdc7c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ef9a1a12e0b7e92f11d112f51ae1054ddc0e37d
Arg [1] : 000000000000000000000000c2884de64ceff15211bb884a1e84f5aead9fdc7c


Deployed Bytecode Sourcemap

66209:5809:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12432:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;67229:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68877:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68607:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46605:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49292:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48836:390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70614:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68828:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48330:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;70029:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50166:305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68323:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66108:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48100:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67556:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67485:65;;;:::i;:::-;;67325:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50542:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69192:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66400:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66335:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66949:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48610:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;70282:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66365:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60984:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;68474:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46369:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66157:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47927:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46092:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2638:148;;;:::i;:::-;;67930:387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69378:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67418:61;;;:::i;:::-;;69547:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1996:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46766:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49577:295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71419:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67756:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50764:285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65447:203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;46933:755;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67056:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70185:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67143:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49943:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65264:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;2941:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70404:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12432:142;12509:4;12533:20;:33;12554:11;12533:33;;;;;;;;;;;;;;;;;;;;;;;;;;;12526:40;;12432:142;;;:::o;67229:90::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67310:1:::1;67294:13;;:17;;;;;;;;;;;;;;;;;;67229:90:::0;:::o;68877:29::-;;;;:::o;68607:178::-;66489:7;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68720:26:::1;68733:2;68737:8;68720:12;:26::i;:::-;68770:7;68757:6;:10;68764:2;68757:10;;;;;;;;;;;:20;;;;68607:178:::0;;;:::o;46605:92::-;46651:13;46684:5;46677:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46605:92;:::o;49292:213::-;49360:7;49388:16;49396:7;49388;:16::i;:::-;49380:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49473:15;:24;49489:7;49473:24;;;;;;;;;;;;;;;;;;;;;49466:31;;49292:213;;;:::o;48836:390::-;48917:13;48933:16;48941:7;48933;:16::i;:::-;48917:32;;48974:5;48968:11;;:2;:11;;;;48960:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49054:5;49038:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49063:37;49080:5;49087:12;:10;:12::i;:::-;49063:16;:37::i;:::-;49038:62;49030:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49197:21;49206:2;49210:7;49197:8;:21::i;:::-;48836:390;;;:::o;70614:628::-;66489:7;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70737:4:::1;69912:1;69905:4;:8;:28;;;;;69924:9;;69917:4;:16;69905:28;69897:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;70753:17:::2;;;;;;;;;;;:34;;;70788:5;70803:4;70810:7;70819:1;70753:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;70890:1;70849:19;:28;70869:7;70849:28;;;;;;;;;;;:37;70878:7;70849:37;;;;;;;;;;;;:42;70841:78;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;70972:1;70938:15;:24;70954:7;70938:24;;;;;;;;;;;:30;70963:4;70938:30;;;;;;;;;;;;:35;70930:75;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;71073:7;71040:15;:24;71056:7;71040:24;;;;;;;;;;;:30;71065:4;71040:30;;;;;;;;;;;:40;;;;71131:4;71091:19;:28;71111:7;71091:28;;;;;;;;;;;:37;71120:7;71091:37;;;;;;;;;;;:44;;;;71146:40;71178:7;71146:18;:27;71165:7;71146:27;;;;;;;;;;;:31;;:40;;;;:::i;:::-;;71202:32;71211:7;71220;71229:4;71202:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66561:1:::1;70614:628:::0;;;;:::o;68828:42::-;;;;;;;;;;;;;:::o;48330:203::-;48383:7;48504:21;:12;:19;:21::i;:::-;48497:28;;48330:203;:::o;70029:148::-;70104:4;70167:1;70127:19;:28;70147:7;70127:28;;;;;;;;;;;:37;70156:7;70127:37;;;;;;;;;;;;:41;70120:48;;70029:148;;;;:::o;50166:305::-;50327:41;50346:12;:10;:12::i;:::-;50360:7;50327:18;:41::i;:::-;50319:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50435:28;50445:4;50451:2;50455:7;50435:9;:28::i;:::-;50166:305;;;:::o;68323:145::-;66489:7;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68413:13:::1;68419:2;68423;68413:5;:13::i;:::-;68454:6;68437:10;:14;68448:2;68437:14;;;;;;;;;;;:23;;;;68323:145:::0;;;:::o;66108:42::-;;;;;;;;;;;;;;;;;:::o;48100:154::-;48189:7;48216:30;48240:5;48216:13;:20;48230:5;48216:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;48209:37;;48100:154;;;;:::o;67556:189::-;67632:7;66489;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67652:9:::1;67664:10;:19;67675:7;67664:19;;;;;;;;;;;;67652:31;;67717:1;67694:10;:19;67705:7;67694:19;;;;;;;;;;;;:24;;;;;;;;;;;67736:1;67729:8;;;67556:189:::0;;;:::o;67485:65::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67532:10:::1;:8;:10::i;:::-;67485:65::o:0;67325:85::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67401:1:::1;67391:7;;:11;;;;;;;;;;;;;;;;;;67325:85:::0;:::o;50542:151::-;50646:39;50663:4;50669:2;50673:7;50646:39;;;;;;;;;;;;:16;:39::i;:::-;50542:151;;;:::o;69192:180::-;69306:1;69266:36;:18;:27;69285:7;69266:27;;;;;;;;;;;:34;:36::i;:::-;:41;69258:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69345:19;69356:7;69345:10;:19::i;:::-;69192:180;:::o;66400:22::-;;;;;;;;;;;;;:::o;66335:23::-;;;;;;;;;;;;;:::o;66949:101::-;67003:4;67026:16;67034:7;67026;:16::i;:::-;67019:23;;66949:101;;;:::o;48610:164::-;48677:7;48698:15;48719:22;48735:5;48719:12;:15;;:22;;;;:::i;:::-;48697:44;;;48759:7;48752:14;;;48610:164;;;:::o;70282:116::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70388:1:::1;70350:17;;:40;;;;;;;;;;;;;;;;;;70282:116:::0;:::o;66365:28::-;;;;;;;;;;;;;:::o;60984:78::-;61023:4;61047:7;;;;;;;;;;;61040:14;;60984:78;:::o;68474:127::-;66489:7;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68567:26:::1;68580:2;68584:8;68567:12;:26::i;:::-;68474:127:::0;;:::o;46369:169::-;46433:7;46460:70;46477:7;46460:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;46453:77;;46369:169;;;:::o;66157:46::-;;;;;;;;;;;;;;;;;:::o;47927:89::-;47967:13;48000:8;47993:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47927:89;:::o;46092:215::-;46156:7;46201:1;46184:19;;:5;:19;;;;46176:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46270:29;:13;:20;46284:5;46270:20;;;;;;;;;;;;;;;:27;:29::i;:::-;46263:36;;46092:215;;;:::o;2638:148::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2745:1:::1;2708:40;;2729:6;::::0;::::1;;;;;;;;2708:40;;;;;;;;;;;;2776:1;2759:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2638:148::o:0;67930:387::-;68070:7;66636;:5;:7::i;:::-;66620:23;;:12;:10;:12::i;:::-;:23;;;66619:53;;;;66669:1;66649:22;;:8;;;;;;;;;;;:22;;;66619:53;:82;;;;66692:8;;;;;;;;;;;66676:24;;:12;:10;:12::i;:::-;:24;;;66619:82;66611:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61302:7:::1;;;;;;;;;;;61301:8;61293:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;68107:16:::2;68121:1;68107:9;;:13;;:16;;;;:::i;:::-;68095:9;:28;;;;68136:17;68156:9;;68136:29;;68196:5;68176:6;:17;68183:9;68176:17;;;;;;;;;;;:25;;;;68212:24;68218:6;68226:9;68212:5;:24::i;:::-;68247:33;68260:9;68271:8;68247:12;:33::i;:::-;68300:9;68293:16;;;67930:387:::0;;;;;:::o;69378:161::-;69475:7;69460:4;69912:1;69905:4;:8;:28;;;;;69924:9;;69917:4;:16;69905:28;69897:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69501:15:::1;:24;69517:7;69501:24;;;;;;;;;;;:30;69526:4;69501:30;;;;;;;;;;;;69494:37;;69378:161:::0;;;;;:::o;67418:61::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67463:8:::1;:6;:8::i;:::-;67418:61::o:0;69547:151::-;69627:7;69653:19;:28;69673:7;69653:28;;;;;;;;;;;:37;69682:7;69653:37;;;;;;;;;;;;69646:44;;69547:151;;;;:::o;1996:79::-;2034:7;2061:6;;;;;;;;;;;2054:13;;1996:79;:::o;46766:96::-;46814:13;46847:7;46840:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46766:96;:::o;49577:295::-;49692:12;:10;:12::i;:::-;49680:24;;:8;:24;;;;49672:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49792:8;49747:18;:32;49766:12;:10;:12::i;:::-;49747:32;;;;;;;;;;;;;;;:42;49780:8;49747:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49845:8;49816:48;;49831:12;:10;:12::i;:::-;49816:48;;;49855:8;49816:48;;;;;;;;;;;;;;;;;;;;49577:295;;:::o;71419:591::-;66489:7;;;;;;;;;;;66473:23;;:12;:10;:12::i;:::-;:23;;;:50;;;;66516:7;:5;:7::i;:::-;66500:23;;:12;:10;:12::i;:::-;:23;;;66473:50;66465:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71544:4:::1;69912:1;69905:4;:8;:28;;;;;69924:9;;69917:4;:16;69905:28;69897:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;71608:1:::2;71568:19;:28;71588:7;71568:28;;;;;;;;;;;:37;71597:7;71568:37;;;;;;;;;;;;:41;:86;;;;;71647:7;71613:15;:24;71629:7;71613:24;;;;;;;;;;;:30;71638:4;71613:30;;;;;;;;;;;;:41;71568:86;71560:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71749:1;71716:15;:24;71732:7;71716:24;;;;;;;;;;;:30;71741:4;71716:30;;;;;;;;;;;:34;;;;71801:1;71761:19;:28;71781:7;71761:28;;;;;;;;;;;:37;71790:7;71761:37;;;;;;;;;;;:41;;;;71813:43;71848:7;71813:18;:27;71832:7;71813:27;;;;;;;;;;;:34;;:43;;;;:::i;:::-;;71872:34;71883:7;71892;71901:4;71872:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71927:17;;;;;;;;;;;:34;;;71970:4;71977:5;71984:7;71993:1;71927:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;66561:1:::1;71419:591:::0;;;;:::o;67756:105::-;67812:7;67838:6;:15;67845:7;67838:15;;;;;;;;;;;;67831:22;;67756:105;;;:::o;50764:285::-;50896:41;50915:12;:10;:12::i;:::-;50929:7;50896:18;:41::i;:::-;50888:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51002:39;51016:4;51022:2;51026:7;51035:5;51002:13;:39::i;:::-;50764:285;;;;:::o;65447:203::-;65580:6;65606:36;;;65599:43;;65447:203;;;;;;;:::o;46933:755::-;46998:13;47032:16;47040:7;47032;:16::i;:::-;47024:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47113:23;47139:10;:19;47150:7;47139:19;;;;;;;;;;;47113:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47260:1;47240:8;47234:22;;;;;;;;;;;;;;;;:27;47230:76;;;47285:9;47278:16;;;;;47230:76;47436:1;47416:9;47410:23;:27;47406:112;;;47485:8;47495:9;47468:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47454:52;;;;;47406:112;47650:8;47660:18;:7;:16;:18::i;:::-;47633:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47619:61;;;46933:755;;;;:::o;67056:80::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67127:1:::1;67115:9;:13;;;;67056:80:::0;:::o;70185:91::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70263:5:::1;70251:9;:17;;;;70185:91:::0;:::o;67143:80::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67214:1:::1;67203:8;;:12;;;;;;;;;;;;;;;;;;67143:80:::0;:::o;49943:156::-;50032:4;50056:18;:25;50075:5;50056:25;;;;;;;;;;;;;;;:35;50082:8;50056:35;;;;;;;;;;;;;;;;;;;;;;;;;50049:42;;49943:156;;;;:::o;65264:175::-;65374:6;65400:31;;;65393:38;;65264:175;;;;;;;:::o;2941:244::-;2218:12;:10;:12::i;:::-;2208:22;;:6;;;;;;;;;;:22;;;2200:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3050:1:::1;3030:22;;:8;:22;;;;3022:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3140:8;3111:38;;3132:6;::::0;::::1;;;;;;;;3111:38;;;;;;;;;;;;3169:8;3160:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;2941:244:::0;:::o;70404:131::-;70465:7;70491:36;:18;:27;70510:7;70491:27;;;;;;;;;;;:34;:36::i;:::-;70484:43;;70404:131;;;:::o;657:106::-;710:15;745:10;738:17;;657:106;:::o;56621:215::-;56721:16;56729:7;56721;:16::i;:::-;56713:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56819:9;56797:10;:19;56808:7;56797:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;56621:215;;:::o;52516:119::-;52573:4;52597:30;52619:7;52597:12;:21;;:30;;;;:::i;:::-;52590:37;;52516:119;;;:::o;58343:158::-;58436:2;58409:15;:24;58425:7;58409:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58485:7;58481:2;58454:39;;58463:16;58471:7;58463;:16::i;:::-;58454:39;;;;;;;;;;;;58343:158;;:::o;31357:131::-;31424:4;31448:32;31453:3;:10;;31473:5;31465:14;;31448:4;:32::i;:::-;31441:39;;31357:131;;;;:::o;39987:123::-;40056:7;40083:19;40091:3;:10;;40083:7;:19::i;:::-;40076:26;;39987:123;;;:::o;52802:333::-;52887:4;52912:16;52920:7;52912;:16::i;:::-;52904:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52988:13;53004:16;53012:7;53004;:16::i;:::-;52988:32;;53050:5;53039:16;;:7;:16;;;:51;;;;53083:7;53059:31;;:20;53071:7;53059:11;:20::i;:::-;:31;;;53039:51;:87;;;;53094:32;53111:5;53118:7;53094:16;:32::i;:::-;53039:87;53031:96;;;52802:333;;;;:::o;55891:574::-;56009:4;55989:24;;:16;55997:7;55989;:16::i;:::-;:24;;;55981:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56092:1;56078:16;;:2;:16;;;;56070:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56148:39;56169:4;56175:2;56179:7;56148:20;:39::i;:::-;56252:29;56269:1;56273:7;56252:8;:29::i;:::-;56294:35;56321:7;56294:13;:19;56308:4;56294:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;56340:30;56362:7;56340:13;:17;56354:2;56340:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56383:29;56400:7;56409:2;56383:12;:16;;:29;;;;;:::i;:::-;;56449:7;56445:2;56430:27;;56439:4;56430:27;;;;;;;;;;;;55891:574;;;:::o;54401:404::-;54495:1;54481:16;;:2;:16;;;;54473:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54554:16;54562:7;54554;:16::i;:::-;54553:17;54545:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54616:45;54645:1;54649:2;54653:7;54616:20;:45::i;:::-;54674:30;54696:7;54674:13;:17;54688:2;54674:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;54717:29;54734:7;54743:2;54717:12;:16;;:29;;;;;:::i;:::-;;54789:7;54785:2;54764:33;;54781:1;54764:33;;;;;;;;;;;;54401:404;;:::o;32577:137::-;32648:7;32683:22;32687:3;:10;;32699:5;32683:3;:22::i;:::-;32675:31;;32668:38;;32577:137;;;;:::o;62033:120::-;61578:7;;;;;;;;;;;61570:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62102:5:::1;62092:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;62123:22;62132:12;:10;:12::i;:::-;62123:22;;;;;;;;;;;;;;;;;;;;62033:120::o:0;32119:114::-;32179:7;32206:19;32214:3;:10;;32206:7;:19::i;:::-;32199:26;;32119:114;;;:::o;59660:245::-;59778:41;59797:12;:10;:12::i;:::-;59811:7;59778:18;:41::i;:::-;59770:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59883:14;59889:7;59883:5;:14::i;:::-;59660:245;:::o;40449:227::-;40529:7;40538;40559:11;40572:13;40589:22;40593:3;:10;;40605:5;40589:3;:22::i;:::-;40558:53;;;;40638:3;40630:12;;40660:5;40652:14;;40622:46;;;;;;40449:227;;;;;:::o;41111:204::-;41218:7;41261:44;41266:3;:10;;41286:3;41278:12;;41292;41261:4;:44::i;:::-;41253:53;;41238:69;;41111:204;;;;;:::o;14127:181::-;14185:7;14205:9;14221:1;14217;:5;14205:17;;14246:1;14241;:6;;14233:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14299:1;14292:8;;;14127:181;;;;:::o;61774:118::-;61302:7;;;;;;;;;;;61301:8;61293:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61844:4:::1;61834:7;;:14;;;;;;;;;;;;;;;;;;61864:20;61871:12;:10;:12::i;:::-;61864:20;;;;;;;;;;;;;;;;;;;;61774:118::o:0;31664:137::-;31734:4;31758:35;31766:3;:10;;31786:5;31778:14;;31758:7;:35::i;:::-;31751:42;;31664:137;;;;:::o;51931:272::-;52045:28;52055:4;52061:2;52065:7;52045:9;:28::i;:::-;52092:48;52115:4;52121:2;52125:7;52134:5;52092:22;:48::i;:::-;52084:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51931:272;;;;:::o;41571:744::-;41627:13;41857:1;41848:5;:10;41844:53;;;41875:10;;;;;;;;;;;;;;;;;;;;;41844:53;41907:12;41922:5;41907:20;;41938:14;41963:78;41978:1;41970:4;:9;41963:78;;41996:8;;;;;;;42027:2;42019:10;;;;;;;;;41963:78;;;42051:19;42083:6;42073:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42051:39;;42101:13;42126:1;42117:6;:10;42101:26;;42145:5;42138:12;;42161:115;42176:1;42168:4;:9;42161:115;;42235:2;42228:4;:9;;;;;;42223:2;:14;42212:27;;42194:6;42201:7;;;;;;;42194:15;;;;;;;;;;;:45;;;;;;;;;;;42262:2;42254:10;;;;;;;;;42161:115;;;42300:6;42286:21;;;;;;41571:744;;;;:::o;39748:151::-;39832:4;39856:35;39866:3;:10;;39886:3;39878:12;;39856:9;:35::i;:::-;39849:42;;39748:151;;;;:::o;26353:414::-;26416:4;26438:21;26448:3;26453:5;26438:9;:21::i;:::-;26433:327;;26476:3;:11;;26493:5;26476:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26659:3;:11;;:18;;;;26637:3;:12;;:19;26650:5;26637:19;;;;;;;;;;;:40;;;;26699:4;26692:11;;;;26433:327;26743:5;26736:12;;26353:414;;;;;:::o;37370:110::-;37426:7;37453:3;:12;;:19;;;;37446:26;;37370:110;;;:::o;59114:93::-;;;;:::o;39180:176::-;39269:4;39293:55;39298:3;:10;;39318:3;39310:12;;39340:5;39332:14;;39324:23;;39293:4;:55::i;:::-;39286:62;;39180:176;;;;;:::o;29241:204::-;29308:7;29357:5;29336:3;:11;;:18;;;;:26;29328:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29419:3;:11;;29431:5;29419:18;;;;;;;;;;;;;;;;29412:25;;29241:204;;;;:::o;28788:109::-;28844:7;28871:3;:11;;:18;;;;28864:25;;28788:109;;;:::o;55034:520::-;55094:13;55110:16;55118:7;55110;:16::i;:::-;55094:32;;55139:48;55160:5;55175:1;55179:7;55139:20;:48::i;:::-;55228:29;55245:1;55249:7;55228:8;:29::i;:::-;55347:1;55316:10;:19;55327:7;55316:19;;;;;;;;;;;55310:33;;;;;;;;;;;;;;;;:38;55306:97;;55372:10;:19;55383:7;55372:19;;;;;;;;;;;;55365:26;;;;:::i;:::-;55306:97;55415:36;55443:7;55415:13;:20;55429:5;55415:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;55464:28;55484:7;55464:12;:19;;:28;;;;:::i;:::-;;55538:7;55534:1;55510:36;;55519:5;55510:36;;;;;;;;;;;;55034:520;;:::o;37835:279::-;37902:7;37911;37961:5;37939:3;:12;;:19;;;;:27;37931:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38018:22;38043:3;:12;;38056:5;38043:19;;;;;;;;;;;;;;;;;;38018:44;;38081:5;:10;;;38093:5;:12;;;38073:33;;;;;37835:279;;;;;:::o;38537:319::-;38631:7;38651:16;38670:3;:12;;:17;38683:3;38670:17;;;;;;;;;;;;38651:36;;38718:1;38706:8;:13;;38721:12;38698:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38788:3;:12;;38812:1;38801:8;:12;38788:26;;;;;;;;;;;;;;;;;;:33;;;38781:40;;;38537:319;;;;;:::o;26943:1544::-;27009:4;27127:18;27148:3;:12;;:19;27161:5;27148:19;;;;;;;;;;;;27127:40;;27198:1;27184:10;:15;27180:1300;;27546:21;27583:1;27570:10;:14;27546:38;;27599:17;27640:1;27619:3;:11;;:18;;;;:22;27599:42;;27886:17;27906:3;:11;;27918:9;27906:22;;;;;;;;;;;;;;;;27886:42;;28052:9;28023:3;:11;;28035:13;28023:26;;;;;;;;;;;;;;;:38;;;;28171:1;28155:13;:17;28129:3;:12;;:23;28142:9;28129:23;;;;;;;;;;;:43;;;;28281:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;28376:3;:12;;:19;28389:5;28376:19;;;;;;;;;;;28369:26;;;28419:4;28412:11;;;;;;;;27180:1300;28463:5;28456:12;;;26943:1544;;;;;:::o;57731:604::-;57852:4;57879:15;:2;:13;;;:15::i;:::-;57874:60;;57918:4;57911:11;;;;57874:60;57944:23;57970:252;58023:45;;;58083:12;:10;:12::i;:::-;58110:4;58129:7;58151:5;57986:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57970:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;57944:278;;58233:13;58260:10;58249:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58233:48;;43093:10;58310:16;;58300:26;;;:6;:26;;;;58292:35;;;;57731:604;;;;;;;:::o;37150:125::-;37221:4;37266:1;37245:3;:12;;:17;37258:3;37245:17;;;;;;;;;;;;:22;;37238:29;;37150:125;;;;:::o;28573:129::-;28646:4;28693:1;28670:3;:12;;:19;28683:5;28670:19;;;;;;;;;;;;:24;;28663:31;;28573:129;;;;:::o;34650:692::-;34726:4;34842:16;34861:3;:12;;:17;34874:3;34861:17;;;;;;;;;;;;34842:36;;34907:1;34895:8;:13;34891:444;;;34962:3;:12;;34980:38;;;;;;;;34997:3;34980:38;;;;35010:5;34980:38;;;34962:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35177:3;:12;;:19;;;;35157:3;:12;;:17;35170:3;35157:17;;;;;;;;;;;:39;;;;35218:4;35211:11;;;;;34891:444;35291:5;35255:3;:12;;35279:1;35268:8;:12;35255:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;35318:5;35311:12;;;34650:692;;;;;;:::o;39522:142::-;39599:4;39623:33;39631:3;:10;;39651:3;39643:12;;39623:7;:33::i;:::-;39616:40;;39522:142;;;;:::o;19366:422::-;19426:4;19634:12;19745:7;19733:20;19725:28;;19779:1;19772:4;:8;19765:15;;;19366:422;;;:::o;22284:196::-;22387:12;22419:53;22442:6;22450:4;22456:1;22459:12;22419:22;:53::i;:::-;22412:60;;22284:196;;;;;:::o;35517:1549::-;35581:4;35697:16;35716:3;:12;;:17;35729:3;35716:17;;;;;;;;;;;;35697:36;;35762:1;35750:8;:13;35746:1313;;36111:21;36146:1;36135:8;:12;36111:36;;36162:17;36204:1;36182:3;:12;;:19;;;;:23;36162:43;;36450:26;36479:3;:12;;36492:9;36479:23;;;;;;;;;;;;;;;;;;36450:52;;36627:9;36597:3;:12;;36610:13;36597:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;36751:1;36735:13;:17;36704:3;:12;;:28;36717:9;:14;;;36704:28;;;;;;;;;;;:48;;;;36861:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36957:3;:12;;:17;36970:3;36957:17;;;;;;;;;;;36950:24;;;36998:4;36991:11;;;;;;;;35746:1313;37042:5;37035:12;;;35517:1549;;;;;:::o;23661:979::-;23791:12;23824:18;23835:6;23824:10;:18::i;:::-;23816:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23950:12;23964:23;23991:6;:11;;24011:8;24022:4;23991:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23949:78;;;;24042:7;24038:595;;;24073:10;24066:17;;;;;;24038:595;24207:1;24187:10;:17;:21;24183:439;;;24450:10;24444:17;24511:15;24498:10;24494:2;24490:19;24483:44;24398:148;24593:12;24586:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23661:979;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://126e2180119e7fd6366bc5b6250a5bc433f28e7a2074d24fc0677f2676997ba4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.