ETH Price: $3,390.20 (-1.52%)
Gas: 2 Gwei

Token

Ethnology: Series 1 (ETHNOS S1)
 

Overview

Max Total Supply

822 ETHNOS S1

Holders

276

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 ETHNOS S1
0xd09be3296fba19f337a67487ccd6f0b7b3faffe1
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:
SeriesOne

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-21
*/

// hevm: flattened sources of src/SeriesOne.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

////// lib/openzeppelin-contracts/contracts/utils/Context.sol

/* pragma solidity ^0.8.0; */

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

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

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol

/* pragma solidity ^0.8.0; */

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

////// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol

/* pragma solidity ^0.8.0; */

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

////// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol

/* pragma solidity ^0.8.0; */

/* import "../../utils/introspection/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;
}

////// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol

/* pragma solidity ^0.8.0; */

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

////// lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

////// lib/openzeppelin-contracts/contracts/utils/Address.sol

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/utils/Strings.sol

/* pragma solidity ^0.8.0; */

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol

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

////// lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol

/* pragma solidity ^0.8.0; */

/* import "./IERC721.sol"; */
/* import "./IERC721Receiver.sol"; */
/* import "./extensions/IERC721Metadata.sol"; */
/* import "../../utils/Address.sol"; */
/* import "../../utils/Context.sol"; */
/* import "../../utils/Strings.sol"; */
/* import "../../utils/introspection/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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

////// src/SeriesOne.sol
/* pragma solidity ^0.8.0; */

/* import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; */
/* import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; */
/* import "@openzeppelin/contracts/access/Ownable.sol"; */

interface IERC1155 {
    function burn(
        address,
        uint256,
        uint256
    ) external;
}

