ETH Price: $2,605.78 (-3.30%)

Token

Lady Dolls (LISODT)
 

Overview

Max Total Supply

25 LISODT

Holders

20

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LISODT
0x6f22649b860105d80c78a52b8437b53c4d074826
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:
SniftieERC721IPFS

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 19 of 20: SniftieERC721IPFS.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./ERC721Pausable.sol";
import "./AccessControlEnumerable.sol";
import "./Context.sol";
import "./Counters.sol";

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract SniftieERC721IPFS is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable {
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    Counters.Counter private _tokenIdTracker;
    mapping(string => uint8) hashes;

    string private _baseTokenURI;
    string private _contractMetadataURI;
    mapping (uint256 => string) private _tokenURIs;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(string memory name, string memory symbol, string memory baseTokenURI, address sniftieMinterContract, string memory contractMetadataURI) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;
        _contractMetadataURI = contractMetadataURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, sniftieMinterContract);
    }

    function contractURI() public view returns (string memory) {
        return _contractMetadataURI;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Must have DEFAULT_ADMIN_ROLE to set base uri");
        _baseTokenURI = baseURI;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).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(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return base;
    }

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, string memory hash, string memory metadata) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
        require(hashes[hash] != 1, "Hash value has already been used");
        hashes[hash] = 1;

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _tokenIdTracker.increment();
        uint256 newItemId = _tokenIdTracker.current();
        _mint(to, newItemId);
        _setTokenURI(newItemId, metadata);

        // return newItemId
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 1 of 20: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                "AccessControl: account ",
                Strings.toHexString(uint160(account), 20),
                " is missing role ",
                Strings.toHexString(uint256(role), 32)
            )));
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 20: AccessControlEnumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./AccessControl.sol";
import "./EnumerableSet.sol";

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping (bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

File 3 of 20: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        uint256 size;
        // 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 4 of 20: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 20: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

File 6 of 20: EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.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.3.0, sets of type `bytes32` (`Bytes32Set`), `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;

            if (lastIndex != toDeleteIndex) {
                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] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // 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) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

File 7 of 20: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 8 of 20: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 9 of 20: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @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 10 of 20: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 20: ERC721Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Pausable.sol";

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

File 12 of 20: ERC721PresetMinterPauserAutoId.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./ERC721Pausable.sol";
import "./AccessControlEnumerable.sol";
import "./Context.sol";
import "./Counters.sol";

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC721PresetMinterPauserAutoId is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable {
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    Counters.Counter private _tokenIdTracker;
    mapping(string => uint8) hashes;

    string private _baseTokenURI;
    mapping (uint256 => string) private _tokenURIs;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(string memory name, string memory symbol, string memory baseTokenURI) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).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(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return base;
    }

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, string memory hash, string memory metadata) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
        require(hashes[hash] != 1, "Hash value has already been used");
        hashes[hash] = 1;

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _tokenIdTracker.increment();
        uint256 newItemId = _tokenIdTracker.current();
        _mint(to, newItemId);
        _setTokenURI(newItemId, metadata);

        // return newItemId
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 13 of 20: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 14 of 20: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 15 of 20: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 16 of 20: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 17 of 20: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 18 of 20: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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.
 */
abstract 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 () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual 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 20 of 20: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"sniftieMinterContract","type":"address"},{"internalType":"string","name":"contractMetadataURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"string","name":"metadata","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620054273803806200542783398181016040528101906200003791906200056c565b848481600290805190602001906200005192919062000433565b5080600390805190602001906200006a92919062000433565b5050506000600c60006101000a81548160ff02191690831515021790555082600f9080519060200190620000a092919062000433565b508060109080519060200190620000b992919062000433565b50620000de6000801b620000d26200019d60201b60201c565b620001a560201b60201c565b6200011f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001136200019d60201b60201c565b620001a560201b60201c565b620001607f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001546200019d60201b60201c565b620001a560201b60201c565b620001927f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a683620001a560201b60201c565b5050505050620007d1565b600033905090565b620001bc8282620001ed60201b620015b81760201c565b620001e881600160008581526020019081526020016000206200020360201b620015c61790919060201c565b505050565b620001ff82826200023b60201b60201c565b5050565b600062000233836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200032c60201b60201c565b905092915050565b6200024d8282620003a660201b60201c565b6200032857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002cd6200019d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200034083836200041060201b60201c565b6200039b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003a0565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620004419062000723565b90600052602060002090601f016020900481019282620004655760008555620004b1565b82601f106200048057805160ff1916838001178555620004b1565b82800160010185558215620004b1579182015b82811115620004b057825182559160200191906001019062000493565b5b509050620004c09190620004c4565b5090565b5b80821115620004df576000816000905550600101620004c5565b5090565b6000620004fa620004f48462000686565b62000652565b9050828152602081018484840111156200051357600080fd5b62000520848285620006ed565b509392505050565b6000815190506200053981620007b7565b92915050565b600082601f8301126200055157600080fd5b815162000563848260208601620004e3565b91505092915050565b600080600080600060a086880312156200058557600080fd5b600086015167ffffffffffffffff811115620005a057600080fd5b620005ae888289016200053f565b955050602086015167ffffffffffffffff811115620005cc57600080fd5b620005da888289016200053f565b945050604086015167ffffffffffffffff811115620005f857600080fd5b62000606888289016200053f565b9350506060620006198882890162000528565b925050608086015167ffffffffffffffff8111156200063757600080fd5b62000645888289016200053f565b9150509295509295909350565b6000604051905081810181811067ffffffffffffffff821117156200067c576200067b62000788565b5b8060405250919050565b600067ffffffffffffffff821115620006a457620006a362000788565b5b601f19601f8301169050602081019050919050565b6000620006c682620006cd565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200070d578082015181840152602081019050620006f0565b838111156200071d576000848401525b50505050565b600060028204905060018216806200073c57607f821691505b6020821081141562000753576200075262000759565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620007c281620006b9565b8114620007ce57600080fd5b50565b614c4680620007e16000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a578063a22cb465116100ad578063d53913931161007c578063d5391393146105d2578063d547741f146105f0578063e63ab1e91461060c578063e8a3d4851461062a578063e985e9c514610648576101fb565b8063a22cb4651461053a578063b88d4fde14610556578063c87b56dd14610572578063ca15c873146105a2576101fb565b806391d14854116100e957806391d14854146104b257806395d89b41146104e25780639907119014610500578063a217fddf1461051c576101fb565b80636352211e1461041857806370a08231146104485780638456cb59146104785780639010d07c14610482576101fb565b80632f745c591161019257806342966c681161016157806342966c68146103925780634f6ccce7146103ae57806355f804b3146103de5780635c975abb146103fa576101fb565b80632f745c591461032057806336568abe146103505780633f4ba83a1461036c57806342842e0e14610376576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b8578063248a9ca3146102d45780632f2ff15d14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613723565b610678565b6040516102279190614438565b60405180910390f35b61023861068a565b604051610245919061446e565b60405180910390f35b610268600480360381019061026391906137b6565b61071c565b60405161027591906143d1565b60405180910390f35b61029860048036038101906102939190613646565b6107a1565b005b6102a26108b9565b6040516102af9190614810565b60405180910390f35b6102d260048036038101906102cd91906134c1565b6108c6565b005b6102ee60048036038101906102e99190613682565b610926565b6040516102fb9190614453565b60405180910390f35b61031e600480360381019061031991906136ab565b610945565b005b61033a60048036038101906103359190613646565b610979565b6040516103479190614810565b60405180910390f35b61036a600480360381019061036591906136ab565b610a1e565b005b610374610a52565b005b610390600480360381019061038b91906134c1565b610acc565b005b6103ac60048036038101906103a791906137b6565b610aec565b005b6103c860048036038101906103c391906137b6565b610b48565b6040516103d59190614810565b60405180910390f35b6103f860048036038101906103f39190613775565b610bdf565b005b610402610c4c565b60405161040f9190614438565b60405180910390f35b610432600480360381019061042d91906137b6565b610c63565b60405161043f91906143d1565b60405180910390f35b610462600480360381019061045d919061345c565b610d15565b60405161046f9190614810565b60405180910390f35b610480610dcd565b005b61049c600480360381019061049791906136e7565b610e47565b6040516104a991906143d1565b60405180910390f35b6104cc60048036038101906104c791906136ab565b610e76565b6040516104d99190614438565b60405180910390f35b6104ea610ee0565b6040516104f7919061446e565b60405180910390f35b61051a600480360381019061051591906135c7565b610f72565b005b6105246110be565b6040516105319190614453565b60405180910390f35b610554600480360381019061054f919061358b565b6110c5565b005b610570600480360381019061056b9190613510565b611246565b005b61058c600480360381019061058791906137b6565b6112a8565b604051610599919061446e565b60405180910390f35b6105bc60048036038101906105b79190613682565b6113f2565b6040516105c99190614810565b60405180910390f35b6105da611416565b6040516105e79190614453565b60405180910390f35b61060a600480360381019061060591906136ab565b61143a565b005b61061461146e565b6040516106219190614453565b60405180910390f35b610632611492565b60405161063f919061446e565b60405180910390f35b610662600480360381019061065d9190613485565b611524565b60405161066f9190614438565b60405180910390f35b6000610683826115f6565b9050919050565b60606002805461069990614acd565b80601f01602080910402602001604051908101604052809291908181526020018280546106c590614acd565b80156107125780601f106106e757610100808354040283529160200191610712565b820191906000526020600020905b8154815290600101906020018083116106f557829003601f168201915b5050505050905090565b600061072782611670565b610766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075d906146b0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ac82610c63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081490614730565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083c6116dc565b73ffffffffffffffffffffffffffffffffffffffff16148061086b575061086a816108656116dc565b611524565b5b6108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a1906145f0565b60405180910390fd5b6108b483836116e4565b505050565b6000600a80549050905090565b6108d76108d16116dc565b8261179d565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90614750565b60405180910390fd5b61092183838361187b565b505050565b6000806000838152602001908152602001600020600101549050919050565b61094f8282611ad7565b61097481600160008581526020019081526020016000206115c690919063ffffffff16565b505050565b600061098483610d15565b82106109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc906144f0565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a288282611b00565b610a4d8160016000858152602001908152602001600020611b8390919063ffffffff16565b505050565b610a837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a7e6116dc565b610e76565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab9906147d0565b60405180910390fd5b610aca611bb3565b565b610ae783838360405180602001604052806000815250611246565b505050565b610afd610af76116dc565b8261179d565b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b33906147b0565b60405180910390fd5b610b4581611c55565b50565b6000610b526108b9565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614770565b60405180910390fd5b600a8281548110610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610bf36000801b610bee6116dc565b610e76565b610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614690565b60405180910390fd5b80600f9080519060200190610c4892919061326b565b5050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390614630565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90614610565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dfe7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610df96116dc565b610e76565b610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490614550565b60405180910390fd5b610e45611d66565b565b6000610e6e8260016000868152602001908152602001600020611e0990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610eef90614acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1b90614acd565b8015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b5050505050905090565b610fa37f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f9e6116dc565b610e76565b610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990614790565b60405180910390fd5b6001600e83604051610ff4919061435c565b908152602001604051809103902060009054906101000a900460ff1660ff161415611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90614650565b60405180910390fd5b6001600e83604051611066919061435c565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550611096600d611e23565b60006110a2600d611e39565b90506110ae8482611e47565b6110b88183612015565b50505050565b6000801b81565b6110cd6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290614590565b60405180910390fd5b80600760006111486116dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111f56116dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161123a9190614438565b60405180910390a35050565b6112576112516116dc565b8361179d565b611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614750565b60405180910390fd5b6112a284848484612089565b50505050565b60606112b382611670565b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990614710565b60405180910390fd5b600060116000848152602001908152602001600020805461131290614acd565b80601f016020809104026020016040519081016040528092919081815260200182805461133e90614acd565b801561138b5780601f106113605761010080835404028352916020019161138b565b820191906000526020600020905b81548152906001019060200180831161136e57829003601f168201915b50505050509050600061139c6120e5565b90506000815114156113b25781925050506113ed565b6000825111156113e75780826040516020016113cf929190614373565b604051602081830303815290604052925050506113ed565b80925050505b919050565b600061140f60016000848152602001908152602001600020612177565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611444828261218c565b6114698160016000858152602001908152602001600020611b8390919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6060601080546114a190614acd565b80601f01602080910402602001604051908101604052809291908181526020018280546114cd90614acd565b801561151a5780601f106114ef5761010080835404028352916020019161151a565b820191906000526020600020905b8154815290600101906020018083116114fd57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c282826121b5565b5050565b60006115ee836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612295565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611669575061166882612305565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175783610c63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a882611670565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de906145b0565b60405180910390fd5b60006117f283610c63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061186157508373ffffffffffffffffffffffffffffffffffffffff166118498461071c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061187257506118718185611524565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661189b82610c63565b73ffffffffffffffffffffffffffffffffffffffff16146118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e8906146f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890614570565b60405180910390fd5b61196c8383836123e7565b6119776000826116e4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c791906149af565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1e91906148ff565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ae082610926565b611af181611aec6116dc565b6123f7565b611afb83836121b5565b505050565b611b086116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c906147f0565b60405180910390fd5b611b7f8282612494565b5050565b6000611bab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612575565b905092915050565b611bbb610c4c565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906144d0565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c3e6116dc565b604051611c4b91906143d1565b60405180910390a1565b6000611c6082610c63565b9050611c6e816000846123e7565b611c796000836116e4565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc991906149af565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611d6e610c4c565b15611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da5906145d0565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611df26116dc565b604051611dff91906143d1565b60405180910390a1565b6000611e1883600001836126fb565b60001c905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614670565b60405180910390fd5b611ec081611670565b15611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790614530565b60405180910390fd5b611f0c600083836123e7565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5c91906148ff565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61201e82611670565b61205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906146d0565b60405180910390fd5b8060116000848152602001908152602001600020908051906020019061208492919061326b565b505050565b61209484848461187b565b6120a08484848461274c565b6120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690614510565b60405180910390fd5b50505050565b6060600f80546120f490614acd565b80601f016020809104026020016040519081016040528092919081815260200182805461212090614acd565b801561216d5780601f106121425761010080835404028352916020019161216d565b820191906000526020600020905b81548152906001019060200180831161215057829003601f168201915b5050505050905090565b6000612185826000016128e3565b9050919050565b61219582610926565b6121a6816121a16116dc565b6123f7565b6121b08383612494565b505050565b6121bf8282610e76565b61229157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122366116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006122a183836128f4565b6122fa5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506122ff565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123e057506123df82612917565b5b9050919050565b6123f2838383612991565b505050565b6124018282610e76565b612490576124268173ffffffffffffffffffffffffffffffffffffffff1660146129e9565b6124348360001c60206129e9565b604051602001612445929190614397565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487919061446e565b60405180910390fd5b5050565b61249e8282610e76565b1561257157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125166116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146126ef5760006001826125a791906149af565b90506000600186600001805490506125bf91906149af565b905081811461267a576000866000018281548110612606577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612650577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806126b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126f5565b60009150505b92915050565b6000826000018281548110612739577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600061276d8473ffffffffffffffffffffffffffffffffffffffff16612ce3565b156128d6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127966116dc565b8786866040518563ffffffff1660e01b81526004016127b894939291906143ec565b602060405180830381600087803b1580156127d257600080fd5b505af192505050801561280357506040513d601f19601f82011682018060405250810190612800919061374c565b60015b612886573d8060008114612833576040519150601f19603f3d011682016040523d82523d6000602084013e612838565b606091505b5060008151141561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614510565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128db565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061298a575061298982612cf6565b5b9050919050565b61299c838383612d70565b6129a4610c4c565b156129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129db906144b0565b60405180910390fd5b505050565b6060600060028360026129fc9190614955565b612a0691906148ff565b67ffffffffffffffff811115612a45577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a775781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b9f9190614955565b612ba991906148ff565b90505b6001811115612c95577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612c11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612c8e90614aa3565b9050612bac565b5060008414612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd090614490565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d695750612d6882612e84565b5b9050919050565b612d7b838383612eee565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbe57612db981612ef3565b612dfd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dfc57612dfb8382612f3c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4057612e3b816130a9565b612e7f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e7e57612e7d82826131ec565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f4984610d15565b612f5391906149af565b9050600060096000848152602001908152602001600020549050818114613038576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506130bd91906149af565b90506000600b60008481526020019081526020016000205490506000600a8381548110613113577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a838154811061315b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806131d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131f783610d15565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461327790614acd565b90600052602060002090601f01602090048101928261329957600085556132e0565b82601f106132b257805160ff19168380011785556132e0565b828001600101855582156132e0579182015b828111156132df5782518255916020019190600101906132c4565b5b5090506132ed91906132f1565b5090565b5b8082111561330a5760008160009055506001016132f2565b5090565b600061332161331c8461485c565b61482b565b90508281526020810184848401111561333957600080fd5b613344848285614a61565b509392505050565b600061335f61335a8461488c565b61482b565b90508281526020810184848401111561337757600080fd5b613382848285614a61565b509392505050565b60008135905061339981614b9d565b92915050565b6000813590506133ae81614bb4565b92915050565b6000813590506133c381614bcb565b92915050565b6000813590506133d881614be2565b92915050565b6000815190506133ed81614be2565b92915050565b600082601f83011261340457600080fd5b813561341484826020860161330e565b91505092915050565b600082601f83011261342e57600080fd5b813561343e84826020860161334c565b91505092915050565b60008135905061345681614bf9565b92915050565b60006020828403121561346e57600080fd5b600061347c8482850161338a565b91505092915050565b6000806040838503121561349857600080fd5b60006134a68582860161338a565b92505060206134b78582860161338a565b9150509250929050565b6000806000606084860312156134d657600080fd5b60006134e48682870161338a565b93505060206134f58682870161338a565b925050604061350686828701613447565b9150509250925092565b6000806000806080858703121561352657600080fd5b60006135348782880161338a565b94505060206135458782880161338a565b935050604061355687828801613447565b925050606085013567ffffffffffffffff81111561357357600080fd5b61357f878288016133f3565b91505092959194509250565b6000806040838503121561359e57600080fd5b60006135ac8582860161338a565b92505060206135bd8582860161339f565b9150509250929050565b6000806000606084860312156135dc57600080fd5b60006135ea8682870161338a565b935050602084013567ffffffffffffffff81111561360757600080fd5b6136138682870161341d565b925050604084013567ffffffffffffffff81111561363057600080fd5b61363c8682870161341d565b9150509250925092565b6000806040838503121561365957600080fd5b60006136678582860161338a565b925050602061367885828601613447565b9150509250929050565b60006020828403121561369457600080fd5b60006136a2848285016133b4565b91505092915050565b600080604083850312156136be57600080fd5b60006136cc858286016133b4565b92505060206136dd8582860161338a565b9150509250929050565b600080604083850312156136fa57600080fd5b6000613708858286016133b4565b925050602061371985828601613447565b9150509250929050565b60006020828403121561373557600080fd5b6000613743848285016133c9565b91505092915050565b60006020828403121561375e57600080fd5b600061376c848285016133de565b91505092915050565b60006020828403121561378757600080fd5b600082013567ffffffffffffffff8111156137a157600080fd5b6137ad8482850161341d565b91505092915050565b6000602082840312156137c857600080fd5b60006137d684828501613447565b91505092915050565b6137e8816149e3565b82525050565b6137f7816149f5565b82525050565b61380681614a01565b82525050565b6000613817826148bc565b61382181856148d2565b9350613831818560208601614a70565b61383a81614b8c565b840191505092915050565b6000613850826148c7565b61385a81856148e3565b935061386a818560208601614a70565b61387381614b8c565b840191505092915050565b6000613889826148c7565b61389381856148f4565b93506138a3818560208601614a70565b80840191505092915050565b60006138bc6020836148e3565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b60006138fc602b836148e3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006139626014836148e3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006139a2602b836148e3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613a086032836148e3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613a6e601c836148e3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613aae603e836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d75737420686176652070617573657220726f6c6520746f20706175736500006020830152604082019050919050565b6000613b146024836148e3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7a6019836148e3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613bba602c836148e3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c206010836148e3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c606038836148e3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cc6602a836148e3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d2c6029836148e3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d926020836148e3565b91507f486173682076616c75652068617320616c7265616479206265656e20757365646000830152602082019050919050565b6000613dd26020836148e3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613e12602c836148e3565b91507f4d75737420686176652044454641554c545f41444d494e5f524f4c4520746f2060008301527f73657420626173652075726900000000000000000000000000000000000000006020830152604082019050919050565b6000613e78602c836148e3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ede602c836148e3565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f446029836148e3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613faa602f836148e3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140106021836148e3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140766031836148e3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140dc602c836148e3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006141426017836148f4565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000614182603d836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d7573742068617665206d696e74657220726f6c6520746f206d696e740000006020830152604082019050919050565b60006141e86030836148e3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061424e6040836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d75737420686176652070617573657220726f6c6520746f20756e70617573656020830152604082019050919050565b60006142b46011836148f4565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006142f4602f836148e3565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61435681614a57565b82525050565b6000614368828461387e565b915081905092915050565b600061437f828561387e565b915061438b828461387e565b91508190509392505050565b60006143a282614135565b91506143ae828561387e565b91506143b9826142a7565b91506143c5828461387e565b91508190509392505050565b60006020820190506143e660008301846137df565b92915050565b600060808201905061440160008301876137df565b61440e60208301866137df565b61441b604083018561434d565b818103606083015261442d818461380c565b905095945050505050565b600060208201905061444d60008301846137ee565b92915050565b600060208201905061446860008301846137fd565b92915050565b600060208201905081810360008301526144888184613845565b905092915050565b600060208201905081810360008301526144a9816138af565b9050919050565b600060208201905081810360008301526144c9816138ef565b9050919050565b600060208201905081810360008301526144e981613955565b9050919050565b6000602082019050818103600083015261450981613995565b9050919050565b60006020820190508181036000830152614529816139fb565b9050919050565b6000602082019050818103600083015261454981613a61565b9050919050565b6000602082019050818103600083015261456981613aa1565b9050919050565b6000602082019050818103600083015261458981613b07565b9050919050565b600060208201905081810360008301526145a981613b6d565b9050919050565b600060208201905081810360008301526145c981613bad565b9050919050565b600060208201905081810360008301526145e981613c13565b9050919050565b6000602082019050818103600083015261460981613c53565b9050919050565b6000602082019050818103600083015261462981613cb9565b9050919050565b6000602082019050818103600083015261464981613d1f565b9050919050565b6000602082019050818103600083015261466981613d85565b9050919050565b6000602082019050818103600083015261468981613dc5565b9050919050565b600060208201905081810360008301526146a981613e05565b9050919050565b600060208201905081810360008301526146c981613e6b565b9050919050565b600060208201905081810360008301526146e981613ed1565b9050919050565b6000602082019050818103600083015261470981613f37565b9050919050565b6000602082019050818103600083015261472981613f9d565b9050919050565b6000602082019050818103600083015261474981614003565b9050919050565b6000602082019050818103600083015261476981614069565b9050919050565b60006020820190508181036000830152614789816140cf565b9050919050565b600060208201905081810360008301526147a981614175565b9050919050565b600060208201905081810360008301526147c9816141db565b9050919050565b600060208201905081810360008301526147e981614241565b9050919050565b60006020820190508181036000830152614809816142e7565b9050919050565b6000602082019050614825600083018461434d565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561485257614851614b5d565b5b8060405250919050565b600067ffffffffffffffff82111561487757614876614b5d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156148a7576148a6614b5d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061490a82614a57565b915061491583614a57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494a57614949614aff565b5b828201905092915050565b600061496082614a57565b915061496b83614a57565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a4576149a3614aff565b5b828202905092915050565b60006149ba82614a57565b91506149c583614a57565b9250828210156149d8576149d7614aff565b5b828203905092915050565b60006149ee82614a37565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a8e578082015181840152602081019050614a73565b83811115614a9d576000848401525b50505050565b6000614aae82614a57565b91506000821415614ac257614ac1614aff565b5b600182039050919050565b60006002820490506001821680614ae557607f821691505b60208210811415614af957614af8614b2e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ba6816149e3565b8114614bb157600080fd5b50565b614bbd816149f5565b8114614bc857600080fd5b50565b614bd481614a01565b8114614bdf57600080fd5b50565b614beb81614a0b565b8114614bf657600080fd5b50565b614c0281614a57565b8114614c0d57600080fd5b5056fea264697066735822122097522b25adca279b8022173f9412dae10984aacdf9d0f421c68d6c9eae97bd6664736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000014ee7f8da059051e81873c2ee53668da1af72b590000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4c61647920446f6c6c730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c49534f44540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f697066732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f697066732f516d58464b3747366d77326479776e636b515178347050787457626973336d32724a554845457348657735726f6a0000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a578063a22cb465116100ad578063d53913931161007c578063d5391393146105d2578063d547741f146105f0578063e63ab1e91461060c578063e8a3d4851461062a578063e985e9c514610648576101fb565b8063a22cb4651461053a578063b88d4fde14610556578063c87b56dd14610572578063ca15c873146105a2576101fb565b806391d14854116100e957806391d14854146104b257806395d89b41146104e25780639907119014610500578063a217fddf1461051c576101fb565b80636352211e1461041857806370a08231146104485780638456cb59146104785780639010d07c14610482576101fb565b80632f745c591161019257806342966c681161016157806342966c68146103925780634f6ccce7146103ae57806355f804b3146103de5780635c975abb146103fa576101fb565b80632f745c591461032057806336568abe146103505780633f4ba83a1461036c57806342842e0e14610376576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b8578063248a9ca3146102d45780632f2ff15d14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613723565b610678565b6040516102279190614438565b60405180910390f35b61023861068a565b604051610245919061446e565b60405180910390f35b610268600480360381019061026391906137b6565b61071c565b60405161027591906143d1565b60405180910390f35b61029860048036038101906102939190613646565b6107a1565b005b6102a26108b9565b6040516102af9190614810565b60405180910390f35b6102d260048036038101906102cd91906134c1565b6108c6565b005b6102ee60048036038101906102e99190613682565b610926565b6040516102fb9190614453565b60405180910390f35b61031e600480360381019061031991906136ab565b610945565b005b61033a60048036038101906103359190613646565b610979565b6040516103479190614810565b60405180910390f35b61036a600480360381019061036591906136ab565b610a1e565b005b610374610a52565b005b610390600480360381019061038b91906134c1565b610acc565b005b6103ac60048036038101906103a791906137b6565b610aec565b005b6103c860048036038101906103c391906137b6565b610b48565b6040516103d59190614810565b60405180910390f35b6103f860048036038101906103f39190613775565b610bdf565b005b610402610c4c565b60405161040f9190614438565b60405180910390f35b610432600480360381019061042d91906137b6565b610c63565b60405161043f91906143d1565b60405180910390f35b610462600480360381019061045d919061345c565b610d15565b60405161046f9190614810565b60405180910390f35b610480610dcd565b005b61049c600480360381019061049791906136e7565b610e47565b6040516104a991906143d1565b60405180910390f35b6104cc60048036038101906104c791906136ab565b610e76565b6040516104d99190614438565b60405180910390f35b6104ea610ee0565b6040516104f7919061446e565b60405180910390f35b61051a600480360381019061051591906135c7565b610f72565b005b6105246110be565b6040516105319190614453565b60405180910390f35b610554600480360381019061054f919061358b565b6110c5565b005b610570600480360381019061056b9190613510565b611246565b005b61058c600480360381019061058791906137b6565b6112a8565b604051610599919061446e565b60405180910390f35b6105bc60048036038101906105b79190613682565b6113f2565b6040516105c99190614810565b60405180910390f35b6105da611416565b6040516105e79190614453565b60405180910390f35b61060a600480360381019061060591906136ab565b61143a565b005b61061461146e565b6040516106219190614453565b60405180910390f35b610632611492565b60405161063f919061446e565b60405180910390f35b610662600480360381019061065d9190613485565b611524565b60405161066f9190614438565b60405180910390f35b6000610683826115f6565b9050919050565b60606002805461069990614acd565b80601f01602080910402602001604051908101604052809291908181526020018280546106c590614acd565b80156107125780601f106106e757610100808354040283529160200191610712565b820191906000526020600020905b8154815290600101906020018083116106f557829003601f168201915b5050505050905090565b600061072782611670565b610766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075d906146b0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ac82610c63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081490614730565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083c6116dc565b73ffffffffffffffffffffffffffffffffffffffff16148061086b575061086a816108656116dc565b611524565b5b6108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a1906145f0565b60405180910390fd5b6108b483836116e4565b505050565b6000600a80549050905090565b6108d76108d16116dc565b8261179d565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90614750565b60405180910390fd5b61092183838361187b565b505050565b6000806000838152602001908152602001600020600101549050919050565b61094f8282611ad7565b61097481600160008581526020019081526020016000206115c690919063ffffffff16565b505050565b600061098483610d15565b82106109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc906144f0565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a288282611b00565b610a4d8160016000858152602001908152602001600020611b8390919063ffffffff16565b505050565b610a837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a7e6116dc565b610e76565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab9906147d0565b60405180910390fd5b610aca611bb3565b565b610ae783838360405180602001604052806000815250611246565b505050565b610afd610af76116dc565b8261179d565b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b33906147b0565b60405180910390fd5b610b4581611c55565b50565b6000610b526108b9565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614770565b60405180910390fd5b600a8281548110610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610bf36000801b610bee6116dc565b610e76565b610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614690565b60405180910390fd5b80600f9080519060200190610c4892919061326b565b5050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390614630565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90614610565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dfe7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610df96116dc565b610e76565b610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490614550565b60405180910390fd5b610e45611d66565b565b6000610e6e8260016000868152602001908152602001600020611e0990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610eef90614acd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1b90614acd565b8015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b5050505050905090565b610fa37f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f9e6116dc565b610e76565b610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990614790565b60405180910390fd5b6001600e83604051610ff4919061435c565b908152602001604051809103902060009054906101000a900460ff1660ff161415611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90614650565b60405180910390fd5b6001600e83604051611066919061435c565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550611096600d611e23565b60006110a2600d611e39565b90506110ae8482611e47565b6110b88183612015565b50505050565b6000801b81565b6110cd6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290614590565b60405180910390fd5b80600760006111486116dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111f56116dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161123a9190614438565b60405180910390a35050565b6112576112516116dc565b8361179d565b611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614750565b60405180910390fd5b6112a284848484612089565b50505050565b60606112b382611670565b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990614710565b60405180910390fd5b600060116000848152602001908152602001600020805461131290614acd565b80601f016020809104026020016040519081016040528092919081815260200182805461133e90614acd565b801561138b5780601f106113605761010080835404028352916020019161138b565b820191906000526020600020905b81548152906001019060200180831161136e57829003601f168201915b50505050509050600061139c6120e5565b90506000815114156113b25781925050506113ed565b6000825111156113e75780826040516020016113cf929190614373565b604051602081830303815290604052925050506113ed565b80925050505b919050565b600061140f60016000848152602001908152602001600020612177565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611444828261218c565b6114698160016000858152602001908152602001600020611b8390919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6060601080546114a190614acd565b80601f01602080910402602001604051908101604052809291908181526020018280546114cd90614acd565b801561151a5780601f106114ef5761010080835404028352916020019161151a565b820191906000526020600020905b8154815290600101906020018083116114fd57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c282826121b5565b5050565b60006115ee836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612295565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611669575061166882612305565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175783610c63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a882611670565b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de906145b0565b60405180910390fd5b60006117f283610c63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061186157508373ffffffffffffffffffffffffffffffffffffffff166118498461071c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061187257506118718185611524565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661189b82610c63565b73ffffffffffffffffffffffffffffffffffffffff16146118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e8906146f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890614570565b60405180910390fd5b61196c8383836123e7565b6119776000826116e4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c791906149af565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1e91906148ff565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ae082610926565b611af181611aec6116dc565b6123f7565b611afb83836121b5565b505050565b611b086116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c906147f0565b60405180910390fd5b611b7f8282612494565b5050565b6000611bab836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612575565b905092915050565b611bbb610c4c565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf1906144d0565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c3e6116dc565b604051611c4b91906143d1565b60405180910390a1565b6000611c6082610c63565b9050611c6e816000846123e7565b611c796000836116e4565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc991906149af565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611d6e610c4c565b15611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da5906145d0565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611df26116dc565b604051611dff91906143d1565b60405180910390a1565b6000611e1883600001836126fb565b60001c905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614670565b60405180910390fd5b611ec081611670565b15611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790614530565b60405180910390fd5b611f0c600083836123e7565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5c91906148ff565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61201e82611670565b61205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906146d0565b60405180910390fd5b8060116000848152602001908152602001600020908051906020019061208492919061326b565b505050565b61209484848461187b565b6120a08484848461274c565b6120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690614510565b60405180910390fd5b50505050565b6060600f80546120f490614acd565b80601f016020809104026020016040519081016040528092919081815260200182805461212090614acd565b801561216d5780601f106121425761010080835404028352916020019161216d565b820191906000526020600020905b81548152906001019060200180831161215057829003601f168201915b5050505050905090565b6000612185826000016128e3565b9050919050565b61219582610926565b6121a6816121a16116dc565b6123f7565b6121b08383612494565b505050565b6121bf8282610e76565b61229157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122366116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006122a183836128f4565b6122fa5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506122ff565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123e057506123df82612917565b5b9050919050565b6123f2838383612991565b505050565b6124018282610e76565b612490576124268173ffffffffffffffffffffffffffffffffffffffff1660146129e9565b6124348360001c60206129e9565b604051602001612445929190614397565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487919061446e565b60405180910390fd5b5050565b61249e8282610e76565b1561257157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125166116dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146126ef5760006001826125a791906149af565b90506000600186600001805490506125bf91906149af565b905081811461267a576000866000018281548110612606577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612650577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806126b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126f5565b60009150505b92915050565b6000826000018281548110612739577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600061276d8473ffffffffffffffffffffffffffffffffffffffff16612ce3565b156128d6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127966116dc565b8786866040518563ffffffff1660e01b81526004016127b894939291906143ec565b602060405180830381600087803b1580156127d257600080fd5b505af192505050801561280357506040513d601f19601f82011682018060405250810190612800919061374c565b60015b612886573d8060008114612833576040519150601f19603f3d011682016040523d82523d6000602084013e612838565b606091505b5060008151141561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614510565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128db565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061298a575061298982612cf6565b5b9050919050565b61299c838383612d70565b6129a4610c4c565b156129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129db906144b0565b60405180910390fd5b505050565b6060600060028360026129fc9190614955565b612a0691906148ff565b67ffffffffffffffff811115612a45577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a775781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b9f9190614955565b612ba991906148ff565b90505b6001811115612c95577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612c11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612c8e90614aa3565b9050612bac565b5060008414612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd090614490565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d695750612d6882612e84565b5b9050919050565b612d7b838383612eee565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dbe57612db981612ef3565b612dfd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dfc57612dfb8382612f3c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4057612e3b816130a9565b612e7f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e7e57612e7d82826131ec565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f4984610d15565b612f5391906149af565b9050600060096000848152602001908152602001600020549050818114613038576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506130bd91906149af565b90506000600b60008481526020019081526020016000205490506000600a8381548110613113577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a838154811061315b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806131d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131f783610d15565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b82805461327790614acd565b90600052602060002090601f01602090048101928261329957600085556132e0565b82601f106132b257805160ff19168380011785556132e0565b828001600101855582156132e0579182015b828111156132df5782518255916020019190600101906132c4565b5b5090506132ed91906132f1565b5090565b5b8082111561330a5760008160009055506001016132f2565b5090565b600061332161331c8461485c565b61482b565b90508281526020810184848401111561333957600080fd5b613344848285614a61565b509392505050565b600061335f61335a8461488c565b61482b565b90508281526020810184848401111561337757600080fd5b613382848285614a61565b509392505050565b60008135905061339981614b9d565b92915050565b6000813590506133ae81614bb4565b92915050565b6000813590506133c381614bcb565b92915050565b6000813590506133d881614be2565b92915050565b6000815190506133ed81614be2565b92915050565b600082601f83011261340457600080fd5b813561341484826020860161330e565b91505092915050565b600082601f83011261342e57600080fd5b813561343e84826020860161334c565b91505092915050565b60008135905061345681614bf9565b92915050565b60006020828403121561346e57600080fd5b600061347c8482850161338a565b91505092915050565b6000806040838503121561349857600080fd5b60006134a68582860161338a565b92505060206134b78582860161338a565b9150509250929050565b6000806000606084860312156134d657600080fd5b60006134e48682870161338a565b93505060206134f58682870161338a565b925050604061350686828701613447565b9150509250925092565b6000806000806080858703121561352657600080fd5b60006135348782880161338a565b94505060206135458782880161338a565b935050604061355687828801613447565b925050606085013567ffffffffffffffff81111561357357600080fd5b61357f878288016133f3565b91505092959194509250565b6000806040838503121561359e57600080fd5b60006135ac8582860161338a565b92505060206135bd8582860161339f565b9150509250929050565b6000806000606084860312156135dc57600080fd5b60006135ea8682870161338a565b935050602084013567ffffffffffffffff81111561360757600080fd5b6136138682870161341d565b925050604084013567ffffffffffffffff81111561363057600080fd5b61363c8682870161341d565b9150509250925092565b6000806040838503121561365957600080fd5b60006136678582860161338a565b925050602061367885828601613447565b9150509250929050565b60006020828403121561369457600080fd5b60006136a2848285016133b4565b91505092915050565b600080604083850312156136be57600080fd5b60006136cc858286016133b4565b92505060206136dd8582860161338a565b9150509250929050565b600080604083850312156136fa57600080fd5b6000613708858286016133b4565b925050602061371985828601613447565b9150509250929050565b60006020828403121561373557600080fd5b6000613743848285016133c9565b91505092915050565b60006020828403121561375e57600080fd5b600061376c848285016133de565b91505092915050565b60006020828403121561378757600080fd5b600082013567ffffffffffffffff8111156137a157600080fd5b6137ad8482850161341d565b91505092915050565b6000602082840312156137c857600080fd5b60006137d684828501613447565b91505092915050565b6137e8816149e3565b82525050565b6137f7816149f5565b82525050565b61380681614a01565b82525050565b6000613817826148bc565b61382181856148d2565b9350613831818560208601614a70565b61383a81614b8c565b840191505092915050565b6000613850826148c7565b61385a81856148e3565b935061386a818560208601614a70565b61387381614b8c565b840191505092915050565b6000613889826148c7565b61389381856148f4565b93506138a3818560208601614a70565b80840191505092915050565b60006138bc6020836148e3565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b60006138fc602b836148e3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006139626014836148e3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006139a2602b836148e3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613a086032836148e3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613a6e601c836148e3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613aae603e836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d75737420686176652070617573657220726f6c6520746f20706175736500006020830152604082019050919050565b6000613b146024836148e3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7a6019836148e3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613bba602c836148e3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c206010836148e3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c606038836148e3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cc6602a836148e3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d2c6029836148e3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d926020836148e3565b91507f486173682076616c75652068617320616c7265616479206265656e20757365646000830152602082019050919050565b6000613dd26020836148e3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613e12602c836148e3565b91507f4d75737420686176652044454641554c545f41444d494e5f524f4c4520746f2060008301527f73657420626173652075726900000000000000000000000000000000000000006020830152604082019050919050565b6000613e78602c836148e3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ede602c836148e3565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f446029836148e3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613faa602f836148e3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140106021836148e3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140766031836148e3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140dc602c836148e3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006141426017836148f4565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000614182603d836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d7573742068617665206d696e74657220726f6c6520746f206d696e740000006020830152604082019050919050565b60006141e86030836148e3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b600061424e6040836148e3565b91507f4552433732315072657365744d696e7465725061757365724175746f49643a2060008301527f6d75737420686176652070617573657220726f6c6520746f20756e70617573656020830152604082019050919050565b60006142b46011836148f4565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006142f4602f836148e3565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61435681614a57565b82525050565b6000614368828461387e565b915081905092915050565b600061437f828561387e565b915061438b828461387e565b91508190509392505050565b60006143a282614135565b91506143ae828561387e565b91506143b9826142a7565b91506143c5828461387e565b91508190509392505050565b60006020820190506143e660008301846137df565b92915050565b600060808201905061440160008301876137df565b61440e60208301866137df565b61441b604083018561434d565b818103606083015261442d818461380c565b905095945050505050565b600060208201905061444d60008301846137ee565b92915050565b600060208201905061446860008301846137fd565b92915050565b600060208201905081810360008301526144888184613845565b905092915050565b600060208201905081810360008301526144a9816138af565b9050919050565b600060208201905081810360008301526144c9816138ef565b9050919050565b600060208201905081810360008301526144e981613955565b9050919050565b6000602082019050818103600083015261450981613995565b9050919050565b60006020820190508181036000830152614529816139fb565b9050919050565b6000602082019050818103600083015261454981613a61565b9050919050565b6000602082019050818103600083015261456981613aa1565b9050919050565b6000602082019050818103600083015261458981613b07565b9050919050565b600060208201905081810360008301526145a981613b6d565b9050919050565b600060208201905081810360008301526145c981613bad565b9050919050565b600060208201905081810360008301526145e981613c13565b9050919050565b6000602082019050818103600083015261460981613c53565b9050919050565b6000602082019050818103600083015261462981613cb9565b9050919050565b6000602082019050818103600083015261464981613d1f565b9050919050565b6000602082019050818103600083015261466981613d85565b9050919050565b6000602082019050818103600083015261468981613dc5565b9050919050565b600060208201905081810360008301526146a981613e05565b9050919050565b600060208201905081810360008301526146c981613e6b565b9050919050565b600060208201905081810360008301526146e981613ed1565b9050919050565b6000602082019050818103600083015261470981613f37565b9050919050565b6000602082019050818103600083015261472981613f9d565b9050919050565b6000602082019050818103600083015261474981614003565b9050919050565b6000602082019050818103600083015261476981614069565b9050919050565b60006020820190508181036000830152614789816140cf565b9050919050565b600060208201905081810360008301526147a981614175565b9050919050565b600060208201905081810360008301526147c9816141db565b9050919050565b600060208201905081810360008301526147e981614241565b9050919050565b60006020820190508181036000830152614809816142e7565b9050919050565b6000602082019050614825600083018461434d565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561485257614851614b5d565b5b8060405250919050565b600067ffffffffffffffff82111561487757614876614b5d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156148a7576148a6614b5d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061490a82614a57565b915061491583614a57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494a57614949614aff565b5b828201905092915050565b600061496082614a57565b915061496b83614a57565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a4576149a3614aff565b5b828202905092915050565b60006149ba82614a57565b91506149c583614a57565b9250828210156149d8576149d7614aff565b5b828203905092915050565b60006149ee82614a37565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a8e578082015181840152602081019050614a73565b83811115614a9d576000848401525b50505050565b6000614aae82614a57565b91506000821415614ac257614ac1614aff565b5b600182039050919050565b60006002820490506001821680614ae557607f821691505b60208210811415614af957614af8614b2e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ba6816149e3565b8114614bb157600080fd5b50565b614bbd816149f5565b8114614bc857600080fd5b50565b614bd481614a01565b8114614bdf57600080fd5b50565b614beb81614a0b565b8114614bf657600080fd5b50565b614c0281614a57565b8114614c0d57600080fd5b5056fea264697066735822122097522b25adca279b8022173f9412dae10984aacdf9d0f421c68d6c9eae97bd6664736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000014ee7f8da059051e81873c2ee53668da1af72b590000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4c61647920446f6c6c730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c49534f44540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f697066732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f697066732f516d58464b3747366d77326479776e636b515178347050787457626973336d32724a554845457348657735726f6a0000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Lady Dolls
Arg [1] : symbol (string): LISODT
Arg [2] : baseTokenURI (string): https://sniftie.mypinata.cloud/ipfs/
Arg [3] : sniftieMinterContract (address): 0x14Ee7F8da059051E81873c2EE53668Da1af72B59
Arg [4] : contractMetadataURI (string): https://sniftie.mypinata.cloud/ipfs/QmXFK7G6mw2dywnckQQx4pPxtWbis3m2rJUHEEsHew5roj

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000014ee7f8da059051e81873c2ee53668da1af72b59
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 4c61647920446f6c6c7300000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 4c49534f44540000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [10] : 68747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f69
Arg [11] : 7066732f00000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [13] : 68747470733a2f2f736e69667469652e6d7970696e6174612e636c6f75642f69
Arg [14] : 7066732f516d58464b3747366d77326479776e636b5151783470507874576269
Arg [15] : 73336d32724a554845457348657735726f6a0000000000000000000000000000


Deployed Bytecode Sourcemap

899:5034:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5726:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2419:100:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3879:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3416:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1590:113:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4769:305:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5461:123:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2199:165:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1258:256:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2722:174:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5256:185:18;;;:::i;:::-;;5145:151:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:245:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1780:233:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2410:201:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1073:86:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2113:239:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1843:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4858:179:18;;;:::i;:::-;;1654:145:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4459:139:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2588:104:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3977:666:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2424:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4172:295:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5367:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2842:747:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1973:134:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1063:62:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2457:170:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1132:62:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2175:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4538:164:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5726:204:18;5862:4;5886:36;5910:11;5886:23;:36::i;:::-;5879:43;;5726:204;;;:::o;2419:100:6:-;2473:13;2506:5;2499:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2419:100;:::o;3879:221::-;3955:7;3983:16;3991:7;3983;:16::i;:::-;3975:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4068:15;:24;4084:7;4068:24;;;;;;;;;;;;;;;;;;;;;4061:31;;3879:221;;;:::o;3416:397::-;3497:13;3513:23;3528:7;3513:14;:23::i;:::-;3497:39;;3561:5;3555:11;;:2;:11;;;;3547:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3641:5;3625:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3650:37;3667:5;3674:12;:10;:12::i;:::-;3650:16;:37::i;:::-;3625:62;3617:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;3784:21;3793:2;3797:7;3784:8;:21::i;:::-;3416:397;;;:::o;1590:113:8:-;1651:7;1678:10;:17;;;;1671:24;;1590:113;:::o;4769:305:6:-;4930:41;4949:12;:10;:12::i;:::-;4963:7;4930:18;:41::i;:::-;4922:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5038:28;5048:4;5054:2;5058:7;5038:9;:28::i;:::-;4769:305;;;:::o;5461:123:0:-;5527:7;5554:6;:12;5561:4;5554:12;;;;;;;;;;;:22;;;5547:29;;5461:123;;;:::o;2199:165:1:-;2284:30;2300:4;2306:7;2284:15;:30::i;:::-;2325:31;2348:7;2325:12;:18;2338:4;2325:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;2199:165;;:::o;1258:256:8:-;1355:7;1391:23;1408:5;1391:16;:23::i;:::-;1383:5;:31;1375:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1480:12;:19;1493:5;1480:19;;;;;;;;;;;;;;;:26;1500:5;1480:26;;;;;;;;;;;;1473:33;;1258:256;;;;:::o;2722:174:1:-;2810:33;2829:4;2835:7;2810:18;:33::i;:::-;2854:34;2880:7;2854:12;:18;2867:4;2854:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2722:174;;:::o;5256:185:18:-;5309:34;1170:24;5330:12;:10;:12::i;:::-;5309:7;:34::i;:::-;5301:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:10;:8;:10::i;:::-;5256:185::o;5145:151:6:-;5249:39;5266:4;5272:2;5276:7;5249:39;;;;;;;;;;;;:16;:39::i;:::-;5145:151;;;:::o;456:245:7:-;574:41;593:12;:10;:12::i;:::-;607:7;574:18;:41::i;:::-;566:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;679:14;685:7;679:5;:14::i;:::-;456:245;:::o;1780:233:8:-;1855:7;1891:30;:28;:30::i;:::-;1883:5;:38;1875:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1988:10;1999:5;1988:17;;;;;;;;;;;;;;;;;;;;;;;;1981:24;;1780:233;;;:::o;2410:201:18:-;2479:41;2469:4:0;2487:18:18;;2507:12;:10;:12::i;:::-;2479:7;:41::i;:::-;2471:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;2596:7;2580:13;:23;;;;;;;;;;;;:::i;:::-;;2410:201;:::o;1073:86:17:-;1120:4;1144:7;;;;;;;;;;;1137:14;;1073:86;:::o;2113:239:6:-;2185:7;2205:13;2221:7;:16;2229:7;2221:16;;;;;;;;;;;;;;;;;;;;;2205:32;;2273:1;2256:19;;:5;:19;;;;2248:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2339:5;2332:12;;;2113:239;;;:::o;1843:208::-;1915:7;1960:1;1943:19;;:5;:19;;;;1935:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2027:9;:16;2037:5;2027:16;;;;;;;;;;;;;;;;2020:23;;1843:208;;;:::o;4858:179:18:-;4909:34;1170:24;4930:12;:10;:12::i;:::-;4909:7;:34::i;:::-;4901:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;5021:8;:6;:8::i;:::-;4858:179::o;1654:145:1:-;1736:7;1763:28;1785:5;1763:12;:18;1776:4;1763:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;1756:35;;1654:145;;;;:::o;4459:139:0:-;4537:4;4561:6;:12;4568:4;4561:12;;;;;;;;;;;:20;;:29;4582:7;4561:29;;;;;;;;;;;;;;;;;;;;;;;;;4554:36;;4459:139;;;;:::o;2588:104:6:-;2644:13;2677:7;2670:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:104;:::o;3977:666:18:-;4081:34;1101:24;4102:12;:10;:12::i;:::-;4081:7;:34::i;:::-;4073:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;4216:1;4200:6;4207:4;4200:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:17;;;;4192:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4280:1;4265:6;4272:4;4265:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;4446:27;:15;:25;:27::i;:::-;4484:17;4504:25;:15;:23;:25::i;:::-;4484:45;;4540:20;4546:2;4550:9;4540:5;:20::i;:::-;4571:33;4584:9;4595:8;4571:12;:33::i;:::-;3977:666;;;;:::o;2424:49:0:-;2469:4;2424:49;;;:::o;4172:295:6:-;4287:12;:10;:12::i;:::-;4275:24;;:8;:24;;;;4267:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4387:8;4342:18;:32;4361:12;:10;:12::i;:::-;4342:32;;;;;;;;;;;;;;;:42;4375:8;4342:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4440:8;4411:48;;4426:12;:10;:12::i;:::-;4411:48;;;4450:8;4411:48;;;;;;:::i;:::-;;;;;;;;4172:295;;:::o;5367:285::-;5499:41;5518:12;:10;:12::i;:::-;5532:7;5499:18;:41::i;:::-;5491:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5605:39;5619:4;5625:2;5629:7;5638:5;5605:13;:39::i;:::-;5367:285;;;;:::o;2842:747:18:-;2915:13;2949:16;2957:7;2949;:16::i;:::-;2941:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3030:23;3056:10;:19;3067:7;3056:19;;;;;;;;;;;3030:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3086:18;3107:10;:8;:10::i;:::-;3086:31;;3215:1;3199:4;3193:18;:23;3189:72;;;3240:9;3233:16;;;;;;3189:72;3391:1;3371:9;3365:23;:27;3361:108;;;3440:4;3446:9;3423:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3409:48;;;;;;3361:108;3577:4;3570:11;;;;2842:747;;;;:::o;1973:134:1:-;2045:7;2072:27;:12;:18;2085:4;2072:18;;;;;;;;;;;:25;:27::i;:::-;2065:34;;1973:134;;;:::o;1063:62:18:-;1101:24;1063:62;:::o;2457:170:1:-;2543:31;2560:4;2566:7;2543:16;:31::i;:::-;2585:34;2611:7;2585:12;:18;2598:4;2585:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2457:170;;:::o;1132:62:18:-;1170:24;1132:62;:::o;2175:105::-;2219:13;2252:20;2245:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2175:105;:::o;4538:164:6:-;4635:4;4659:18;:25;4678:5;4659:25;;;;;;;;;;;;;;;:35;4685:8;4659:35;;;;;;;;;;;;;;;;;;;;;;;;;4652:42;;4538:164;;;;:::o;7695:112:0:-;7774:25;7785:4;7791:7;7774:10;:25::i;:::-;7695:112;;:::o;6400:152:11:-;6470:4;6494:50;6499:3;:10;;6535:5;6519:23;;6511:32;;6494:4;:50::i;:::-;6487:57;;6400:152;;;;:::o;937:237:8:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:103;;;;1130:36;1154:11;1130:23;:36::i;:::-;1063:103;1056:110;;937:237;;;:::o;7119:127:6:-;7184:4;7236:1;7208:30;;:7;:16;7216:7;7208:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7201:37;;7119:127;;;:::o;601:98:3:-;654:7;681:10;674:17;;601:98;:::o;10996:174:6:-;11098:2;11071:15;:24;11087:7;11071:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11154:7;11150:2;11116:46;;11125:23;11140:7;11125:14;:23::i;:::-;11116:46;;;;;;;;;;;;10996:174;;:::o;7413:348::-;7506:4;7531:16;7539:7;7531;:16::i;:::-;7523:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7607:13;7623:23;7638:7;7623:14;:23::i;:::-;7607:39;;7676:5;7665:16;;:7;:16;;;:51;;;;7709:7;7685:31;;:20;7697:7;7685:11;:20::i;:::-;:31;;;7665:51;:87;;;;7720:32;7737:5;7744:7;7720:16;:32::i;:::-;7665:87;7657:96;;;7413:348;;;;:::o;10334:544::-;10459:4;10432:31;;:23;10447:7;10432:14;:23::i;:::-;:31;;;10424:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10542:1;10528:16;;:2;:16;;;;10520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10598:39;10619:4;10625:2;10629:7;10598:20;:39::i;:::-;10702:29;10719:1;10723:7;10702:8;:29::i;:::-;10763:1;10744:9;:15;10754:4;10744:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10792:1;10775:9;:13;10785:2;10775:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10823:2;10804:7;:16;10812:7;10804:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10862:7;10858:2;10843:27;;10852:4;10843:27;;;;;;;;;;;;10334:544;;;:::o;5846:147:0:-;5929:18;5942:4;5929:12;:18::i;:::-;4028:30;4039:4;4045:12;:10;:12::i;:::-;4028:10;:30::i;:::-;5960:25:::1;5971:4;5977:7;5960:10;:25::i;:::-;5846:147:::0;;;:::o;6894:218::-;7001:12;:10;:12::i;:::-;6990:23;;:7;:23;;;6982:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;7078:26;7090:4;7096:7;7078:11;:26::i;:::-;6894:218;;:::o;6728:158:11:-;6801:4;6825:53;6833:3;:10;;6869:5;6853:23;;6845:32;;6825:7;:53::i;:::-;6818:60;;6728:158;;;;:::o;2132:120:17:-;1676:8;:6;:8::i;:::-;1668:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2201:5:::1;2191:7;;:15;;;;;;;;;;;;;;;;;;2222:22;2231:12;:10;:12::i;:::-;2222:22;;;;;;:::i;:::-;;;;;;;;2132:120::o:0;9637:360:6:-;9697:13;9713:23;9728:7;9713:14;:23::i;:::-;9697:39;;9749:48;9770:5;9785:1;9789:7;9749:20;:48::i;:::-;9838:29;9855:1;9859:7;9838:8;:29::i;:::-;9900:1;9880:9;:16;9890:5;9880:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9919:7;:16;9927:7;9919:16;;;;;;;;;;;;9912:23;;;;;;;;;;;9981:7;9977:1;9953:36;;9962:5;9953:36;;;;;;;;;;;;9637:360;;:::o;1873:118:17:-;1399:8;:6;:8::i;:::-;1398:9;1390:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1943:4:::1;1933:7;;:14;;;;;;;;;;;;;;;;;;1963:20;1970:12;:10;:12::i;:::-;1963:20;;;;;;:::i;:::-;;;;;;;;1873:118::o:0;7686:158:11:-;7760:7;7811:22;7815:3;:10;;7827:5;7811:3;:22::i;:::-;7803:31;;7780:56;;7686:158;;;;:::o;915:127:4:-;1022:1;1004:7;:14;;;:19;;;;;;;;;;;915:127;:::o;793:114::-;858:7;885;:14;;;878:21;;793:114;;;:::o;9026:382:6:-;9120:1;9106:16;;:2;:16;;;;9098:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9179:16;9187:7;9179;:16::i;:::-;9178:17;9170:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9241:45;9270:1;9274:2;9278:7;9241:20;:45::i;:::-;9316:1;9299:9;:13;9309:2;9299:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9347:2;9328:7;:16;9336:7;9328:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9392:7;9388:2;9367:33;;9384:1;9367:33;;;;;;;;;;;;9026:382;;:::o;2619:215:18:-;2719:16;2727:7;2719;:16::i;:::-;2711:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2817:9;2795:10;:19;2806:7;2795:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;2619:215;;:::o;6534:272:6:-;6648:28;6658:4;6664:2;6668:7;6648:9;:28::i;:::-;6695:48;6718:4;6724:2;6728:7;6737:5;6695:22;:48::i;:::-;6687:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6534:272;;;;:::o;2288:114:18:-;2348:13;2381;2374:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2288:114;:::o;7225:117:11:-;7288:7;7315:19;7323:3;:10;;7315:7;:19::i;:::-;7308:26;;7225:117;;;:::o;6238:149:0:-;6322:18;6335:4;6322:12;:18::i;:::-;4028:30;4039:4;4045:12;:10;:12::i;:::-;4028:10;:30::i;:::-;6353:26:::1;6365:4;6371:7;6353:11;:26::i;:::-;6238:149:::0;;;:::o;8142:229::-;8217:22;8225:4;8231:7;8217;:22::i;:::-;8212:152;;8288:4;8256:6;:12;8263:4;8256:12;;;;;;;;;;;:20;;:29;8277:7;8256:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;8339:12;:10;:12::i;:::-;8312:40;;8330:7;8312:40;;8324:4;8312:40;;;;;;;;;;8212:152;8142:229;;:::o;1685:414:11:-;1748:4;1770:21;1780:3;1785:5;1770:9;:21::i;:::-;1765:327;;1808:3;:11;;1825:5;1808:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:3;:11;;:18;;;;1969:3;:12;;:19;1982:5;1969:19;;;;;;;;;;;:40;;;;2031:4;2024:11;;;;1765:327;2075:5;2068:12;;1685:414;;;;;:::o;1487:292:6:-;1589:4;1628:25;1613:40;;;:11;:40;;;;:105;;;;1685:33;1670:48;;;:11;:48;;;;1613:105;:158;;;;1735:36;1759:11;1735:23;:36::i;:::-;1613:158;1606:165;;1487:292;;;:::o;5449:205:18:-;5601:45;5628:4;5634:2;5638:7;5601:26;:45::i;:::-;5449:205;;;:::o;4888:384:0:-;4968:22;4976:4;4982:7;4968;:22::i;:::-;4964:301;;5100:41;5128:7;5100:41;;5138:2;5100:19;:41::i;:::-;5198:38;5226:4;5218:13;;5233:2;5198:19;:38::i;:::-;5021:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5007:246;;;;;;;;;;;:::i;:::-;;;;;;;;4964:301;4888:384;;:::o;8379:230::-;8454:22;8462:4;8468:7;8454;:22::i;:::-;8450:152;;;8525:5;8493:6;:12;8500:4;8493:12;;;;;;;;;;;:20;;:29;8514:7;8493:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8577:12;:10;:12::i;:::-;8550:40;;8568:7;8550:40;;8562:4;8550:40;;;;;;;;;;8450:152;8379:230;;:::o;2275:1407:11:-;2341:4;2459:18;2480:3;:12;;:19;2493:5;2480:19;;;;;;;;;;;;2459:40;;2530:1;2516:10;:15;2512:1163;;2878:21;2915:1;2902:10;:14;;;;:::i;:::-;2878:38;;2931:17;2972:1;2951:3;:11;;:18;;;;:22;;;;:::i;:::-;2931:42;;3007:13;2994:9;:26;2990:405;;3041:17;3061:3;:11;;3073:9;3061:22;;;;;;;;;;;;;;;;;;;;;;;;3041:42;;3215:9;3186:3;:11;;3198:13;3186:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3326:10;3300:3;:12;;:23;3313:9;3300:23;;;;;;;;;;;:36;;;;2990:405;;3476:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3571:3;:12;;:19;3584:5;3571:19;;;;;;;;;;;3564:26;;;3614:4;3607:11;;;;;;;2512:1163;3658:5;3651:12;;;2275:1407;;;;;:::o;4436:120::-;4503:7;4530:3;:11;;4542:5;4530:18;;;;;;;;;;;;;;;;;;;;;;;;4523:25;;4436:120;;;;:::o;11735:843:6:-;11856:4;11882:15;:2;:13;;;:15::i;:::-;11878:693;;;11934:2;11918:36;;;11955:12;:10;:12::i;:::-;11969:4;11975:7;11984:5;11918:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11914:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12181:1;12164:6;:13;:18;12160:341;;;12207:60;;;;;;;;;;:::i;:::-;;;;;;;;12160:341;12451:6;12445:13;12436:6;12432:2;12428:15;12421:38;11914:602;12051:45;;;12041:55;;;:6;:55;;;;12034:62;;;;;11878:693;12555:4;12548:11;;11735:843;;;;;;;:::o;3983:109:11:-;4039:7;4066:3;:11;;:18;;;;4059:25;;3983:109;;;:::o;3768:129::-;3841:4;3888:1;3865:3;:12;;:19;3878:5;3865:19;;;;;;;;;;;;:24;;3858:31;;3768:129;;;;:::o;828:227:1:-;913:4;952:42;937:57;;;:11;:57;;;;:110;;;;1011:36;1035:11;1011:23;:36::i;:::-;937:110;930:117;;828:227;;;:::o;599:241:9:-;709:45;736:4;742:2;746:7;709:26;:45::i;:::-;776:8;:6;:8::i;:::-;775:9;767:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;599:241;;;:::o;1585:447:19:-;1660:13;1686:19;1731:1;1722:6;1718:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1708:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1686:47;;1744:15;:6;1751:1;1744:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;1801:9;1826:1;1817:6;1813:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1801:26;;1796:131;1833:1;1829;:5;1796:131;;;1868:8;1885:3;1877:5;:11;1868:21;;;;;;;;;;;;;;;;;;1856:6;1863:1;1856:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;1914:1;1904:11;;;;;1836:3;;;;:::i;:::-;;;1796:131;;;;1954:1;1945:5;:10;1937:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2017:6;2003:21;;;1585:447;;;;:::o;743:422:2:-;803:4;1011:12;1122:7;1110:20;1102:28;;1156:1;1149:4;:8;1142:15;;;743:422;;;:::o;4150:217:0:-;4235:4;4274:32;4259:47;;;:11;:47;;;;:100;;;;4323:36;4347:11;4323:23;:36::i;:::-;4259:100;4252:107;;4150:217;;;:::o;2626:555:8:-;2736:45;2763:4;2769:2;2773:7;2736:26;:45::i;:::-;2814:1;2798:18;;:4;:18;;;2794:187;;;2833:40;2865:7;2833:31;:40::i;:::-;2794:187;;;2903:2;2895:10;;:4;:10;;;2891:90;;2922:47;2955:4;2961:7;2922:32;:47::i;:::-;2891:90;2794:187;3009:1;2995:16;;:2;:16;;;2991:183;;;3028:45;3065:7;3028:36;:45::i;:::-;2991:183;;;3101:4;3095:10;;:2;:10;;;3091:83;;3122:40;3150:2;3154:7;3122:27;:40::i;:::-;3091:83;2991:183;2626:555;;;:::o;787:157:5:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;13191:93:6:-;;;;:::o;3904:164:8:-;4008:10;:17;;;;3981:15;:24;3997:7;3981:24;;;;;;;;;;;:44;;;;4036:10;4052:7;4036:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3904:164;:::o;4695:988::-;4961:22;5011:1;4986:22;5003:4;4986:16;:22::i;:::-;:26;;;;:::i;:::-;4961:51;;5023:18;5044:17;:26;5062:7;5044:26;;;;;;;;;;;;5023:47;;5191:14;5177:10;:28;5173:328;;5222:19;5244:12;:18;5257:4;5244:18;;;;;;;;;;;;;;;:34;5263:14;5244:34;;;;;;;;;;;;5222:56;;5328:11;5295:12;:18;5308:4;5295:18;;;;;;;;;;;;;;;:30;5314:10;5295:30;;;;;;;;;;;:44;;;;5445:10;5412:17;:30;5430:11;5412:30;;;;;;;;;;;:43;;;;5173:328;;5597:17;:26;5615:7;5597:26;;;;;;;;;;;5590:33;;;5641:12;:18;5654:4;5641:18;;;;;;;;;;;;;;;:34;5660:14;5641:34;;;;;;;;;;;5634:41;;;4695:988;;;;:::o;5978:1079::-;6231:22;6276:1;6256:10;:17;;;;:21;;;;:::i;:::-;6231:46;;6288:18;6309:15;:24;6325:7;6309:24;;;;;;;;;;;;6288:45;;6660:19;6682:10;6693:14;6682:26;;;;;;;;;;;;;;;;;;;;;;;;6660:48;;6746:11;6721:10;6732;6721:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6857:10;6826:15;:28;6842:11;6826:28;;;;;;;;;;;:41;;;;6998:15;:24;7014:7;6998:24;;;;;;;;;;;6991:31;;;7033:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5978:1079;;;;:::o;3482:221::-;3567:14;3584:20;3601:2;3584:16;:20::i;:::-;3567:37;;3642:7;3615:12;:16;3628:2;3615:16;;;;;;;;;;;;;;;:24;3632:6;3615:24;;;;;;;;;;;:34;;;;3689:6;3660:17;:26;3678:7;3660:26;;;;;;;;;;;:35;;;;3482:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:20:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:139::-;;1073:6;1060:20;1051:29;;1089:33;1116:5;1089:33;:::i;:::-;1041:87;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:262::-;;2260:2;2248:9;2239:7;2235:23;2231:32;2228:2;;;2276:1;2273;2266:12;2228:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2218:196;;;;:::o;2420:407::-;;;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2731:2;2757:53;2802:7;2793:6;2782:9;2778:22;2757:53;:::i;:::-;2747:63;;2702:118;2503:324;;;;;:::o;2833:552::-;;;;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;3289:2;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3260:118;2933:452;;;;;:::o;3391:809::-;;;;;3559:3;3547:9;3538:7;3534:23;3530:33;3527:2;;;3576:1;3573;3566:12;3527:2;3619:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3590:117;3746:2;3772:53;3817:7;3808:6;3797:9;3793:22;3772:53;:::i;:::-;3762:63;;3717:118;3874:2;3900:53;3945:7;3936:6;3925:9;3921:22;3900:53;:::i;:::-;3890:63;;3845:118;4030:2;4019:9;4015:18;4002:32;4061:18;4053:6;4050:30;4047:2;;;4093:1;4090;4083:12;4047:2;4121:62;4175:7;4166:6;4155:9;4151:22;4121:62;:::i;:::-;4111:72;;3973:220;3517:683;;;;;;;:::o;4206:401::-;;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:50;4582:7;4573:6;4562:9;4558:22;4540:50;:::i;:::-;4530:60;;4485:115;4286:321;;;;;:::o;4613:778::-;;;;4775:2;4763:9;4754:7;4750:23;4746:32;4743:2;;;4791:1;4788;4781:12;4743:2;4834:1;4859:53;4904:7;4895:6;4884:9;4880:22;4859:53;:::i;:::-;4849:63;;4805:117;4989:2;4978:9;4974:18;4961:32;5020:18;5012:6;5009:30;5006:2;;;5052:1;5049;5042:12;5006:2;5080:63;5135:7;5126:6;5115:9;5111:22;5080:63;:::i;:::-;5070:73;;4932:221;5220:2;5209:9;5205:18;5192:32;5251:18;5243:6;5240:30;5237:2;;;5283:1;5280;5273:12;5237:2;5311:63;5366:7;5357:6;5346:9;5342:22;5311:63;:::i;:::-;5301:73;;5163:221;4733:658;;;;;:::o;5397:407::-;;;5522:2;5510:9;5501:7;5497:23;5493:32;5490:2;;;5538:1;5535;5528:12;5490:2;5581:1;5606:53;5651:7;5642:6;5631:9;5627:22;5606:53;:::i;:::-;5596:63;;5552:117;5708:2;5734:53;5779:7;5770:6;5759:9;5755:22;5734:53;:::i;:::-;5724:63;;5679:118;5480:324;;;;;:::o;5810:262::-;;5918:2;5906:9;5897:7;5893:23;5889:32;5886:2;;;5934:1;5931;5924:12;5886:2;5977:1;6002:53;6047:7;6038:6;6027:9;6023:22;6002:53;:::i;:::-;5992:63;;5948:117;5876:196;;;;:::o;6078:407::-;;;6203:2;6191:9;6182:7;6178:23;6174:32;6171:2;;;6219:1;6216;6209:12;6171:2;6262:1;6287:53;6332:7;6323:6;6312:9;6308:22;6287:53;:::i;:::-;6277:63;;6233:117;6389:2;6415:53;6460:7;6451:6;6440:9;6436:22;6415:53;:::i;:::-;6405:63;;6360:118;6161:324;;;;;:::o;6491:407::-;;;6616:2;6604:9;6595:7;6591:23;6587:32;6584:2;;;6632:1;6629;6622:12;6584:2;6675:1;6700:53;6745:7;6736:6;6725:9;6721:22;6700:53;:::i;:::-;6690:63;;6646:117;6802:2;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6773:118;6574:324;;;;;:::o;6904:260::-;;7011:2;6999:9;6990:7;6986:23;6982:32;6979:2;;;7027:1;7024;7017:12;6979:2;7070:1;7095:52;7139:7;7130:6;7119:9;7115:22;7095:52;:::i;:::-;7085:62;;7041:116;6969:195;;;;:::o;7170:282::-;;7288:2;7276:9;7267:7;7263:23;7259:32;7256:2;;;7304:1;7301;7294:12;7256:2;7347:1;7372:63;7427:7;7418:6;7407:9;7403:22;7372:63;:::i;:::-;7362:73;;7318:127;7246:206;;;;:::o;7458:375::-;;7576:2;7564:9;7555:7;7551:23;7547:32;7544:2;;;7592:1;7589;7582:12;7544:2;7663:1;7652:9;7648:17;7635:31;7693:18;7685:6;7682:30;7679:2;;;7725:1;7722;7715:12;7679:2;7753:63;7808:7;7799:6;7788:9;7784:22;7753:63;:::i;:::-;7743:73;;7606:220;7534:299;;;;:::o;7839:262::-;;7947:2;7935:9;7926:7;7922:23;7918:32;7915:2;;;7963:1;7960;7953:12;7915:2;8006:1;8031:53;8076:7;8067:6;8056:9;8052:22;8031:53;:::i;:::-;8021:63;;7977:117;7905:196;;;;:::o;8107:118::-;8194:24;8212:5;8194:24;:::i;:::-;8189:3;8182:37;8172:53;;:::o;8231:109::-;8312:21;8327:5;8312:21;:::i;:::-;8307:3;8300:34;8290:50;;:::o;8346:118::-;8433:24;8451:5;8433:24;:::i;:::-;8428:3;8421:37;8411:53;;:::o;8470:360::-;;8584:38;8616:5;8584:38;:::i;:::-;8638:70;8701:6;8696:3;8638:70;:::i;:::-;8631:77;;8717:52;8762:6;8757:3;8750:4;8743:5;8739:16;8717:52;:::i;:::-;8794:29;8816:6;8794:29;:::i;:::-;8789:3;8785:39;8778:46;;8560:270;;;;;:::o;8836:364::-;;8952:39;8985:5;8952:39;:::i;:::-;9007:71;9071:6;9066:3;9007:71;:::i;:::-;9000:78;;9087:52;9132:6;9127:3;9120:4;9113:5;9109:16;9087:52;:::i;:::-;9164:29;9186:6;9164:29;:::i;:::-;9159:3;9155:39;9148:46;;8928:272;;;;;:::o;9206:377::-;;9340:39;9373:5;9340:39;:::i;:::-;9395:89;9477:6;9472:3;9395:89;:::i;:::-;9388:96;;9493:52;9538:6;9533:3;9526:4;9519:5;9515:16;9493:52;:::i;:::-;9570:6;9565:3;9561:16;9554:23;;9316:267;;;;;:::o;9589:330::-;;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9849:34;9845:1;9840:3;9836:11;9829:55;9910:2;9905:3;9901:12;9894:19;;9735:184;;;:::o;9925:375::-;;10088:67;10152:2;10147:3;10088:67;:::i;:::-;10081:74;;10185:34;10181:1;10176:3;10172:11;10165:55;10251:13;10246:2;10241:3;10237:12;10230:35;10291:2;10286:3;10282:12;10275:19;;10071:229;;;:::o;10306:318::-;;10469:67;10533:2;10528:3;10469:67;:::i;:::-;10462:74;;10566:22;10562:1;10557:3;10553:11;10546:43;10615:2;10610:3;10606:12;10599:19;;10452:172;;;:::o;10630:375::-;;10793:67;10857:2;10852:3;10793:67;:::i;:::-;10786:74;;10890:34;10886:1;10881:3;10877:11;10870:55;10956:13;10951:2;10946:3;10942:12;10935:35;10996:2;10991:3;10987:12;10980:19;;10776:229;;;:::o;11011:382::-;;11174:67;11238:2;11233:3;11174:67;:::i;:::-;11167:74;;11271:34;11267:1;11262:3;11258:11;11251:55;11337:20;11332:2;11327:3;11323:12;11316:42;11384:2;11379:3;11375:12;11368:19;;11157:236;;;:::o;11399:326::-;;11562:67;11626:2;11621:3;11562:67;:::i;:::-;11555:74;;11659:30;11655:1;11650:3;11646:11;11639:51;11716:2;11711:3;11707:12;11700:19;;11545:180;;;:::o;11731:394::-;;11894:67;11958:2;11953:3;11894:67;:::i;:::-;11887:74;;11991:34;11987:1;11982:3;11978:11;11971:55;12057:32;12052:2;12047:3;12043:12;12036:54;12116:2;12111:3;12107:12;12100:19;;11877:248;;;:::o;12131:368::-;;12294:67;12358:2;12353:3;12294:67;:::i;:::-;12287:74;;12391:34;12387:1;12382:3;12378:11;12371:55;12457:6;12452:2;12447:3;12443:12;12436:28;12490:2;12485:3;12481:12;12474:19;;12277:222;;;:::o;12505:323::-;;12668:67;12732:2;12727:3;12668:67;:::i;:::-;12661:74;;12765:27;12761:1;12756:3;12752:11;12745:48;12819:2;12814:3;12810:12;12803:19;;12651:177;;;:::o;12834:376::-;;12997:67;13061:2;13056:3;12997:67;:::i;:::-;12990:74;;13094:34;13090:1;13085:3;13081:11;13074:55;13160:14;13155:2;13150:3;13146:12;13139:36;13201:2;13196:3;13192:12;13185:19;;12980:230;;;:::o;13216:314::-;;13379:67;13443:2;13438:3;13379:67;:::i;:::-;13372:74;;13476:18;13472:1;13467:3;13463:11;13456:39;13521:2;13516:3;13512:12;13505:19;;13362:168;;;:::o;13536:388::-;;13699:67;13763:2;13758:3;13699:67;:::i;:::-;13692:74;;13796:34;13792:1;13787:3;13783:11;13776:55;13862:26;13857:2;13852:3;13848:12;13841:48;13915:2;13910:3;13906:12;13899:19;;13682:242;;;:::o;13930:374::-;;14093:67;14157:2;14152:3;14093:67;:::i;:::-;14086:74;;14190:34;14186:1;14181:3;14177:11;14170:55;14256:12;14251:2;14246:3;14242:12;14235:34;14295:2;14290:3;14286:12;14279:19;;14076:228;;;:::o;14310:373::-;;14473:67;14537:2;14532:3;14473:67;:::i;:::-;14466:74;;14570:34;14566:1;14561:3;14557:11;14550:55;14636:11;14631:2;14626:3;14622:12;14615:33;14674:2;14669:3;14665:12;14658:19;;14456:227;;;:::o;14689:330::-;;14852:67;14916:2;14911:3;14852:67;:::i;:::-;14845:74;;14949:34;14945:1;14940:3;14936:11;14929:55;15010:2;15005:3;15001:12;14994:19;;14835:184;;;:::o;15025:330::-;;15188:67;15252:2;15247:3;15188:67;:::i;:::-;15181:74;;15285:34;15281:1;15276:3;15272:11;15265:55;15346:2;15341:3;15337:12;15330:19;;15171:184;;;:::o;15361:376::-;;15524:67;15588:2;15583:3;15524:67;:::i;:::-;15517:74;;15621:34;15617:1;15612:3;15608:11;15601:55;15687:14;15682:2;15677:3;15673:12;15666:36;15728:2;15723:3;15719:12;15712:19;;15507:230;;;:::o;15743:376::-;;15906:67;15970:2;15965:3;15906:67;:::i;:::-;15899:74;;16003:34;15999:1;15994:3;15990:11;15983:55;16069:14;16064:2;16059:3;16055:12;16048:36;16110:2;16105:3;16101:12;16094:19;;15889:230;;;:::o;16125:376::-;;16288:67;16352:2;16347:3;16288:67;:::i;:::-;16281:74;;16385:34;16381:1;16376:3;16372:11;16365:55;16451:14;16446:2;16441:3;16437:12;16430:36;16492:2;16487:3;16483:12;16476:19;;16271:230;;;:::o;16507:373::-;;16670:67;16734:2;16729:3;16670:67;:::i;:::-;16663:74;;16767:34;16763:1;16758:3;16754:11;16747:55;16833:11;16828:2;16823:3;16819:12;16812:33;16871:2;16866:3;16862:12;16855:19;;16653:227;;;:::o;16886:379::-;;17049:67;17113:2;17108:3;17049:67;:::i;:::-;17042:74;;17146:34;17142:1;17137:3;17133:11;17126:55;17212:17;17207:2;17202:3;17198:12;17191:39;17256:2;17251:3;17247:12;17240:19;;17032:233;;;:::o;17271:365::-;;17434:67;17498:2;17493:3;17434:67;:::i;:::-;17427:74;;17531:34;17527:1;17522:3;17518:11;17511:55;17597:3;17592:2;17587:3;17583:12;17576:25;17627:2;17622:3;17618:12;17611:19;;17417:219;;;:::o;17642:381::-;;17805:67;17869:2;17864:3;17805:67;:::i;:::-;17798:74;;17902:34;17898:1;17893:3;17889:11;17882:55;17968:19;17963:2;17958:3;17954:12;17947:41;18014:2;18009:3;18005:12;17998:19;;17788:235;;;:::o;18029:376::-;;18192:67;18256:2;18251:3;18192:67;:::i;:::-;18185:74;;18289:34;18285:1;18280:3;18276:11;18269:55;18355:14;18350:2;18345:3;18341:12;18334:36;18396:2;18391:3;18387:12;18380:19;;18175:230;;;:::o;18411:357::-;;18592:85;18674:2;18669:3;18592:85;:::i;:::-;18585:92;;18707:25;18703:1;18698:3;18694:11;18687:46;18759:2;18754:3;18750:12;18743:19;;18575:193;;;:::o;18774:393::-;;18937:67;19001:2;18996:3;18937:67;:::i;:::-;18930:74;;19034:34;19030:1;19025:3;19021:11;19014:55;19100:31;19095:2;19090:3;19086:12;19079:53;19158:2;19153:3;19149:12;19142:19;;18920:247;;;:::o;19173:380::-;;19336:67;19400:2;19395:3;19336:67;:::i;:::-;19329:74;;19433:34;19429:1;19424:3;19420:11;19413:55;19499:18;19494:2;19489:3;19485:12;19478:40;19544:2;19539:3;19535:12;19528:19;;19319:234;;;:::o;19559:396::-;;19722:67;19786:2;19781:3;19722:67;:::i;:::-;19715:74;;19819:34;19815:1;19810:3;19806:11;19799:55;19885:34;19880:2;19875:3;19871:12;19864:56;19946:2;19941:3;19937:12;19930:19;;19705:250;;;:::o;19961:351::-;;20142:85;20224:2;20219:3;20142:85;:::i;:::-;20135:92;;20257:19;20253:1;20248:3;20244:11;20237:40;20303:2;20298:3;20294:12;20287:19;;20125:187;;;:::o;20318:379::-;;20481:67;20545:2;20540:3;20481:67;:::i;:::-;20474:74;;20578:34;20574:1;20569:3;20565:11;20558:55;20644:17;20639:2;20634:3;20630:12;20623:39;20688:2;20683:3;20679:12;20672:19;;20464:233;;;:::o;20703:118::-;20790:24;20808:5;20790:24;:::i;:::-;20785:3;20778:37;20768:53;;:::o;20827:275::-;;20981:95;21072:3;21063:6;20981:95;:::i;:::-;20974:102;;21093:3;21086:10;;20963:139;;;;:::o;21108:435::-;;21310:95;21401:3;21392:6;21310:95;:::i;:::-;21303:102;;21422:95;21513:3;21504:6;21422:95;:::i;:::-;21415:102;;21534:3;21527:10;;21292:251;;;;;:::o;21549:967::-;;21953:148;22097:3;21953:148;:::i;:::-;21946:155;;22118:95;22209:3;22200:6;22118:95;:::i;:::-;22111:102;;22230:148;22374:3;22230:148;:::i;:::-;22223:155;;22395:95;22486:3;22477:6;22395:95;:::i;:::-;22388:102;;22507:3;22500:10;;21935:581;;;;;:::o;22522:222::-;;22653:2;22642:9;22638:18;22630:26;;22666:71;22734:1;22723:9;22719:17;22710:6;22666:71;:::i;:::-;22620:124;;;;:::o;22750:640::-;;22983:3;22972:9;22968:19;22960:27;;22997:71;23065:1;23054:9;23050:17;23041:6;22997:71;:::i;:::-;23078:72;23146:2;23135:9;23131:18;23122:6;23078:72;:::i;:::-;23160;23228:2;23217:9;23213:18;23204:6;23160:72;:::i;:::-;23279:9;23273:4;23269:20;23264:2;23253:9;23249:18;23242:48;23307:76;23378:4;23369:6;23307:76;:::i;:::-;23299:84;;22950:440;;;;;;;:::o;23396:210::-;;23521:2;23510:9;23506:18;23498:26;;23534:65;23596:1;23585:9;23581:17;23572:6;23534:65;:::i;:::-;23488:118;;;;:::o;23612:222::-;;23743:2;23732:9;23728:18;23720:26;;23756:71;23824:1;23813:9;23809:17;23800:6;23756:71;:::i;:::-;23710:124;;;;:::o;23840:313::-;;23991:2;23980:9;23976:18;23968:26;;24040:9;24034:4;24030:20;24026:1;24015:9;24011:17;24004:47;24068:78;24141:4;24132:6;24068:78;:::i;:::-;24060:86;;23958:195;;;;:::o;24159:419::-;;24363:2;24352:9;24348:18;24340:26;;24412:9;24406:4;24402:20;24398:1;24387:9;24383:17;24376:47;24440:131;24566:4;24440:131;:::i;:::-;24432:139;;24330:248;;;:::o;24584:419::-;;24788:2;24777:9;24773:18;24765:26;;24837:9;24831:4;24827:20;24823:1;24812:9;24808:17;24801:47;24865:131;24991:4;24865:131;:::i;:::-;24857:139;;24755:248;;;:::o;25009:419::-;;25213:2;25202:9;25198:18;25190:26;;25262:9;25256:4;25252:20;25248:1;25237:9;25233:17;25226:47;25290:131;25416:4;25290:131;:::i;:::-;25282:139;;25180:248;;;:::o;25434:419::-;;25638:2;25627:9;25623:18;25615:26;;25687:9;25681:4;25677:20;25673:1;25662:9;25658:17;25651:47;25715:131;25841:4;25715:131;:::i;:::-;25707:139;;25605:248;;;:::o;25859:419::-;;26063:2;26052:9;26048:18;26040:26;;26112:9;26106:4;26102:20;26098:1;26087:9;26083:17;26076:47;26140:131;26266:4;26140:131;:::i;:::-;26132:139;;26030:248;;;:::o;26284:419::-;;26488:2;26477:9;26473:18;26465:26;;26537:9;26531:4;26527:20;26523:1;26512:9;26508:17;26501:47;26565:131;26691:4;26565:131;:::i;:::-;26557:139;;26455:248;;;:::o;26709:419::-;;26913:2;26902:9;26898:18;26890:26;;26962:9;26956:4;26952:20;26948:1;26937:9;26933:17;26926:47;26990:131;27116:4;26990:131;:::i;:::-;26982:139;;26880:248;;;:::o;27134:419::-;;27338:2;27327:9;27323:18;27315:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27415:131;27541:4;27415:131;:::i;:::-;27407:139;;27305:248;;;:::o;27559:419::-;;27763:2;27752:9;27748:18;27740:26;;27812:9;27806:4;27802:20;27798:1;27787:9;27783:17;27776:47;27840:131;27966:4;27840:131;:::i;:::-;27832:139;;27730:248;;;:::o;27984:419::-;;28188:2;28177:9;28173:18;28165:26;;28237:9;28231:4;28227:20;28223:1;28212:9;28208:17;28201:47;28265:131;28391:4;28265:131;:::i;:::-;28257:139;;28155:248;;;:::o;28409:419::-;;28613:2;28602:9;28598:18;28590:26;;28662:9;28656:4;28652:20;28648:1;28637:9;28633:17;28626:47;28690:131;28816:4;28690:131;:::i;:::-;28682:139;;28580:248;;;:::o;28834:419::-;;29038:2;29027:9;29023:18;29015:26;;29087:9;29081:4;29077:20;29073:1;29062:9;29058:17;29051:47;29115:131;29241:4;29115:131;:::i;:::-;29107:139;;29005:248;;;:::o;29259:419::-;;29463:2;29452:9;29448:18;29440:26;;29512:9;29506:4;29502:20;29498:1;29487:9;29483:17;29476:47;29540:131;29666:4;29540:131;:::i;:::-;29532:139;;29430:248;;;:::o;29684:419::-;;29888:2;29877:9;29873:18;29865:26;;29937:9;29931:4;29927:20;29923:1;29912:9;29908:17;29901:47;29965:131;30091:4;29965:131;:::i;:::-;29957:139;;29855:248;;;:::o;30109:419::-;;30313:2;30302:9;30298:18;30290:26;;30362:9;30356:4;30352:20;30348:1;30337:9;30333:17;30326:47;30390:131;30516:4;30390:131;:::i;:::-;30382:139;;30280:248;;;:::o;30534:419::-;;30738:2;30727:9;30723:18;30715:26;;30787:9;30781:4;30777:20;30773:1;30762:9;30758:17;30751:47;30815:131;30941:4;30815:131;:::i;:::-;30807:139;;30705:248;;;:::o;30959:419::-;;31163:2;31152:9;31148:18;31140:26;;31212:9;31206:4;31202:20;31198:1;31187:9;31183:17;31176:47;31240:131;31366:4;31240:131;:::i;:::-;31232:139;;31130:248;;;:::o;31384:419::-;;31588:2;31577:9;31573:18;31565:26;;31637:9;31631:4;31627:20;31623:1;31612:9;31608:17;31601:47;31665:131;31791:4;31665:131;:::i;:::-;31657:139;;31555:248;;;:::o;31809:419::-;;32013:2;32002:9;31998:18;31990:26;;32062:9;32056:4;32052:20;32048:1;32037:9;32033:17;32026:47;32090:131;32216:4;32090:131;:::i;:::-;32082:139;;31980:248;;;:::o;32234:419::-;;32438:2;32427:9;32423:18;32415:26;;32487:9;32481:4;32477:20;32473:1;32462:9;32458:17;32451:47;32515:131;32641:4;32515:131;:::i;:::-;32507:139;;32405:248;;;:::o;32659:419::-;;32863:2;32852:9;32848:18;32840:26;;32912:9;32906:4;32902:20;32898:1;32887:9;32883:17;32876:47;32940:131;33066:4;32940:131;:::i;:::-;32932:139;;32830:248;;;:::o;33084:419::-;;33288:2;33277:9;33273:18;33265:26;;33337:9;33331:4;33327:20;33323:1;33312:9;33308:17;33301:47;33365:131;33491:4;33365:131;:::i;:::-;33357:139;;33255:248;;;:::o;33509:419::-;;33713:2;33702:9;33698:18;33690:26;;33762:9;33756:4;33752:20;33748:1;33737:9;33733:17;33726:47;33790:131;33916:4;33790:131;:::i;:::-;33782:139;;33680:248;;;:::o;33934:419::-;;34138:2;34127:9;34123:18;34115:26;;34187:9;34181:4;34177:20;34173:1;34162:9;34158:17;34151:47;34215:131;34341:4;34215:131;:::i;:::-;34207:139;;34105:248;;;:::o;34359:419::-;;34563:2;34552:9;34548:18;34540:26;;34612:9;34606:4;34602:20;34598:1;34587:9;34583:17;34576:47;34640:131;34766:4;34640:131;:::i;:::-;34632:139;;34530:248;;;:::o;34784:419::-;;34988:2;34977:9;34973:18;34965:26;;35037:9;35031:4;35027:20;35023:1;35012:9;35008:17;35001:47;35065:131;35191:4;35065:131;:::i;:::-;35057:139;;34955:248;;;:::o;35209:419::-;;35413:2;35402:9;35398:18;35390:26;;35462:9;35456:4;35452:20;35448:1;35437:9;35433:17;35426:47;35490:131;35616:4;35490:131;:::i;:::-;35482:139;;35380:248;;;:::o;35634:419::-;;35838:2;35827:9;35823:18;35815:26;;35887:9;35881:4;35877:20;35873:1;35862:9;35858:17;35851:47;35915:131;36041:4;35915:131;:::i;:::-;35907:139;;35805:248;;;:::o;36059:222::-;;36190:2;36179:9;36175:18;36167:26;;36203:71;36271:1;36260:9;36256:17;36247:6;36203:71;:::i;:::-;36157:124;;;;:::o;36287:283::-;;36353:2;36347:9;36337:19;;36395:4;36387:6;36383:17;36502:6;36490:10;36487:22;36466:18;36454:10;36451:34;36448:62;36445:2;;;36513:18;;:::i;:::-;36445:2;36553:10;36549:2;36542:22;36327:243;;;;:::o;36576:331::-;;36727:18;36719:6;36716:30;36713:2;;;36749:18;;:::i;:::-;36713:2;36834:4;36830:9;36823:4;36815:6;36811:17;36807:33;36799:41;;36895:4;36889;36885:15;36877:23;;36642:265;;;:::o;36913:332::-;;37065:18;37057:6;37054:30;37051:2;;;37087:18;;:::i;:::-;37051:2;37172:4;37168:9;37161:4;37153:6;37149:17;37145:33;37137:41;;37233:4;37227;37223:15;37215:23;;36980:265;;;:::o;37251:98::-;;37336:5;37330:12;37320:22;;37309:40;;;:::o;37355:99::-;;37441:5;37435:12;37425:22;;37414:40;;;:::o;37460:168::-;;37577:6;37572:3;37565:19;37617:4;37612:3;37608:14;37593:29;;37555:73;;;;:::o;37634:169::-;;37752:6;37747:3;37740:19;37792:4;37787:3;37783:14;37768:29;;37730:73;;;;:::o;37809:148::-;;37948:3;37933:18;;37923:34;;;;:::o;37963:305::-;;38022:20;38040:1;38022:20;:::i;:::-;38017:25;;38056:20;38074:1;38056:20;:::i;:::-;38051:25;;38210:1;38142:66;38138:74;38135:1;38132:81;38129:2;;;38216:18;;:::i;:::-;38129:2;38260:1;38257;38253:9;38246:16;;38007:261;;;;:::o;38274:348::-;;38337:20;38355:1;38337:20;:::i;:::-;38332:25;;38371:20;38389:1;38371:20;:::i;:::-;38366:25;;38559:1;38491:66;38487:74;38484:1;38481:81;38476:1;38469:9;38462:17;38458:105;38455:2;;;38566:18;;:::i;:::-;38455:2;38614:1;38611;38607:9;38596:20;;38322:300;;;;:::o;38628:191::-;;38688:20;38706:1;38688:20;:::i;:::-;38683:25;;38722:20;38740:1;38722:20;:::i;:::-;38717:25;;38761:1;38758;38755:8;38752:2;;;38766:18;;:::i;:::-;38752:2;38811:1;38808;38804:9;38796:17;;38673:146;;;;:::o;38825:96::-;;38891:24;38909:5;38891:24;:::i;:::-;38880:35;;38870:51;;;:::o;38927:90::-;;39004:5;38997:13;38990:21;38979:32;;38969:48;;;:::o;39023:77::-;;39089:5;39078:16;;39068:32;;;:::o;39106:149::-;;39182:66;39175:5;39171:78;39160:89;;39150:105;;;:::o;39261:126::-;;39338:42;39331:5;39327:54;39316:65;;39306:81;;;:::o;39393:77::-;;39459:5;39448:16;;39438:32;;;:::o;39476:154::-;39560:6;39555:3;39550;39537:30;39622:1;39613:6;39608:3;39604:16;39597:27;39527:103;;;:::o;39636:307::-;39704:1;39714:113;39728:6;39725:1;39722:13;39714:113;;;39813:1;39808:3;39804:11;39798:18;39794:1;39789:3;39785:11;39778:39;39750:2;39747:1;39743:10;39738:15;;39714:113;;;39845:6;39842:1;39839:13;39836:2;;;39925:1;39916:6;39911:3;39907:16;39900:27;39836:2;39685:258;;;;:::o;39949:171::-;;40011:24;40029:5;40011:24;:::i;:::-;40002:33;;40057:4;40050:5;40047:15;40044:2;;;40065:18;;:::i;:::-;40044:2;40112:1;40105:5;40101:13;40094:20;;39992:128;;;:::o;40126:320::-;;40207:1;40201:4;40197:12;40187:22;;40254:1;40248:4;40244:12;40275:18;40265:2;;40331:4;40323:6;40319:17;40309:27;;40265:2;40393;40385:6;40382:14;40362:18;40359:38;40356:2;;;40412:18;;:::i;:::-;40356:2;40177:269;;;;:::o;40452:180::-;40500:77;40497:1;40490:88;40597:4;40594:1;40587:15;40621:4;40618:1;40611:15;40638:180;40686:77;40683:1;40676:88;40783:4;40780:1;40773:15;40807:4;40804:1;40797:15;40824:180;40872:77;40869:1;40862:88;40969:4;40966:1;40959:15;40993:4;40990:1;40983:15;41010:102;;41102:2;41098:7;41093:2;41086:5;41082:14;41078:28;41068:38;;41058:54;;;:::o;41118:122::-;41191:24;41209:5;41191:24;:::i;:::-;41184:5;41181:35;41171:2;;41230:1;41227;41220:12;41171:2;41161:79;:::o;41246:116::-;41316:21;41331:5;41316:21;:::i;:::-;41309:5;41306:32;41296:2;;41352:1;41349;41342:12;41296:2;41286:76;:::o;41368:122::-;41441:24;41459:5;41441:24;:::i;:::-;41434:5;41431:35;41421:2;;41480:1;41477;41470:12;41421:2;41411:79;:::o;41496:120::-;41568:23;41585:5;41568:23;:::i;:::-;41561:5;41558:34;41548:2;;41606:1;41603;41596:12;41548:2;41538:78;:::o;41622:122::-;41695:24;41713:5;41695:24;:::i;:::-;41688:5;41685:35;41675:2;;41734:1;41731;41724:12;41675:2;41665:79;:::o

Swarm Source

ipfs://97522b25adca279b8022173f9412dae10984aacdf9d0f421c68d6c9eae97bd66
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.