contract SeriesOne is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;

    address public constant PASS = 0x819cE9C4e15258735F441000cD005643D4479A1E;
    uint256 public constant PASSID = 1;

    uint256 public constant MAX_SUPPLY = 2949;
    uint256 public totalSupply;
    uint256 internal nonce = 0;
    uint256[MAX_SUPPLY] private indices;

    string internal baseURISpecial;

    constructor() ERC721("Ethnology: Series 1", "ETHNOS S1") {
        _mint(msg.sender, 11111);
        _mint(msg.sender, 22222);
        _mint(msg.sender, 33333);
        _mint(msg.sender, 44444);
        _mint(msg.sender, 55555);
        totalSupply = 5;
    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://QmSeaZmmX1SLP7LquqTCombPwwWVaLFNK3Q2nnmmhicbR5/";
    }

    function setSpecialURI(string calldata _uri) external onlyOwner {
        baseURISpecial = _uri;
    }

    function _baseURISecial() internal view returns (string memory) {
        return baseURISpecial;
    }

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

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

    /// Minter Function ///

    function mint(uint256 amount) external nonReentrant {
        require(amount <= 25, "too many");
        IERC1155(PASS).burn(msg.sender, PASSID, amount);
        for (uint256 x = 0; x < amount; x++) {
            _mint(msg.sender, _getRandomId());
            totalSupply++;
        }
    }

    function _getRandomId() internal returns (uint256) {
        uint256 totalSize = MAX_SUPPLY - totalSupply - 5;
        uint256 index = uint256(
            keccak256(
                abi.encodePacked(
                    nonce,
                    "EthnologySeries1Salt",
                    blockhash(block.number),
                    msg.sender,
                    block.difficulty,
                    block.timestamp,
                    gasleft()
                )
            )
        ) % totalSize;

        uint256 value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }

        if (indices[totalSize - 1] == 0) {
            indices[index] = totalSize - 1;
        } else {
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        return value;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASSID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"_uri","type":"string"}],"name":"setSpecialURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006009553480156200001657600080fd5b506040518060400160405280601381526020017f4574686e6f6c6f67793a205365726965732031000000000000000000000000008152506040518060400160405280600981526020017f4554484e4f53205331000000000000000000000000000000000000000000000081525081600090805190602001906200009b92919062000476565b508060019080519060200190620000b492919062000476565b505050620000d7620000cb6200015160201b60201c565b6200015960201b60201c565b6001600781905550620000f333612b676200021f60201b60201c565b62000107336156ce6200021f60201b60201c565b6200011b336182356200021f60201b60201c565b6200012f3361ad9c6200021f60201b60201c565b620001433361d9036200021f60201b60201c565b600560088190555062000716565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000596565b60405180910390fd5b620002a3816200040560201b60201c565b15620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000574565b60405180910390fd5b620002fa600083836200047160201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200034c9190620005c9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b828054620004849062000630565b90600052602060002090601f016020900481019282620004a85760008555620004f4565b82601f10620004c357805160ff1916838001178555620004f4565b82800160010185558215620004f4579182015b82811115620004f3578251825591602001919060010190620004d6565b5b50905062000503919062000507565b5090565b5b808211156200052257600081600090555060010162000508565b5090565b600062000535601c83620005b8565b91506200054282620006c4565b602082019050919050565b60006200055c602083620005b8565b91506200056982620006ed565b602082019050919050565b600060208201905081810360008301526200058f8162000526565b9050919050565b60006020820190508181036000830152620005b1816200054d565b9050919050565b600082825260208201905092915050565b6000620005d68262000626565b9150620005e38362000626565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200061b576200061a62000666565b5b828201905092915050565b6000819050919050565b600060028204905060018216806200064957607f821691505b6020821081141562000660576200065f62000695565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6133c980620007266000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb46514610351578063b88d4fde1461036d578063c87b56dd14610389578063cfbbbd9e146103b9578063e985e9c5146103d7578063f2fde38b1461040757610142565b806370a08231146102bf578063715018a6146102ef5780638da5cb5b146102f957806395d89b4114610317578063a0712d681461033557610142565b80631f8449a31161010a5780631f8449a3146101ff57806323b872dd1461021d5780632c4ef27e1461023957806332cb6b0c1461025557806342842e0e146102735780636352211e1461028f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612130565b610423565b60405161016e919061271d565b60405180910390f35b61017f610505565b60405161018c9190612738565b60405180910390f35b6101af60048036038101906101aa91906121d7565b610597565b6040516101bc919061267f565b60405180910390f35b6101df60048036038101906101da91906120f0565b61061c565b005b6101e9610734565b6040516101f6919061299a565b60405180910390f35b61020761073a565b604051610214919061299a565b60405180910390f35b61023760048036038101906102329190611fda565b61073f565b005b610253600480360381019061024e919061218a565b61079f565b005b61025d610832565b60405161026a919061299a565b60405180910390f35b61028d60048036038101906102889190611fda565b610838565b005b6102a960048036038101906102a491906121d7565b610858565b6040516102b6919061267f565b60405180910390f35b6102d960048036038101906102d49190611f6d565b61090a565b6040516102e6919061299a565b60405180910390f35b6102f76109c2565b005b610301610a4a565b60405161030e919061267f565b60405180910390f35b61031f610a74565b60405161032c9190612738565b60405180910390f35b61034f600480360381019061034a91906121d7565b610b06565b005b61036b600480360381019061036691906120b0565b610c6f565b005b6103876004803603810190610382919061202d565b610df0565b005b6103a3600480360381019061039e91906121d7565b610e52565b6040516103b09190612738565b60405180910390f35b6103c1610f15565b6040516103ce919061267f565b60405180910390f35b6103f160048036038101906103ec9190611f9a565b610f2d565b6040516103fe919061271d565b60405180910390f35b610421600480360381019061041c9190611f6d565b610fc1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104fe57506104fd826110b9565b5b9050919050565b60606000805461051490612bc9565b80601f016020809104026020016040519081016040528092919081815260200182805461054090612bc9565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905090565b60006105a282611123565b6105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d89061289a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062782610858565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068f9061293a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b761118f565b73ffffffffffffffffffffffffffffffffffffffff1614806106e657506106e5816106e061118f565b610f2d565b5b610725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071c9061281a565b60405180910390fd5b61072f8383611197565b505050565b60085481565b600181565b61075061074a61118f565b82611250565b61078f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107869061295a565b60405180910390fd5b61079a83838361132e565b505050565b6107a761118f565b73ffffffffffffffffffffffffffffffffffffffff166107c5610a4a565b73ffffffffffffffffffffffffffffffffffffffff161461081b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610812906128ba565b60405180910390fd5b8181610b8f919061082d929190611d9b565b505050565b610b8581565b61085383838360405180602001604052806000815250610df0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f89061285a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561097b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109729061283a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109ca61118f565b73ffffffffffffffffffffffffffffffffffffffff166109e8610a4a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a35906128ba565b60405180910390fd5b610a48600061158a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a8390612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612bc9565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b60026007541415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061297a565b60405180910390fd5b60026007819055506019811115610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f9061291a565b60405180910390fd5b73819ce9c4e15258735f441000cd005643d4479a1e73ffffffffffffffffffffffffffffffffffffffff1663f5298aca336001846040518463ffffffff1660e01b8152600401610bea939291906126e6565b600060405180830381600087803b158015610c0457600080fd5b505af1158015610c18573d6000803e3d6000fd5b5050505060005b81811015610c6357610c3833610c33611650565b6117ae565b60086000815480929190610c4b90612c2c565b91905055508080610c5b90612c2c565b915050610c1f565b50600160078190555050565b610c7761118f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc906127da565b60405180910390fd5b8060056000610cf261118f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d9f61118f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610de4919061271d565b60405180910390a35050565b610e01610dfb61118f565b83611250565b610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e379061295a565b60405180910390fd5b610e4c8484848461197c565b50505050565b6060610e5d82611123565b610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e93906128fa565b60405180910390fd5b6060610b868310610eb757610eaf6119d8565b905080610ec3565b610ebf611a6b565b9050805b506000815111610ee25760405180602001604052806000815250610f0d565b80610eec84611a8b565b604051602001610efd9291906125d5565b6040516020818303038152906040525b915050919050565b73819ce9c4e15258735f441000cd005643d4479a1e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610fc961118f565b73ffffffffffffffffffffffffffffffffffffffff16610fe7610a4a565b73ffffffffffffffffffffffffffffffffffffffff161461103d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611034906128ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061277a565b60405180910390fd5b6110b68161158a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661120a83610858565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061125b82611123565b61129a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611291906127fa565b60405180910390fd5b60006112a583610858565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061131457508373ffffffffffffffffffffffffffffffffffffffff166112fc84610597565b73ffffffffffffffffffffffffffffffffffffffff16145b8061132557506113248185610f2d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661134e82610858565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b906128da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906127ba565b60405180910390fd5b61141f838383611bec565b61142a600082611197565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461147a9190612ad5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d19190612a4e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806005600854610b856116659190612ad5565b61166f9190612ad5565b905060008160095443403344425a60405160200161169296959493929190612604565b6040516020818303038152906040528051906020012060001c6116b59190612cad565b9050600080600a83610b8581106116cf576116ce612d6b565b5b0154146116f457600a82610b8581106116eb576116ea612d6b565b5b015490506116f8565b8190505b6000600a6001856117099190612ad5565b610b85811061171b5761171a612d6b565b5b0154141561174f576001836117309190612ad5565b600a83610b85811061174557611744612d6b565b5b018190555061178d565b600a60018461175e9190612ad5565b610b8581106117705761176f612d6b565b5b0154600a83610b85811061178757611786612d6b565b5b01819055505b600960008154809291906117a090612c2c565b919050555080935050505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118159061287a565b60405180910390fd5b61182781611123565b15611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e9061279a565b60405180910390fd5b61187360008383611bec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c39190612a4e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61198784848461132e565b61199384848484611bf1565b6119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061275a565b60405180910390fd5b50505050565b6060610b8f80546119e890612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1490612bc9565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b5050505050905090565b606060405180606001604052806036815260200161335e60369139905090565b60606000821415611ad3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611be7565b600082905060005b60008214611b05578080611aee90612c2c565b915050600a82611afe9190612aa4565b9150611adb565b60008167ffffffffffffffff811115611b2157611b20612d9a565b5b6040519080825280601f01601f191660200182016040528015611b535781602001600182028036833780820191505090505b5090505b60008514611be057600182611b6c9190612ad5565b9150600a85611b7b9190612cad565b6030611b879190612a4e565b60f81b818381518110611b9d57611b9c612d6b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bd99190612aa4565b9450611b57565b8093505050505b919050565b505050565b6000611c128473ffffffffffffffffffffffffffffffffffffffff16611d88565b15611d7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c3b61118f565b8786866040518563ffffffff1660e01b8152600401611c5d949392919061269a565b602060405180830381600087803b158015611c7757600080fd5b505af1925050508015611ca857506040513d601f19601f82011682018060405250810190611ca5919061215d565b60015b611d2b573d8060008114611cd8576040519150601f19603f3d011682016040523d82523d6000602084013e611cdd565b606091505b50600081511415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a9061275a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d80565b600190505b949350505050565b600080823b905060008111915050919050565b828054611da790612bc9565b90600052602060002090601f016020900481019282611dc95760008555611e10565b82601f10611de257803560ff1916838001178555611e10565b82800160010185558215611e10579182015b82811115611e0f578235825591602001919060010190611df4565b5b509050611e1d9190611e21565b5090565b5b80821115611e3a576000816000905550600101611e22565b5090565b6000611e51611e4c846129da565b6129b5565b905082815260208101848484011115611e6d57611e6c612dd8565b5b611e78848285612b87565b509392505050565b600081359050611e8f81613301565b92915050565b600081359050611ea481613318565b92915050565b600081359050611eb98161332f565b92915050565b600081519050611ece8161332f565b92915050565b600082601f830112611ee957611ee8612dce565b5b8135611ef9848260208601611e3e565b91505092915050565b60008083601f840112611f1857611f17612dce565b5b8235905067ffffffffffffffff811115611f3557611f34612dc9565b5b602083019150836001820283011115611f5157611f50612dd3565b5b9250929050565b600081359050611f6781613346565b92915050565b600060208284031215611f8357611f82612de2565b5b6000611f9184828501611e80565b91505092915050565b60008060408385031215611fb157611fb0612de2565b5b6000611fbf85828601611e80565b9250506020611fd085828601611e80565b9150509250929050565b600080600060608486031215611ff357611ff2612de2565b5b600061200186828701611e80565b935050602061201286828701611e80565b925050604061202386828701611f58565b9150509250925092565b6000806000806080858703121561204757612046612de2565b5b600061205587828801611e80565b945050602061206687828801611e80565b935050604061207787828801611f58565b925050606085013567ffffffffffffffff81111561209857612097612ddd565b5b6120a487828801611ed4565b91505092959194509250565b600080604083850312156120c7576120c6612de2565b5b60006120d585828601611e80565b92505060206120e685828601611e95565b9150509250929050565b6000806040838503121561210757612106612de2565b5b600061211585828601611e80565b925050602061212685828601611f58565b9150509250929050565b60006020828403121561214657612145612de2565b5b600061215484828501611eaa565b91505092915050565b60006020828403121561217357612172612de2565b5b600061218184828501611ebf565b91505092915050565b600080602083850312156121a1576121a0612de2565b5b600083013567ffffffffffffffff8111156121bf576121be612ddd565b5b6121cb85828601611f02565b92509250509250929050565b6000602082840312156121ed576121ec612de2565b5b60006121fb84828501611f58565b91505092915050565b61220d81612b09565b82525050565b61222461221f82612b09565b612c75565b82525050565b61223381612b1b565b82525050565b61224a61224582612b27565b612c87565b82525050565b600061225b82612a0b565b6122658185612a21565b9350612275818560208601612b96565b61227e81612de7565b840191505092915050565b600061229482612a16565b61229e8185612a32565b93506122ae818560208601612b96565b6122b781612de7565b840191505092915050565b60006122cd82612a16565b6122d78185612a43565b93506122e7818560208601612b96565b80840191505092915050565b6000612300603283612a32565b915061230b82612e05565b604082019050919050565b6000612323602683612a32565b915061232e82612e54565b604082019050919050565b6000612346601c83612a32565b915061235182612ea3565b602082019050919050565b6000612369602483612a32565b915061237482612ecc565b604082019050919050565b600061238c601983612a32565b915061239782612f1b565b602082019050919050565b60006123af602c83612a32565b91506123ba82612f44565b604082019050919050565b60006123d2601483612a43565b91506123dd82612f93565b601482019050919050565b60006123f5603883612a32565b915061240082612fbc565b604082019050919050565b6000612418602a83612a32565b91506124238261300b565b604082019050919050565b600061243b602983612a32565b91506124468261305a565b604082019050919050565b600061245e602083612a32565b9150612469826130a9565b602082019050919050565b6000612481602c83612a32565b915061248c826130d2565b604082019050919050565b60006124a4600583612a43565b91506124af82613121565b600582019050919050565b60006124c7602083612a32565b91506124d28261314a565b602082019050919050565b60006124ea602983612a32565b91506124f582613173565b604082019050919050565b600061250d602f83612a32565b9150612518826131c2565b604082019050919050565b6000612530600883612a32565b915061253b82613211565b602082019050919050565b6000612553602183612a32565b915061255e8261323a565b604082019050919050565b6000612576603183612a32565b915061258182613289565b604082019050919050565b6000612599601f83612a32565b91506125a4826132d8565b602082019050919050565b6125b881612b7d565b82525050565b6125cf6125ca82612b7d565b612ca3565b82525050565b60006125e182856122c2565b91506125ed82846122c2565b91506125f882612497565b91508190509392505050565b600061261082896125be565b60208201915061261f826123c5565b915061262b8288612239565b60208201915061263b8287612213565b60148201915061264b82866125be565b60208201915061265b82856125be565b60208201915061266b82846125be565b602082019150819050979650505050505050565b60006020820190506126946000830184612204565b92915050565b60006080820190506126af6000830187612204565b6126bc6020830186612204565b6126c960408301856125af565b81810360608301526126db8184612250565b905095945050505050565b60006060820190506126fb6000830186612204565b61270860208301856125af565b61271560408301846125af565b949350505050565b6000602082019050612732600083018461222a565b92915050565b600060208201905081810360008301526127528184612289565b905092915050565b60006020820190508181036000830152612773816122f3565b9050919050565b6000602082019050818103600083015261279381612316565b9050919050565b600060208201905081810360008301526127b381612339565b9050919050565b600060208201905081810360008301526127d38161235c565b9050919050565b600060208201905081810360008301526127f38161237f565b9050919050565b60006020820190508181036000830152612813816123a2565b9050919050565b60006020820190508181036000830152612833816123e8565b9050919050565b600060208201905081810360008301526128538161240b565b9050919050565b600060208201905081810360008301526128738161242e565b9050919050565b6000602082019050818103600083015261289381612451565b9050919050565b600060208201905081810360008301526128b381612474565b9050919050565b600060208201905081810360008301526128d3816124ba565b9050919050565b600060208201905081810360008301526128f3816124dd565b9050919050565b6000602082019050818103600083015261291381612500565b9050919050565b6000602082019050818103600083015261293381612523565b9050919050565b6000602082019050818103600083015261295381612546565b9050919050565b6000602082019050818103600083015261297381612569565b9050919050565b600060208201905081810360008301526129938161258c565b9050919050565b60006020820190506129af60008301846125af565b92915050565b60006129bf6129d0565b90506129cb8282612bfb565b919050565b6000604051905090565b600067ffffffffffffffff8211156129f5576129f4612d9a565b5b6129fe82612de7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a5982612b7d565b9150612a6483612b7d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a9957612a98612cde565b5b828201905092915050565b6000612aaf82612b7d565b9150612aba83612b7d565b925082612aca57612ac9612d0d565b5b828204905092915050565b6000612ae082612b7d565b9150612aeb83612b7d565b925082821015612afe57612afd612cde565b5b828203905092915050565b6000612b1482612b5d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612bb4578082015181840152602081019050612b99565b83811115612bc3576000848401525b50505050565b60006002820490506001821680612be157607f821691505b60208210811415612bf557612bf4612d3c565b5b50919050565b612c0482612de7565b810181811067ffffffffffffffff82111715612c2357612c22612d9a565b5b80604052505050565b6000612c3782612b7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c6a57612c69612cde565b5b600182019050919050565b6000612c8082612c91565b9050919050565b6000819050919050565b6000612c9c82612df8565b9050919050565b6000819050919050565b6000612cb882612b7d565b9150612cc383612b7d565b925082612cd357612cd2612d0d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686e6f6c6f67795365726965733153616c74000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f746f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61330a81612b09565b811461331557600080fd5b50565b61332181612b1b565b811461332c57600080fd5b50565b61333881612b31565b811461334357600080fd5b50565b61334f81612b7d565b811461335a57600080fd5b5056fe697066733a2f2f516d5365615a6d6d5831534c50374c71757154436f6d625077775756614c464e4b3351326e6e6d6d6869636252352fa26469706673582212204d53cf06aa580a7a968d469497131cdfd5679329008b0b371e82ffa301b693b364736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb46514610351578063b88d4fde1461036d578063c87b56dd14610389578063cfbbbd9e146103b9578063e985e9c5146103d7578063f2fde38b1461040757610142565b806370a08231146102bf578063715018a6146102ef5780638da5cb5b146102f957806395d89b4114610317578063a0712d681461033557610142565b80631f8449a31161010a5780631f8449a3146101ff57806323b872dd1461021d5780632c4ef27e1461023957806332cb6b0c1461025557806342842e0e146102735780636352211e1461028f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612130565b610423565b60405161016e919061271d565b60405180910390f35b61017f610505565b60405161018c9190612738565b60405180910390f35b6101af60048036038101906101aa91906121d7565b610597565b6040516101bc919061267f565b60405180910390f35b6101df60048036038101906101da91906120f0565b61061c565b005b6101e9610734565b6040516101f6919061299a565b60405180910390f35b61020761073a565b604051610214919061299a565b60405180910390f35b61023760048036038101906102329190611fda565b61073f565b005b610253600480360381019061024e919061218a565b61079f565b005b61025d610832565b60405161026a919061299a565b60405180910390f35b61028d60048036038101906102889190611fda565b610838565b005b6102a960048036038101906102a491906121d7565b610858565b6040516102b6919061267f565b60405180910390f35b6102d960048036038101906102d49190611f6d565b61090a565b6040516102e6919061299a565b60405180910390f35b6102f76109c2565b005b610301610a4a565b60405161030e919061267f565b60405180910390f35b61031f610a74565b60405161032c9190612738565b60405180910390f35b61034f600480360381019061034a91906121d7565b610b06565b005b61036b600480360381019061036691906120b0565b610c6f565b005b6103876004803603810190610382919061202d565b610df0565b005b6103a3600480360381019061039e91906121d7565b610e52565b6040516103b09190612738565b60405180910390f35b6103c1610f15565b6040516103ce919061267f565b60405180910390f35b6103f160048036038101906103ec9190611f9a565b610f2d565b6040516103fe919061271d565b60405180910390f35b610421600480360381019061041c9190611f6d565b610fc1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104fe57506104fd826110b9565b5b9050919050565b60606000805461051490612bc9565b80601f016020809104026020016040519081016040528092919081815260200182805461054090612bc9565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905090565b60006105a282611123565b6105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d89061289a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062782610858565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068f9061293a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b761118f565b73ffffffffffffffffffffffffffffffffffffffff1614806106e657506106e5816106e061118f565b610f2d565b5b610725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071c9061281a565b60405180910390fd5b61072f8383611197565b505050565b60085481565b600181565b61075061074a61118f565b82611250565b61078f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107869061295a565b60405180910390fd5b61079a83838361132e565b505050565b6107a761118f565b73ffffffffffffffffffffffffffffffffffffffff166107c5610a4a565b73ffffffffffffffffffffffffffffffffffffffff161461081b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610812906128ba565b60405180910390fd5b8181610b8f919061082d929190611d9b565b505050565b610b8581565b61085383838360405180602001604052806000815250610df0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f89061285a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561097b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109729061283a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109ca61118f565b73ffffffffffffffffffffffffffffffffffffffff166109e8610a4a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a35906128ba565b60405180910390fd5b610a48600061158a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a8390612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612bc9565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b60026007541415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061297a565b60405180910390fd5b60026007819055506019811115610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f9061291a565b60405180910390fd5b73819ce9c4e15258735f441000cd005643d4479a1e73ffffffffffffffffffffffffffffffffffffffff1663f5298aca336001846040518463ffffffff1660e01b8152600401610bea939291906126e6565b600060405180830381600087803b158015610c0457600080fd5b505af1158015610c18573d6000803e3d6000fd5b5050505060005b81811015610c6357610c3833610c33611650565b6117ae565b60086000815480929190610c4b90612c2c565b91905055508080610c5b90612c2c565b915050610c1f565b50600160078190555050565b610c7761118f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc906127da565b60405180910390fd5b8060056000610cf261118f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d9f61118f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610de4919061271d565b60405180910390a35050565b610e01610dfb61118f565b83611250565b610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e379061295a565b60405180910390fd5b610e4c8484848461197c565b50505050565b6060610e5d82611123565b610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e93906128fa565b60405180910390fd5b6060610b868310610eb757610eaf6119d8565b905080610ec3565b610ebf611a6b565b9050805b506000815111610ee25760405180602001604052806000815250610f0d565b80610eec84611a8b565b604051602001610efd9291906125d5565b6040516020818303038152906040525b915050919050565b73819ce9c4e15258735f441000cd005643d4479a1e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610fc961118f565b73ffffffffffffffffffffffffffffffffffffffff16610fe7610a4a565b73ffffffffffffffffffffffffffffffffffffffff161461103d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611034906128ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061277a565b60405180910390fd5b6110b68161158a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661120a83610858565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061125b82611123565b61129a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611291906127fa565b60405180910390fd5b60006112a583610858565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061131457508373ffffffffffffffffffffffffffffffffffffffff166112fc84610597565b73ffffffffffffffffffffffffffffffffffffffff16145b8061132557506113248185610f2d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661134e82610858565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b906128da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906127ba565b60405180910390fd5b61141f838383611bec565b61142a600082611197565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461147a9190612ad5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114d19190612a4e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806005600854610b856116659190612ad5565b61166f9190612ad5565b905060008160095443403344425a60405160200161169296959493929190612604565b6040516020818303038152906040528051906020012060001c6116b59190612cad565b9050600080600a83610b8581106116cf576116ce612d6b565b5b0154146116f457600a82610b8581106116eb576116ea612d6b565b5b015490506116f8565b8190505b6000600a6001856117099190612ad5565b610b85811061171b5761171a612d6b565b5b0154141561174f576001836117309190612ad5565b600a83610b85811061174557611744612d6b565b5b018190555061178d565b600a60018461175e9190612ad5565b610b8581106117705761176f612d6b565b5b0154600a83610b85811061178757611786612d6b565b5b01819055505b600960008154809291906117a090612c2c565b919050555080935050505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118159061287a565b60405180910390fd5b61182781611123565b15611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e9061279a565b60405180910390fd5b61187360008383611bec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c39190612a4e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61198784848461132e565b61199384848484611bf1565b6119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061275a565b60405180910390fd5b50505050565b6060610b8f80546119e890612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1490612bc9565b8015611a615780601f10611a3657610100808354040283529160200191611a61565b820191906000526020600020905b815481529060010190602001808311611a4457829003601f168201915b5050505050905090565b606060405180606001604052806036815260200161335e60369139905090565b60606000821415611ad3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611be7565b600082905060005b60008214611b05578080611aee90612c2c565b915050600a82611afe9190612aa4565b9150611adb565b60008167ffffffffffffffff811115611b2157611b20612d9a565b5b6040519080825280601f01601f191660200182016040528015611b535781602001600182028036833780820191505090505b5090505b60008514611be057600182611b6c9190612ad5565b9150600a85611b7b9190612cad565b6030611b879190612a4e565b60f81b818381518110611b9d57611b9c612d6b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bd99190612aa4565b9450611b57565b8093505050505b919050565b505050565b6000611c128473ffffffffffffffffffffffffffffffffffffffff16611d88565b15611d7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c3b61118f565b8786866040518563ffffffff1660e01b8152600401611c5d949392919061269a565b602060405180830381600087803b158015611c7757600080fd5b505af1925050508015611ca857506040513d601f19601f82011682018060405250810190611ca5919061215d565b60015b611d2b573d8060008114611cd8576040519150601f19603f3d011682016040523d82523d6000602084013e611cdd565b606091505b50600081511415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a9061275a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d80565b600190505b949350505050565b600080823b905060008111915050919050565b828054611da790612bc9565b90600052602060002090601f016020900481019282611dc95760008555611e10565b82601f10611de257803560ff1916838001178555611e10565b82800160010185558215611e10579182015b82811115611e0f578235825591602001919060010190611df4565b5b509050611e1d9190611e21565b5090565b5b80821115611e3a576000816000905550600101611e22565b5090565b6000611e51611e4c846129da565b6129b5565b905082815260208101848484011115611e6d57611e6c612dd8565b5b611e78848285612b87565b509392505050565b600081359050611e8f81613301565b92915050565b600081359050611ea481613318565b92915050565b600081359050611eb98161332f565b92915050565b600081519050611ece8161332f565b92915050565b600082601f830112611ee957611ee8612dce565b5b8135611ef9848260208601611e3e565b91505092915050565b60008083601f840112611f1857611f17612dce565b5b8235905067ffffffffffffffff811115611f3557611f34612dc9565b5b602083019150836001820283011115611f5157611f50612dd3565b5b9250929050565b600081359050611f6781613346565b92915050565b600060208284031215611f8357611f82612de2565b5b6000611f9184828501611e80565b91505092915050565b60008060408385031215611fb157611fb0612de2565b5b6000611fbf85828601611e80565b9250506020611fd085828601611e80565b9150509250929050565b600080600060608486031215611ff357611ff2612de2565b5b600061200186828701611e80565b935050602061201286828701611e80565b925050604061202386828701611f58565b9150509250925092565b6000806000806080858703121561204757612046612de2565b5b600061205587828801611e80565b945050602061206687828801611e80565b935050604061207787828801611f58565b925050606085013567ffffffffffffffff81111561209857612097612ddd565b5b6120a487828801611ed4565b91505092959194509250565b600080604083850312156120c7576120c6612de2565b5b60006120d585828601611e80565b92505060206120e685828601611e95565b9150509250929050565b6000806040838503121561210757612106612de2565b5b600061211585828601611e80565b925050602061212685828601611f58565b9150509250929050565b60006020828403121561214657612145612de2565b5b600061215484828501611eaa565b91505092915050565b60006020828403121561217357612172612de2565b5b600061218184828501611ebf565b91505092915050565b600080602083850312156121a1576121a0612de2565b5b600083013567ffffffffffffffff8111156121bf576121be612ddd565b5b6121cb85828601611f02565b92509250509250929050565b6000602082840312156121ed576121ec612de2565b5b60006121fb84828501611f58565b91505092915050565b61220d81612b09565b82525050565b61222461221f82612b09565b612c75565b82525050565b61223381612b1b565b82525050565b61224a61224582612b27565b612c87565b82525050565b600061225b82612a0b565b6122658185612a21565b9350612275818560208601612b96565b61227e81612de7565b840191505092915050565b600061229482612a16565b61229e8185612a32565b93506122ae818560208601612b96565b6122b781612de7565b840191505092915050565b60006122cd82612a16565b6122d78185612a43565b93506122e7818560208601612b96565b80840191505092915050565b6000612300603283612a32565b915061230b82612e05565b604082019050919050565b6000612323602683612a32565b915061232e82612e54565b604082019050919050565b6000612346601c83612a32565b915061235182612ea3565b602082019050919050565b6000612369602483612a32565b915061237482612ecc565b604082019050919050565b600061238c601983612a32565b915061239782612f1b565b602082019050919050565b60006123af602c83612a32565b91506123ba82612f44565b604082019050919050565b60006123d2601483612a43565b91506123dd82612f93565b601482019050919050565b60006123f5603883612a32565b915061240082612fbc565b604082019050919050565b6000612418602a83612a32565b91506124238261300b565b604082019050919050565b600061243b602983612a32565b91506124468261305a565b604082019050919050565b600061245e602083612a32565b9150612469826130a9565b602082019050919050565b6000612481602c83612a32565b915061248c826130d2565b604082019050919050565b60006124a4600583612a43565b91506124af82613121565b600582019050919050565b60006124c7602083612a32565b91506124d28261314a565b602082019050919050565b60006124ea602983612a32565b91506124f582613173565b604082019050919050565b600061250d602f83612a32565b9150612518826131c2565b604082019050919050565b6000612530600883612a32565b915061253b82613211565b602082019050919050565b6000612553602183612a32565b915061255e8261323a565b604082019050919050565b6000612576603183612a32565b915061258182613289565b604082019050919050565b6000612599601f83612a32565b91506125a4826132d8565b602082019050919050565b6125b881612b7d565b82525050565b6125cf6125ca82612b7d565b612ca3565b82525050565b60006125e182856122c2565b91506125ed82846122c2565b91506125f882612497565b91508190509392505050565b600061261082896125be565b60208201915061261f826123c5565b915061262b8288612239565b60208201915061263b8287612213565b60148201915061264b82866125be565b60208201915061265b82856125be565b60208201915061266b82846125be565b602082019150819050979650505050505050565b60006020820190506126946000830184612204565b92915050565b60006080820190506126af6000830187612204565b6126bc6020830186612204565b6126c960408301856125af565b81810360608301526126db8184612250565b905095945050505050565b60006060820190506126fb6000830186612204565b61270860208301856125af565b61271560408301846125af565b949350505050565b6000602082019050612732600083018461222a565b92915050565b600060208201905081810360008301526127528184612289565b905092915050565b60006020820190508181036000830152612773816122f3565b9050919050565b6000602082019050818103600083015261279381612316565b9050919050565b600060208201905081810360008301526127b381612339565b9050919050565b600060208201905081810360008301526127d38161235c565b9050919050565b600060208201905081810360008301526127f38161237f565b9050919050565b60006020820190508181036000830152612813816123a2565b9050919050565b60006020820190508181036000830152612833816123e8565b9050919050565b600060208201905081810360008301526128538161240b565b9050919050565b600060208201905081810360008301526128738161242e565b9050919050565b6000602082019050818103600083015261289381612451565b9050919050565b600060208201905081810360008301526128b381612474565b9050919050565b600060208201905081810360008301526128d3816124ba565b9050919050565b600060208201905081810360008301526128f3816124dd565b9050919050565b6000602082019050818103600083015261291381612500565b9050919050565b6000602082019050818103600083015261293381612523565b9050919050565b6000602082019050818103600083015261295381612546565b9050919050565b6000602082019050818103600083015261297381612569565b9050919050565b600060208201905081810360008301526129938161258c565b9050919050565b60006020820190506129af60008301846125af565b92915050565b60006129bf6129d0565b90506129cb8282612bfb565b919050565b6000604051905090565b600067ffffffffffffffff8211156129f5576129f4612d9a565b5b6129fe82612de7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a5982612b7d565b9150612a6483612b7d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a9957612a98612cde565b5b828201905092915050565b6000612aaf82612b7d565b9150612aba83612b7d565b925082612aca57612ac9612d0d565b5b828204905092915050565b6000612ae082612b7d565b9150612aeb83612b7d565b925082821015612afe57612afd612cde565b5b828203905092915050565b6000612b1482612b5d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612bb4578082015181840152602081019050612b99565b83811115612bc3576000848401525b50505050565b60006002820490506001821680612be157607f821691505b60208210811415612bf557612bf4612d3c565b5b50919050565b612c0482612de7565b810181811067ffffffffffffffff82111715612c2357612c22612d9a565b5b80604052505050565b6000612c3782612b7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c6a57612c69612cde565b5b600182019050919050565b6000612c8082612c91565b9050919050565b6000819050919050565b6000612c9c82612df8565b9050919050565b6000819050919050565b6000612cb882612b7d565b9150612cc383612b7d565b925082612cd357612cd2612d0d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686e6f6c6f67795365726965733153616c74000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f746f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61330a81612b09565b811461331557600080fd5b50565b61332181612b1b565b811461332c57600080fd5b50565b61333881612b31565b811461334357600080fd5b50565b61334f81612b7d565b811461335a57600080fd5b5056fe697066733a2f2f516d5365615a6d6d5831534c50374c71757154436f6d625077775756614c464e4b3351326e6e6d6d6869636252352fa26469706673582212204d53cf06aa580a7a968d469497131cdfd5679329008b0b371e82ffa301b693b364736f6c63430008070033

Deployed Bytecode Sourcemap

38814:2846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26318:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27263:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28822:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28345:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39081:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38990:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29712:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39661:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39033:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30122:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26957:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26687:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2669:94;;;:::i;:::-;;2018:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27432:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40448:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29115:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30378:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39885:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38910:73;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29481:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2918:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26318:305;26420:4;26472:25;26457:40;;;:11;:40;;;;:105;;;;26529:33;26514:48;;;:11;:48;;;;26457:105;:158;;;;26579:36;26603:11;26579:23;:36::i;:::-;26457:158;26437:178;;26318:305;;;:::o;27263:100::-;27317:13;27350:5;27343:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27263:100;:::o;28822:221::-;28898:7;28926:16;28934:7;28926;:16::i;:::-;28918:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29011:15;:24;29027:7;29011:24;;;;;;;;;;;;;;;;;;;;;29004:31;;28822:221;;;:::o;28345:411::-;28426:13;28442:23;28457:7;28442:14;:23::i;:::-;28426:39;;28490:5;28484:11;;:2;:11;;;;28476:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28584:5;28568:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28593:37;28610:5;28617:12;:10;:12::i;:::-;28593:16;:37::i;:::-;28568:62;28546:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28727:21;28736:2;28740:7;28727:8;:21::i;:::-;28415:341;28345:411;;:::o;39081:26::-;;;;:::o;38990:34::-;39023:1;38990:34;:::o;29712:339::-;29907:41;29926:12;:10;:12::i;:::-;29940:7;29907:18;:41::i;:::-;29899:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30015:28;30025:4;30031:2;30035:7;30015:9;:28::i;:::-;29712:339;;;:::o;39661:104::-;2249:12;:10;:12::i;:::-;2238:23;;:7;:5;:7::i;:::-;:23;;;2230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39753:4:::1;;39736:14;:21;;;;;;;:::i;:::-;;39661:104:::0;;:::o;39033:41::-;39070:4;39033:41;:::o;30122:185::-;30260:39;30277:4;30283:2;30287:7;30260:39;;;;;;;;;;;;:16;:39::i;:::-;30122:185;;;:::o;26957:239::-;27029:7;27049:13;27065:7;:16;27073:7;27065:16;;;;;;;;;;;;;;;;;;;;;27049:32;;27117:1;27100:19;;:5;:19;;;;27092:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27183:5;27176:12;;;26957:239;;;:::o;26687:208::-;26759:7;26804:1;26787:19;;:5;:19;;;;26779:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26871:9;:16;26881:5;26871:16;;;;;;;;;;;;;;;;26864:23;;26687:208;;;:::o;2669:94::-;2249:12;:10;:12::i;:::-;2238:23;;:7;:5;:7::i;:::-;:23;;;2230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2734:21:::1;2752:1;2734:9;:21::i;:::-;2669:94::o:0;2018:87::-;2064:7;2091:6;;;;;;;;;;;2084:13;;2018:87;:::o;27432:104::-;27488:13;27521:7;27514:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27432:104;:::o;40448:297::-;5058:1;5656:7;;:19;;5648:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5058:1;5789:7;:18;;;;40529:2:::1;40519:6;:12;;40511:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;38941:42;40555:19;;;40575:10;39023:1;40595:6;40555:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40618:9;40613:125;40637:6;40633:1;:10;40613:125;;;40665:33;40671:10;40683:14;:12;:14::i;:::-;40665:5;:33::i;:::-;40713:11;;:13;;;;;;;;;:::i;:::-;;;;;;40645:3;;;;;:::i;:::-;;;;40613:125;;;;5014:1:::0;5968:7;:22;;;;40448:297;:::o;29115:295::-;29230:12;:10;:12::i;:::-;29218:24;;:8;:24;;;;29210:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29330:8;29285:18;:32;29304:12;:10;:12::i;:::-;29285:32;;;;;;;;;;;;;;;:42;29318:8;29285:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29383:8;29354:48;;29369:12;:10;:12::i;:::-;29354:48;;;29393:8;29354:48;;;;;;:::i;:::-;;;;;;;;29115:295;;:::o;30378:328::-;30553:41;30572:12;:10;:12::i;:::-;30586:7;30553:18;:41::i;:::-;30545:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30659:39;30673:4;30679:2;30683:7;30692:5;30659:13;:39::i;:::-;30378:328;;;;:::o;39885:524::-;39986:13;40039:16;40047:7;40039;:16::i;:::-;40017:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;40143:21;40185:4;40175:7;:14;:66;;40225:16;:14;:16::i;:::-;40215:26;;;40175:66;;;40202:10;:8;:10::i;:::-;40192:20;;;40175:66;;40296:1;40278:7;40272:21;:25;:129;;;;;;;;;;;;;;;;;40341:7;40350:18;:7;:16;:18::i;:::-;40324:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40272:129;40252:149;;;39885:524;;;:::o;38910:73::-;38941:42;38910:73;:::o;29481:164::-;29578:4;29602:18;:25;29621:5;29602:25;;;;;;;;;;;;;;;:35;29628:8;29602:35;;;;;;;;;;;;;;;;;;;;;;;;;29595:42;;29481:164;;;;:::o;2918:192::-;2249:12;:10;:12::i;:::-;2238:23;;:7;:5;:7::i;:::-;:23;;;2230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3027:1:::1;3007:22;;:8;:22;;;;2999:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3083:19;3093:8;3083:9;:19::i;:::-;2918:192:::0;:::o;24524:157::-;24609:4;24648:25;24633:40;;;:11;:40;;;;24626:47;;24524:157;;;:::o;32216:127::-;32281:4;32333:1;32305:30;;:7;:16;32313:7;32305:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32298:37;;32216:127;;;:::o;755:98::-;808:7;835:10;828:17;;755:98;:::o;36198:174::-;36300:2;36273:15;:24;36289:7;36273:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36356:7;36352:2;36318:46;;36327:23;36342:7;36327:14;:23::i;:::-;36318:46;;;;;;;;;;;;36198:174;;:::o;32510:348::-;32603:4;32628:16;32636:7;32628;:16::i;:::-;32620:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32704:13;32720:23;32735:7;32720:14;:23::i;:::-;32704:39;;32773:5;32762:16;;:7;:16;;;:51;;;;32806:7;32782:31;;:20;32794:7;32782:11;:20::i;:::-;:31;;;32762:51;:87;;;;32817:32;32834:5;32841:7;32817:16;:32::i;:::-;32762:87;32754:96;;;32510:348;;;;:::o;35502:578::-;35661:4;35634:31;;:23;35649:7;35634:14;:23::i;:::-;:31;;;35626:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35744:1;35730:16;;:2;:16;;;;35722:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35800:39;35821:4;35827:2;35831:7;35800:20;:39::i;:::-;35904:29;35921:1;35925:7;35904:8;:29::i;:::-;35965:1;35946:9;:15;35956:4;35946:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35994:1;35977:9;:13;35987:2;35977:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36025:2;36006:7;:16;36014:7;36006:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36064:7;36060:2;36045:27;;36054:4;36045:27;;;;;;;;;;;;35502:578;;;:::o;3118:173::-;3174:16;3193:6;;;;;;;;;;;3174:25;;3219:8;3210:6;;:17;;;;;;;;;;;;;;;;;;3274:8;3243:40;;3264:8;3243:40;;;;;;;;;;;;3163:128;3118:173;:::o;40753:904::-;40795:7;40815:17;40862:1;40848:11;;39070:4;40835:24;;;;:::i;:::-;:28;;;;:::i;:::-;40815:48;;40874:13;41265:9;40979:5;;41062:12;41052:23;41098:10;41131:16;41170:15;41208:9;40940:296;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40912:339;;;;;;40890:372;;:384;;;;:::i;:::-;40874:400;;41287:13;41337:1;41319:7;41327:5;41319:14;;;;;;;:::i;:::-;;;;:19;41315:120;;41363:7;41371:5;41363:14;;;;;;;:::i;:::-;;;;41355:22;;41315:120;;;41418:5;41410:13;;41315:120;41477:1;41451:7;41471:1;41459:9;:13;;;;:::i;:::-;41451:22;;;;;;;:::i;:::-;;;;:27;41447:162;;;41524:1;41512:9;:13;;;;:::i;:::-;41495:7;41503:5;41495:14;;;;;;;:::i;:::-;;;:30;;;;41447:162;;;41575:7;41595:1;41583:9;:13;;;;:::i;:::-;41575:22;;;;;;;:::i;:::-;;;;41558:7;41566:5;41558:14;;;;;;;:::i;:::-;;;:39;;;;41447:162;41619:5;;:7;;;;;;;;;:::i;:::-;;;;;;41644:5;41637:12;;;;;40753:904;:::o;34194:382::-;34288:1;34274:16;;:2;:16;;;;34266:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34347:16;34355:7;34347;:16::i;:::-;34346:17;34338:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34409:45;34438:1;34442:2;34446:7;34409:20;:45::i;:::-;34484:1;34467:9;:13;34477:2;34467:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34515:2;34496:7;:16;34504:7;34496:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34560:7;34556:2;34535:33;;34552:1;34535:33;;;;;;;;;;;;34194:382;;:::o;31588:315::-;31745:28;31755:4;31761:2;31765:7;31745:9;:28::i;:::-;31792:48;31815:4;31821:2;31825:7;31834:5;31792:22;:48::i;:::-;31784:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31588:315;;;;:::o;39773:104::-;39822:13;39855:14;39848:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39773:104;:::o;39504:149::-;39556:13;39582:63;;;;;;;;;;;;;;;;;;;39504:149;:::o;21923:723::-;21979:13;22209:1;22200:5;:10;22196:53;;;22227:10;;;;;;;;;;;;;;;;;;;;;22196:53;22259:12;22274:5;22259:20;;22290:14;22315:78;22330:1;22322:4;:9;22315:78;;22348:8;;;;;:::i;:::-;;;;22379:2;22371:10;;;;;:::i;:::-;;;22315:78;;;22403:19;22435:6;22425:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22403:39;;22453:154;22469:1;22460:5;:10;22453:154;;22497:1;22487:11;;;;;:::i;:::-;;;22564:2;22556:5;:10;;;;:::i;:::-;22543:2;:24;;;;:::i;:::-;22530:39;;22513:6;22520;22513:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22593:2;22584:11;;;;;:::i;:::-;;;22453:154;;;22631:6;22617:21;;;;;21923:723;;;;:::o;38308:126::-;;;;:::o;36937:799::-;37092:4;37113:15;:2;:13;;;:15::i;:::-;37109:620;;;37165:2;37149:36;;;37186:12;:10;:12::i;:::-;37200:4;37206:7;37215:5;37149:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37145:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37408:1;37391:6;:13;:18;37387:272;;;37434:60;;;;;;;;;;:::i;:::-;;;;;;;;37387:272;37609:6;37603:13;37594:6;37590:2;37586:15;37579:38;37145:529;37282:41;;;37272:51;;;:6;:51;;;;37265:58;;;;;37109:620;37713:4;37706:11;;36937:799;;;;;;;:::o;14268:387::-;14328:4;14536:12;14603:7;14591:20;14583:28;;14646:1;14639:4;:8;14632:15;;;14268:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:157::-;7202:45;7222:24;7240:5;7222:24;:::i;:::-;7202:45;:::i;:::-;7197:3;7190:58;7097:157;;:::o;7260:109::-;7341:21;7356:5;7341:21;:::i;:::-;7336:3;7329:34;7260:109;;:::o;7375:157::-;7480:45;7500:24;7518:5;7500:24;:::i;:::-;7480:45;:::i;:::-;7475:3;7468:58;7375:157;;:::o;7538:360::-;7624:3;7652:38;7684:5;7652:38;:::i;:::-;7706:70;7769:6;7764:3;7706:70;:::i;:::-;7699:77;;7785:52;7830:6;7825:3;7818:4;7811:5;7807:16;7785:52;:::i;:::-;7862:29;7884:6;7862:29;:::i;:::-;7857:3;7853:39;7846:46;;7628:270;7538:360;;;;:::o;7904:364::-;7992:3;8020:39;8053:5;8020:39;:::i;:::-;8075:71;8139:6;8134:3;8075:71;:::i;:::-;8068:78;;8155:52;8200:6;8195:3;8188:4;8181:5;8177:16;8155:52;:::i;:::-;8232:29;8254:6;8232:29;:::i;:::-;8227:3;8223:39;8216:46;;7996:272;7904:364;;;;:::o;8274:377::-;8380:3;8408:39;8441:5;8408:39;:::i;:::-;8463:89;8545:6;8540:3;8463:89;:::i;:::-;8456:96;;8561:52;8606:6;8601:3;8594:4;8587:5;8583:16;8561:52;:::i;:::-;8638:6;8633:3;8629:16;8622:23;;8384:267;8274:377;;;;:::o;8657:366::-;8799:3;8820:67;8884:2;8879:3;8820:67;:::i;:::-;8813:74;;8896:93;8985:3;8896:93;:::i;:::-;9014:2;9009:3;9005:12;8998:19;;8657:366;;;:::o;9029:::-;9171:3;9192:67;9256:2;9251:3;9192:67;:::i;:::-;9185:74;;9268:93;9357:3;9268:93;:::i;:::-;9386:2;9381:3;9377:12;9370:19;;9029:366;;;:::o;9401:::-;9543:3;9564:67;9628:2;9623:3;9564:67;:::i;:::-;9557:74;;9640:93;9729:3;9640:93;:::i;:::-;9758:2;9753:3;9749:12;9742:19;;9401:366;;;:::o;9773:::-;9915:3;9936:67;10000:2;9995:3;9936:67;:::i;:::-;9929:74;;10012:93;10101:3;10012:93;:::i;:::-;10130:2;10125:3;10121:12;10114:19;;9773:366;;;:::o;10145:::-;10287:3;10308:67;10372:2;10367:3;10308:67;:::i;:::-;10301:74;;10384:93;10473:3;10384:93;:::i;:::-;10502:2;10497:3;10493:12;10486:19;;10145:366;;;:::o;10517:::-;10659:3;10680:67;10744:2;10739:3;10680:67;:::i;:::-;10673:74;;10756:93;10845:3;10756:93;:::i;:::-;10874:2;10869:3;10865:12;10858:19;;10517:366;;;:::o;10889:402::-;11049:3;11070:85;11152:2;11147:3;11070:85;:::i;:::-;11063:92;;11164:93;11253:3;11164:93;:::i;:::-;11282:2;11277:3;11273:12;11266:19;;10889:402;;;:::o;11297:366::-;11439:3;11460:67;11524:2;11519:3;11460:67;:::i;:::-;11453:74;;11536:93;11625:3;11536:93;:::i;:::-;11654:2;11649:3;11645:12;11638:19;;11297:366;;;:::o;11669:::-;11811:3;11832:67;11896:2;11891:3;11832:67;:::i;:::-;11825:74;;11908:93;11997:3;11908:93;:::i;:::-;12026:2;12021:3;12017:12;12010:19;;11669:366;;;:::o;12041:::-;12183:3;12204:67;12268:2;12263:3;12204:67;:::i;:::-;12197:74;;12280:93;12369:3;12280:93;:::i;:::-;12398:2;12393:3;12389:12;12382:19;;12041:366;;;:::o;12413:::-;12555:3;12576:67;12640:2;12635:3;12576:67;:::i;:::-;12569:74;;12652:93;12741:3;12652:93;:::i;:::-;12770:2;12765:3;12761:12;12754:19;;12413:366;;;:::o;12785:::-;12927:3;12948:67;13012:2;13007:3;12948:67;:::i;:::-;12941:74;;13024:93;13113:3;13024:93;:::i;:::-;13142:2;13137:3;13133:12;13126:19;;12785:366;;;:::o;13157:400::-;13317:3;13338:84;13420:1;13415:3;13338:84;:::i;:::-;13331:91;;13431:93;13520:3;13431:93;:::i;:::-;13549:1;13544:3;13540:11;13533:18;;13157:400;;;:::o;13563:366::-;13705:3;13726:67;13790:2;13785:3;13726:67;:::i;:::-;13719:74;;13802:93;13891:3;13802:93;:::i;:::-;13920:2;13915:3;13911:12;13904:19;;13563:366;;;:::o;13935:::-;14077:3;14098:67;14162:2;14157:3;14098:67;:::i;:::-;14091:74;;14174:93;14263:3;14174:93;:::i;:::-;14292:2;14287:3;14283:12;14276:19;;13935:366;;;:::o;14307:::-;14449:3;14470:67;14534:2;14529:3;14470:67;:::i;:::-;14463:74;;14546:93;14635:3;14546:93;:::i;:::-;14664:2;14659:3;14655:12;14648:19;;14307:366;;;:::o;14679:365::-;14821:3;14842:66;14906:1;14901:3;14842:66;:::i;:::-;14835:73;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14679:365;;;:::o;15050:366::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:118::-;16253:24;16271:5;16253:24;:::i;:::-;16248:3;16241:37;16166:118;;:::o;16290:157::-;16395:45;16415:24;16433:5;16415:24;:::i;:::-;16395:45;:::i;:::-;16390:3;16383:58;16290:157;;:::o;16453:701::-;16734:3;16756:95;16847:3;16838:6;16756:95;:::i;:::-;16749:102;;16868:95;16959:3;16950:6;16868:95;:::i;:::-;16861:102;;16980:148;17124:3;16980:148;:::i;:::-;16973:155;;17145:3;17138:10;;16453:701;;;;;:::o;17160:1227::-;17513:3;17528:75;17599:3;17590:6;17528:75;:::i;:::-;17628:2;17623:3;17619:12;17612:19;;17648:148;17792:3;17648:148;:::i;:::-;17641:155;;17806:75;17877:3;17868:6;17806:75;:::i;:::-;17906:2;17901:3;17897:12;17890:19;;17919:75;17990:3;17981:6;17919:75;:::i;:::-;18019:2;18014:3;18010:12;18003:19;;18032:75;18103:3;18094:6;18032:75;:::i;:::-;18132:2;18127:3;18123:12;18116:19;;18145:75;18216:3;18207:6;18145:75;:::i;:::-;18245:2;18240:3;18236:12;18229:19;;18258:75;18329:3;18320:6;18258:75;:::i;:::-;18358:2;18353:3;18349:12;18342:19;;18378:3;18371:10;;17160:1227;;;;;;;;;:::o;18393:222::-;18486:4;18524:2;18513:9;18509:18;18501:26;;18537:71;18605:1;18594:9;18590:17;18581:6;18537:71;:::i;:::-;18393:222;;;;:::o;18621:640::-;18816:4;18854:3;18843:9;18839:19;18831:27;;18868:71;18936:1;18925:9;18921:17;18912:6;18868:71;:::i;:::-;18949:72;19017:2;19006:9;19002:18;18993:6;18949:72;:::i;:::-;19031;19099:2;19088:9;19084:18;19075:6;19031:72;:::i;:::-;19150:9;19144:4;19140:20;19135:2;19124:9;19120:18;19113:48;19178:76;19249:4;19240:6;19178:76;:::i;:::-;19170:84;;18621:640;;;;;;;:::o;19267:442::-;19416:4;19454:2;19443:9;19439:18;19431:26;;19467:71;19535:1;19524:9;19520:17;19511:6;19467:71;:::i;:::-;19548:72;19616:2;19605:9;19601:18;19592:6;19548:72;:::i;:::-;19630;19698:2;19687:9;19683:18;19674:6;19630:72;:::i;:::-;19267:442;;;;;;:::o;19715:210::-;19802:4;19840:2;19829:9;19825:18;19817:26;;19853:65;19915:1;19904:9;19900:17;19891:6;19853:65;:::i;:::-;19715:210;;;;:::o;19931:313::-;20044:4;20082:2;20071:9;20067:18;20059:26;;20131:9;20125:4;20121:20;20117:1;20106:9;20102:17;20095:47;20159:78;20232:4;20223:6;20159:78;:::i;:::-;20151:86;;19931:313;;;;:::o;20250:419::-;20416:4;20454:2;20443:9;20439:18;20431:26;;20503:9;20497:4;20493:20;20489:1;20478:9;20474:17;20467:47;20531:131;20657:4;20531:131;:::i;:::-;20523:139;;20250:419;;;:::o;20675:::-;20841:4;20879:2;20868:9;20864:18;20856:26;;20928:9;20922:4;20918:20;20914:1;20903:9;20899:17;20892:47;20956:131;21082:4;20956:131;:::i;:::-;20948:139;;20675:419;;;:::o;21100:::-;21266:4;21304:2;21293:9;21289:18;21281:26;;21353:9;21347:4;21343:20;21339:1;21328:9;21324:17;21317:47;21381:131;21507:4;21381:131;:::i;:::-;21373:139;;21100:419;;;:::o;21525:::-;21691:4;21729:2;21718:9;21714:18;21706:26;;21778:9;21772:4;21768:20;21764:1;21753:9;21749:17;21742:47;21806:131;21932:4;21806:131;:::i;:::-;21798:139;;21525:419;;;:::o;21950:::-;22116:4;22154:2;22143:9;22139:18;22131:26;;22203:9;22197:4;22193:20;22189:1;22178:9;22174:17;22167:47;22231:131;22357:4;22231:131;:::i;:::-;22223:139;;21950:419;;;:::o;22375:::-;22541:4;22579:2;22568:9;22564:18;22556:26;;22628:9;22622:4;22618:20;22614:1;22603:9;22599:17;22592:47;22656:131;22782:4;22656:131;:::i;:::-;22648:139;;22375:419;;;:::o;22800:::-;22966:4;23004:2;22993:9;22989:18;22981:26;;23053:9;23047:4;23043:20;23039:1;23028:9;23024:17;23017:47;23081:131;23207:4;23081:131;:::i;:::-;23073:139;;22800:419;;;:::o;23225:::-;23391:4;23429:2;23418:9;23414:18;23406:26;;23478:9;23472:4;23468:20;23464:1;23453:9;23449:17;23442:47;23506:131;23632:4;23506:131;:::i;:::-;23498:139;;23225:419;;;:::o;23650:::-;23816:4;23854:2;23843:9;23839:18;23831:26;;23903:9;23897:4;23893:20;23889:1;23878:9;23874:17;23867:47;23931:131;24057:4;23931:131;:::i;:::-;23923:139;;23650:419;;;:::o;24075:::-;24241:4;24279:2;24268:9;24264:18;24256:26;;24328:9;24322:4;24318:20;24314:1;24303:9;24299:17;24292:47;24356:131;24482:4;24356:131;:::i;:::-;24348:139;;24075:419;;;:::o;24500:::-;24666:4;24704:2;24693:9;24689:18;24681:26;;24753:9;24747:4;24743:20;24739:1;24728:9;24724:17;24717:47;24781:131;24907:4;24781:131;:::i;:::-;24773:139;;24500:419;;;:::o;24925:::-;25091:4;25129:2;25118:9;25114:18;25106:26;;25178:9;25172:4;25168:20;25164:1;25153:9;25149:17;25142:47;25206:131;25332:4;25206:131;:::i;:::-;25198:139;;24925:419;;;:::o;25350:::-;25516:4;25554:2;25543:9;25539:18;25531:26;;25603:9;25597:4;25593:20;25589:1;25578:9;25574:17;25567:47;25631:131;25757:4;25631:131;:::i;:::-;25623:139;;25350:419;;;:::o;25775:::-;25941:4;25979:2;25968:9;25964:18;25956:26;;26028:9;26022:4;26018:20;26014:1;26003:9;25999:17;25992:47;26056:131;26182:4;26056:131;:::i;:::-;26048:139;;25775:419;;;:::o;26200:::-;26366:4;26404:2;26393:9;26389:18;26381:26;;26453:9;26447:4;26443:20;26439:1;26428:9;26424:17;26417:47;26481:131;26607:4;26481:131;:::i;:::-;26473:139;;26200:419;;;:::o;26625:::-;26791:4;26829:2;26818:9;26814:18;26806:26;;26878:9;26872:4;26868:20;26864:1;26853:9;26849:17;26842:47;26906:131;27032:4;26906:131;:::i;:::-;26898:139;;26625:419;;;:::o;27050:::-;27216:4;27254:2;27243:9;27239:18;27231:26;;27303:9;27297:4;27293:20;27289:1;27278:9;27274:17;27267:47;27331:131;27457:4;27331:131;:::i;:::-;27323:139;;27050:419;;;:::o;27475:::-;27641:4;27679:2;27668:9;27664:18;27656:26;;27728:9;27722:4;27718:20;27714:1;27703:9;27699:17;27692:47;27756:131;27882:4;27756:131;:::i;:::-;27748:139;;27475:419;;;:::o;27900:222::-;27993:4;28031:2;28020:9;28016:18;28008:26;;28044:71;28112:1;28101:9;28097:17;28088:6;28044:71;:::i;:::-;27900:222;;;;:::o;28128:129::-;28162:6;28189:20;;:::i;:::-;28179:30;;28218:33;28246:4;28238:6;28218:33;:::i;:::-;28128:129;;;:::o;28263:75::-;28296:6;28329:2;28323:9;28313:19;;28263:75;:::o;28344:307::-;28405:4;28495:18;28487:6;28484:30;28481:56;;;28517:18;;:::i;:::-;28481:56;28555:29;28577:6;28555:29;:::i;:::-;28547:37;;28639:4;28633;28629:15;28621:23;;28344:307;;;:::o;28657:98::-;28708:6;28742:5;28736:12;28726:22;;28657:98;;;:::o;28761:99::-;28813:6;28847:5;28841:12;28831:22;;28761:99;;;:::o;28866:168::-;28949:11;28983:6;28978:3;28971:19;29023:4;29018:3;29014:14;28999:29;;28866:168;;;;:::o;29040:169::-;29124:11;29158:6;29153:3;29146:19;29198:4;29193:3;29189:14;29174:29;;29040:169;;;;:::o;29215:148::-;29317:11;29354:3;29339:18;;29215:148;;;;:::o;29369:305::-;29409:3;29428:20;29446:1;29428:20;:::i;:::-;29423:25;;29462:20;29480:1;29462:20;:::i;:::-;29457:25;;29616:1;29548:66;29544:74;29541:1;29538:81;29535:107;;;29622:18;;:::i;:::-;29535:107;29666:1;29663;29659:9;29652:16;;29369:305;;;;:::o;29680:185::-;29720:1;29737:20;29755:1;29737:20;:::i;:::-;29732:25;;29771:20;29789:1;29771:20;:::i;:::-;29766:25;;29810:1;29800:35;;29815:18;;:::i;:::-;29800:35;29857:1;29854;29850:9;29845:14;;29680:185;;;;:::o;29871:191::-;29911:4;29931:20;29949:1;29931:20;:::i;:::-;29926:25;;29965:20;29983:1;29965:20;:::i;:::-;29960:25;;30004:1;30001;29998:8;29995:34;;;30009:18;;:::i;:::-;29995:34;30054:1;30051;30047:9;30039:17;;29871:191;;;;:::o;30068:96::-;30105:7;30134:24;30152:5;30134:24;:::i;:::-;30123:35;;30068:96;;;:::o;30170:90::-;30204:7;30247:5;30240:13;30233:21;30222:32;;30170:90;;;:::o;30266:77::-;30303:7;30332:5;30321:16;;30266:77;;;:::o;30349:149::-;30385:7;30425:66;30418:5;30414:78;30403:89;;30349:149;;;:::o;30504:126::-;30541:7;30581:42;30574:5;30570:54;30559:65;;30504:126;;;:::o;30636:77::-;30673:7;30702:5;30691:16;;30636:77;;;:::o;30719:154::-;30803:6;30798:3;30793;30780:30;30865:1;30856:6;30851:3;30847:16;30840:27;30719:154;;;:::o;30879:307::-;30947:1;30957:113;30971:6;30968:1;30965:13;30957:113;;;31056:1;31051:3;31047:11;31041:18;31037:1;31032:3;31028:11;31021:39;30993:2;30990:1;30986:10;30981:15;;30957:113;;;31088:6;31085:1;31082:13;31079:101;;;31168:1;31159:6;31154:3;31150:16;31143:27;31079:101;30928:258;30879:307;;;:::o;31192:320::-;31236:6;31273:1;31267:4;31263:12;31253:22;;31320:1;31314:4;31310:12;31341:18;31331:81;;31397:4;31389:6;31385:17;31375:27;;31331:81;31459:2;31451:6;31448:14;31428:18;31425:38;31422:84;;;31478:18;;:::i;:::-;31422:84;31243:269;31192:320;;;:::o;31518:281::-;31601:27;31623:4;31601:27;:::i;:::-;31593:6;31589:40;31731:6;31719:10;31716:22;31695:18;31683:10;31680:34;31677:62;31674:88;;;31742:18;;:::i;:::-;31674:88;31782:10;31778:2;31771:22;31561:238;31518:281;;:::o;31805:233::-;31844:3;31867:24;31885:5;31867:24;:::i;:::-;31858:33;;31913:66;31906:5;31903:77;31900:103;;;31983:18;;:::i;:::-;31900:103;32030:1;32023:5;32019:13;32012:20;;31805:233;;;:::o;32044:100::-;32083:7;32112:26;32132:5;32112:26;:::i;:::-;32101:37;;32044:100;;;:::o;32150:79::-;32189:7;32218:5;32207:16;;32150:79;;;:::o;32235:94::-;32274:7;32303:20;32317:5;32303:20;:::i;:::-;32292:31;;32235:94;;;:::o;32335:79::-;32374:7;32403:5;32392:16;;32335:79;;;:::o;32420:176::-;32452:1;32469:20;32487:1;32469:20;:::i;:::-;32464:25;;32503:20;32521:1;32503:20;:::i;:::-;32498:25;;32542:1;32532:35;;32547:18;;:::i;:::-;32532:35;32588:1;32585;32581:9;32576:14;;32420:176;;;;:::o;32602:180::-;32650:77;32647:1;32640:88;32747:4;32744:1;32737:15;32771:4;32768:1;32761:15;32788:180;32836:77;32833:1;32826:88;32933:4;32930:1;32923:15;32957:4;32954:1;32947:15;32974:180;33022:77;33019:1;33012:88;33119:4;33116:1;33109:15;33143:4;33140:1;33133:15;33160:180;33208:77;33205:1;33198:88;33305:4;33302:1;33295:15;33329:4;33326:1;33319:15;33346:180;33394:77;33391:1;33384:88;33491:4;33488:1;33481:15;33515:4;33512:1;33505:15;33532:117;33641:1;33638;33631:12;33655:117;33764:1;33761;33754:12;33778:117;33887:1;33884;33877:12;33901:117;34010:1;34007;34000:12;34024:117;34133:1;34130;34123:12;34147:117;34256:1;34253;34246:12;34270:102;34311:6;34362:2;34358:7;34353:2;34346:5;34342:14;34338:28;34328:38;;34270:102;;;:::o;34378:94::-;34411:8;34459:5;34455:2;34451:14;34430:35;;34378:94;;;:::o;34478:237::-;34618:34;34614:1;34606:6;34602:14;34595:58;34687:20;34682:2;34674:6;34670:15;34663:45;34478:237;:::o;34721:225::-;34861:34;34857:1;34849:6;34845:14;34838:58;34930:8;34925:2;34917:6;34913:15;34906:33;34721:225;:::o;34952:178::-;35092:30;35088:1;35080:6;35076:14;35069:54;34952:178;:::o;35136:223::-;35276:34;35272:1;35264:6;35260:14;35253:58;35345:6;35340:2;35332:6;35328:15;35321:31;35136:223;:::o;35365:175::-;35505:27;35501:1;35493:6;35489:14;35482:51;35365:175;:::o;35546:231::-;35686:34;35682:1;35674:6;35670:14;35663:58;35755:14;35750:2;35742:6;35738:15;35731:39;35546:231;:::o;35783:170::-;35923:22;35919:1;35911:6;35907:14;35900:46;35783:170;:::o;35959:243::-;36099:34;36095:1;36087:6;36083:14;36076:58;36168:26;36163:2;36155:6;36151:15;36144:51;35959:243;:::o;36208:229::-;36348:34;36344:1;36336:6;36332:14;36325:58;36417:12;36412:2;36404:6;36400:15;36393:37;36208:229;:::o;36443:228::-;36583:34;36579:1;36571:6;36567:14;36560:58;36652:11;36647:2;36639:6;36635:15;36628:36;36443:228;:::o;36677:182::-;36817:34;36813:1;36805:6;36801:14;36794:58;36677:182;:::o;36865:231::-;37005:34;37001:1;36993:6;36989:14;36982:58;37074:14;37069:2;37061:6;37057:15;37050:39;36865:231;:::o;37102:155::-;37242:7;37238:1;37230:6;37226:14;37219:31;37102:155;:::o;37263:182::-;37403:34;37399:1;37391:6;37387:14;37380:58;37263:182;:::o;37451:228::-;37591:34;37587:1;37579:6;37575:14;37568:58;37660:11;37655:2;37647:6;37643:15;37636:36;37451:228;:::o;37685:234::-;37825:34;37821:1;37813:6;37809:14;37802:58;37894:17;37889:2;37881:6;37877:15;37870:42;37685:234;:::o;37925:158::-;38065:10;38061:1;38053:6;38049:14;38042:34;37925:158;:::o;38089:220::-;38229:34;38225:1;38217:6;38213:14;38206:58;38298:3;38293:2;38285:6;38281:15;38274:28;38089:220;:::o;38315:236::-;38455:34;38451:1;38443:6;38439:14;38432:58;38524:19;38519:2;38511:6;38507:15;38500:44;38315:236;:::o;38557:181::-;38697:33;38693:1;38685:6;38681:14;38674:57;38557:181;:::o;38744:122::-;38817:24;38835:5;38817:24;:::i;:::-;38810:5;38807:35;38797:63;;38856:1;38853;38846:12;38797:63;38744:122;:::o;38872:116::-;38942:21;38957:5;38942:21;:::i;:::-;38935:5;38932:32;38922:60;;38978:1;38975;38968:12;38922:60;38872:116;:::o;38994:120::-;39066:23;39083:5;39066:23;:::i;:::-;39059:5;39056:34;39046:62;;39104:1;39101;39094:12;39046:62;38994:120;:::o;39120:122::-;39193:24;39211:5;39193:24;:::i;:::-;39186:5;39183:35;39173:63;;39232:1;39229;39222:12;39173:63;39120:122;:::o

Swarm Source

ipfs://4d53cf06aa580a7a968d469497131cdfd5679329008b0b371e82ffa301b693b3
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.