ERC-721
Overview
Max Total Supply
2,251 AMGP
Holders
2,197
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 AMGPLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
ApeliensMothershipGenesisPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-10-22 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: tests/fattydrop.sol pragma solidity ^0.8.4; contract ApeliensMothershipGenesisPass is ERC721, ERC721Enumerable, Pausable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string public baseTokenURI; constructor() ERC721("Apeliens Mothership Genesis Pass", "AMGP") {} function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(address to) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } function safeAirdrop(address [] memory _list) public onlyOwner { require(_list.length <= 255, "Max 255 addresses at once"); for (uint8 i = 0; i < _list.length; i++) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(_list[i], tokenId); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function setTokenURI(string memory _TokenURI) onlyOwner public { baseTokenURI = _TokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = baseTokenURI; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI)) : ""; } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_list","type":"address[]"}],"name":"safeAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","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":"_TokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280602081526020017f4170656c69656e73204d6f74686572736869702047656e6573697320506173738152506040518060400160405280600481526020017f414d475000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001c1565b508060019080519060200190620000af929190620001c1565b5050506000600a60006101000a81548160ff021916908315150217905550620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6136a180620002e66000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063b88d4fde11610097578063e0df5b6f11610071578063e0df5b6f1461045d578063e985e9c514610479578063ef6fd7d2146104a9578063f2fde38b146104c55761018e565b8063b88d4fde146103f3578063c87b56dd1461040f578063d547cfb71461043f5761018e565b806370a0823114610357578063715018a6146103875780638456cb59146103915780638da5cb5b1461039b57806395d89b41146103b9578063a22cb465146103d75761018e565b80632f745c591161014b57806342842e0e1161012557806342842e0e146102bd5780634f6ccce7146102d95780635c975abb146103095780636352211e146103275761018e565b80632f745c59146102675780633f4ba83a1461029757806340d097c3146102a15761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a891906126a0565b6104e1565b6040516101ba9190612b34565b60405180910390f35b6101cb6104f3565b6040516101d89190612b4f565b60405180910390f35b6101fb60048036038101906101f69190612743565b610585565b6040516102089190612acd565b60405180910390f35b61022b60048036038101906102269190612617565b6105cb565b005b6102356106e3565b6040516102429190612db1565b60405180910390f35b61026560048036038101906102609190612501565b6106f0565b005b610281600480360381019061027c9190612617565b610750565b60405161028e9190612db1565b60405180910390f35b61029f6107f5565b005b6102bb60048036038101906102b69190612494565b610807565b005b6102d760048036038101906102d29190612501565b610835565b005b6102f360048036038101906102ee9190612743565b610855565b6040516103009190612db1565b60405180910390f35b6103116108c6565b60405161031e9190612b34565b60405180910390f35b610341600480360381019061033c9190612743565b6108dd565b60405161034e9190612acd565b60405180910390f35b610371600480360381019061036c9190612494565b61098f565b60405161037e9190612db1565b60405180910390f35b61038f610a47565b005b610399610a5b565b005b6103a3610a6d565b6040516103b09190612acd565b60405180910390f35b6103c1610a97565b6040516103ce9190612b4f565b60405180910390f35b6103f160048036038101906103ec91906125d7565b610b29565b005b61040d60048036038101906104089190612554565b610b3f565b005b61042960048036038101906104249190612743565b610ba1565b6040516104369190612b4f565b60405180910390f35b610447610c82565b6040516104549190612b4f565b60405180910390f35b610477600480360381019061047291906126fa565b610d10565b005b610493600480360381019061048e91906124c1565b610d32565b6040516104a09190612b34565b60405180910390f35b6104c360048036038101906104be9190612657565b610dc6565b005b6104df60048036038101906104da9190612494565b610e79565b005b60006104ec82610efd565b9050919050565b6060600080546105029061300f565b80601f016020809104026020016040519081016040528092919081815260200182805461052e9061300f565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b600061059082610f77565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d6826108dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e90612d51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610666610fc2565b73ffffffffffffffffffffffffffffffffffffffff16148061069557506106948161068f610fc2565b610d32565b5b6106d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cb90612cd1565b60405180910390fd5b6106de8383610fca565b505050565b6000600880549050905090565b6107016106fb610fc2565b82611083565b610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073790612d91565b60405180910390fd5b61074b838383611118565b505050565b600061075b8361098f565b821061079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390612b91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107fd61137f565b6108056113fd565b565b61080f61137f565b600061081b600b611460565b9050610827600b61146e565b6108318282611484565b5050565b61085083838360405180602001604052806000815250610b3f565b505050565b600061085f6106e3565b82106108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612d71565b60405180910390fd5b600882815481106108b4576108b3613129565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d90612d31565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f790612c91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a4f61137f565b610a5960006114a2565b565b610a6361137f565b610a6b611568565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610aa69061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad29061300f565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b5050505050905090565b610b3b610b34610fc2565b83836115cb565b5050565b610b50610b4a610fc2565b83611083565b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690612d91565b60405180910390fd5b610b9b84848484611738565b50505050565b6060610bac82610f77565b6000600c8054610bbb9061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610be79061300f565b8015610c345780601f10610c0957610100808354040283529160200191610c34565b820191906000526020600020905b815481529060010190602001808311610c1757829003601f168201915b505050505090506000815111610c595760405180602001604052806000815250610c7a565b80604051602001610c6a9190612ab6565b6040516020818303038152906040525b915050919050565b600c8054610c8f9061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb9061300f565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b505050505081565b610d1861137f565b80600c9080519060200190610d2e92919061220a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610dce61137f565b60ff81511115610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90612cb1565b60405180910390fd5b60005b81518160ff161015610e75576000610e2e600b611460565b9050610e3a600b61146e565b610e61838360ff1681518110610e5357610e52613129565b5b602002602001015182611484565b508080610e6d90613072565b915050610e16565b5050565b610e8161137f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890612bd1565b60405180910390fd5b610efa816114a2565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f705750610f6f82611794565b5b9050919050565b610f8081611876565b610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690612d31565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661103d836108dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061108f836108dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110d157506110d08185610d32565b5b8061110f57508373ffffffffffffffffffffffffffffffffffffffff166110f784610585565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611138826108dd565b73ffffffffffffffffffffffffffffffffffffffff161461118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bf1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590612c31565b60405180910390fd5b6112098383836118e2565b611214600082610fca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112649190612f18565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bb9190612ec2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461137a8383836118fa565b505050565b611387610fc2565b73ffffffffffffffffffffffffffffffffffffffff166113a5610a6d565b73ffffffffffffffffffffffffffffffffffffffff16146113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290612d11565b60405180910390fd5b565b6114056118ff565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611449610fc2565b6040516114569190612acd565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b61149e828260405180602001604052806000815250611948565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6115706119a3565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115b4610fc2565b6040516115c19190612acd565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612c51565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172b9190612b34565b60405180910390a3505050565b611743848484611118565b61174f848484846119ed565b61178e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178590612bb1565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061185f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061186f575061186e82611b84565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6118ea6119a3565b6118f5838383611bee565b505050565b505050565b6119076108c6565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612b71565b60405180910390fd5b565b6119528383611d02565b61195f60008484846119ed565b61199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590612bb1565b60405180910390fd5b505050565b6119ab6108c6565b156119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290612c71565b60405180910390fd5b565b6000611a0e8473ffffffffffffffffffffffffffffffffffffffff16611edc565b15611b77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a37610fc2565b8786866040518563ffffffff1660e01b8152600401611a599493929190612ae8565b602060405180830381600087803b158015611a7357600080fd5b505af1925050508015611aa457506040513d601f19601f82011682018060405250810190611aa191906126cd565b60015b611b27573d8060008114611ad4576040519150601f19603f3d011682016040523d82523d6000602084013e611ad9565b606091505b50600081511415611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690612bb1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b7c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bf9838383611eff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c3c57611c3781611f04565b611c7b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611c7a57611c798382611f4d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbe57611cb9816120ba565b611cfd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611cfc57611cfb828261218b565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990612cf1565b60405180910390fd5b611d7b81611876565b15611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db290612c11565b60405180910390fd5b611dc7600083836118e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e179190612ec2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed8600083836118fa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611f5a8461098f565b611f649190612f18565b9050600060076000848152602001908152602001600020549050818114612049576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506120ce9190612f18565b90506000600960008481526020019081526020016000205490506000600883815481106120fe576120fd613129565b5b9060005260206000200154905080600883815481106121205761211f613129565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061216f5761216e6130fa565b5b6001900381819060005260206000200160009055905550505050565b60006121968361098f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546122169061300f565b90600052602060002090601f016020900481019282612238576000855561227f565b82601f1061225157805160ff191683800117855561227f565b8280016001018555821561227f579182015b8281111561227e578251825591602001919060010190612263565b5b50905061228c9190612290565b5090565b5b808211156122a9576000816000905550600101612291565b5090565b60006122c06122bb84612df1565b612dcc565b905080838252602082019050828560208602820111156122e3576122e261318c565b5b60005b8581101561231357816122f988826123a1565b8452602084019350602083019250506001810190506122e6565b5050509392505050565b600061233061232b84612e1d565b612dcc565b90508281526020810184848401111561234c5761234b613191565b5b612357848285612fcd565b509392505050565b600061237261236d84612e4e565b612dcc565b90508281526020810184848401111561238e5761238d613191565b5b612399848285612fcd565b509392505050565b6000813590506123b08161360f565b92915050565b600082601f8301126123cb576123ca613187565b5b81356123db8482602086016122ad565b91505092915050565b6000813590506123f381613626565b92915050565b6000813590506124088161363d565b92915050565b60008151905061241d8161363d565b92915050565b600082601f83011261243857612437613187565b5b813561244884826020860161231d565b91505092915050565b600082601f83011261246657612465613187565b5b813561247684826020860161235f565b91505092915050565b60008135905061248e81613654565b92915050565b6000602082840312156124aa576124a961319b565b5b60006124b8848285016123a1565b91505092915050565b600080604083850312156124d8576124d761319b565b5b60006124e6858286016123a1565b92505060206124f7858286016123a1565b9150509250929050565b60008060006060848603121561251a5761251961319b565b5b6000612528868287016123a1565b9350506020612539868287016123a1565b925050604061254a8682870161247f565b9150509250925092565b6000806000806080858703121561256e5761256d61319b565b5b600061257c878288016123a1565b945050602061258d878288016123a1565b935050604061259e8782880161247f565b925050606085013567ffffffffffffffff8111156125bf576125be613196565b5b6125cb87828801612423565b91505092959194509250565b600080604083850312156125ee576125ed61319b565b5b60006125fc858286016123a1565b925050602061260d858286016123e4565b9150509250929050565b6000806040838503121561262e5761262d61319b565b5b600061263c858286016123a1565b925050602061264d8582860161247f565b9150509250929050565b60006020828403121561266d5761266c61319b565b5b600082013567ffffffffffffffff81111561268b5761268a613196565b5b612697848285016123b6565b91505092915050565b6000602082840312156126b6576126b561319b565b5b60006126c4848285016123f9565b91505092915050565b6000602082840312156126e3576126e261319b565b5b60006126f18482850161240e565b91505092915050565b6000602082840312156127105761270f61319b565b5b600082013567ffffffffffffffff81111561272e5761272d613196565b5b61273a84828501612451565b91505092915050565b6000602082840312156127595761275861319b565b5b60006127678482850161247f565b91505092915050565b61277981612f4c565b82525050565b61278881612f5e565b82525050565b600061279982612e7f565b6127a38185612e95565b93506127b3818560208601612fdc565b6127bc816131a0565b840191505092915050565b60006127d282612e8a565b6127dc8185612ea6565b93506127ec818560208601612fdc565b6127f5816131a0565b840191505092915050565b600061280b82612e8a565b6128158185612eb7565b9350612825818560208601612fdc565b80840191505092915050565b600061283e601483612ea6565b9150612849826131b1565b602082019050919050565b6000612861602b83612ea6565b915061286c826131da565b604082019050919050565b6000612884603283612ea6565b915061288f82613229565b604082019050919050565b60006128a7602683612ea6565b91506128b282613278565b604082019050919050565b60006128ca602583612ea6565b91506128d5826132c7565b604082019050919050565b60006128ed601c83612ea6565b91506128f882613316565b602082019050919050565b6000612910602483612ea6565b915061291b8261333f565b604082019050919050565b6000612933601983612ea6565b915061293e8261338e565b602082019050919050565b6000612956601083612ea6565b9150612961826133b7565b602082019050919050565b6000612979602983612ea6565b9150612984826133e0565b604082019050919050565b600061299c601983612ea6565b91506129a78261342f565b602082019050919050565b60006129bf603e83612ea6565b91506129ca82613458565b604082019050919050565b60006129e2602083612ea6565b91506129ed826134a7565b602082019050919050565b6000612a05602083612ea6565b9150612a10826134d0565b602082019050919050565b6000612a28601883612ea6565b9150612a33826134f9565b602082019050919050565b6000612a4b602183612ea6565b9150612a5682613522565b604082019050919050565b6000612a6e602c83612ea6565b9150612a7982613571565b604082019050919050565b6000612a91602e83612ea6565b9150612a9c826135c0565b604082019050919050565b612ab081612fb6565b82525050565b6000612ac28284612800565b915081905092915050565b6000602082019050612ae26000830184612770565b92915050565b6000608082019050612afd6000830187612770565b612b0a6020830186612770565b612b176040830185612aa7565b8181036060830152612b29818461278e565b905095945050505050565b6000602082019050612b49600083018461277f565b92915050565b60006020820190508181036000830152612b6981846127c7565b905092915050565b60006020820190508181036000830152612b8a81612831565b9050919050565b60006020820190508181036000830152612baa81612854565b9050919050565b60006020820190508181036000830152612bca81612877565b9050919050565b60006020820190508181036000830152612bea8161289a565b9050919050565b60006020820190508181036000830152612c0a816128bd565b9050919050565b60006020820190508181036000830152612c2a816128e0565b9050919050565b60006020820190508181036000830152612c4a81612903565b9050919050565b60006020820190508181036000830152612c6a81612926565b9050919050565b60006020820190508181036000830152612c8a81612949565b9050919050565b60006020820190508181036000830152612caa8161296c565b9050919050565b60006020820190508181036000830152612cca8161298f565b9050919050565b60006020820190508181036000830152612cea816129b2565b9050919050565b60006020820190508181036000830152612d0a816129d5565b9050919050565b60006020820190508181036000830152612d2a816129f8565b9050919050565b60006020820190508181036000830152612d4a81612a1b565b9050919050565b60006020820190508181036000830152612d6a81612a3e565b9050919050565b60006020820190508181036000830152612d8a81612a61565b9050919050565b60006020820190508181036000830152612daa81612a84565b9050919050565b6000602082019050612dc66000830184612aa7565b92915050565b6000612dd6612de7565b9050612de28282613041565b919050565b6000604051905090565b600067ffffffffffffffff821115612e0c57612e0b613158565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e3857612e37613158565b5b612e41826131a0565b9050602081019050919050565b600067ffffffffffffffff821115612e6957612e68613158565b5b612e72826131a0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ecd82612fb6565b9150612ed883612fb6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f0d57612f0c61309c565b5b828201905092915050565b6000612f2382612fb6565b9150612f2e83612fb6565b925082821015612f4157612f4061309c565b5b828203905092915050565b6000612f5782612f96565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612ffa578082015181840152602081019050612fdf565b83811115613009576000848401525b50505050565b6000600282049050600182168061302757607f821691505b6020821081141561303b5761303a6130cb565b5b50919050565b61304a826131a0565b810181811067ffffffffffffffff8211171561306957613068613158565b5b80604052505050565b600061307d82612fc0565b915060ff8214156130915761309061309c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4d61782032353520616464726573736573206174206f6e636500000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61361881612f4c565b811461362357600080fd5b50565b61362f81612f5e565b811461363a57600080fd5b50565b61364681612f6a565b811461365157600080fd5b50565b61365d81612fb6565b811461366857600080fd5b5056fea26469706673582212208e5d0a5cec907f6a3b4a2f3b09d903825b9d7474eab41993a559eedb46339acd64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063b88d4fde11610097578063e0df5b6f11610071578063e0df5b6f1461045d578063e985e9c514610479578063ef6fd7d2146104a9578063f2fde38b146104c55761018e565b8063b88d4fde146103f3578063c87b56dd1461040f578063d547cfb71461043f5761018e565b806370a0823114610357578063715018a6146103875780638456cb59146103915780638da5cb5b1461039b57806395d89b41146103b9578063a22cb465146103d75761018e565b80632f745c591161014b57806342842e0e1161012557806342842e0e146102bd5780634f6ccce7146102d95780635c975abb146103095780636352211e146103275761018e565b80632f745c59146102675780633f4ba83a1461029757806340d097c3146102a15761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a891906126a0565b6104e1565b6040516101ba9190612b34565b60405180910390f35b6101cb6104f3565b6040516101d89190612b4f565b60405180910390f35b6101fb60048036038101906101f69190612743565b610585565b6040516102089190612acd565b60405180910390f35b61022b60048036038101906102269190612617565b6105cb565b005b6102356106e3565b6040516102429190612db1565b60405180910390f35b61026560048036038101906102609190612501565b6106f0565b005b610281600480360381019061027c9190612617565b610750565b60405161028e9190612db1565b60405180910390f35b61029f6107f5565b005b6102bb60048036038101906102b69190612494565b610807565b005b6102d760048036038101906102d29190612501565b610835565b005b6102f360048036038101906102ee9190612743565b610855565b6040516103009190612db1565b60405180910390f35b6103116108c6565b60405161031e9190612b34565b60405180910390f35b610341600480360381019061033c9190612743565b6108dd565b60405161034e9190612acd565b60405180910390f35b610371600480360381019061036c9190612494565b61098f565b60405161037e9190612db1565b60405180910390f35b61038f610a47565b005b610399610a5b565b005b6103a3610a6d565b6040516103b09190612acd565b60405180910390f35b6103c1610a97565b6040516103ce9190612b4f565b60405180910390f35b6103f160048036038101906103ec91906125d7565b610b29565b005b61040d60048036038101906104089190612554565b610b3f565b005b61042960048036038101906104249190612743565b610ba1565b6040516104369190612b4f565b60405180910390f35b610447610c82565b6040516104549190612b4f565b60405180910390f35b610477600480360381019061047291906126fa565b610d10565b005b610493600480360381019061048e91906124c1565b610d32565b6040516104a09190612b34565b60405180910390f35b6104c360048036038101906104be9190612657565b610dc6565b005b6104df60048036038101906104da9190612494565b610e79565b005b60006104ec82610efd565b9050919050565b6060600080546105029061300f565b80601f016020809104026020016040519081016040528092919081815260200182805461052e9061300f565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b600061059082610f77565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d6826108dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e90612d51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610666610fc2565b73ffffffffffffffffffffffffffffffffffffffff16148061069557506106948161068f610fc2565b610d32565b5b6106d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cb90612cd1565b60405180910390fd5b6106de8383610fca565b505050565b6000600880549050905090565b6107016106fb610fc2565b82611083565b610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073790612d91565b60405180910390fd5b61074b838383611118565b505050565b600061075b8361098f565b821061079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390612b91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107fd61137f565b6108056113fd565b565b61080f61137f565b600061081b600b611460565b9050610827600b61146e565b6108318282611484565b5050565b61085083838360405180602001604052806000815250610b3f565b505050565b600061085f6106e3565b82106108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612d71565b60405180910390fd5b600882815481106108b4576108b3613129565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d90612d31565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f790612c91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a4f61137f565b610a5960006114a2565b565b610a6361137f565b610a6b611568565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610aa69061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad29061300f565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b5050505050905090565b610b3b610b34610fc2565b83836115cb565b5050565b610b50610b4a610fc2565b83611083565b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690612d91565b60405180910390fd5b610b9b84848484611738565b50505050565b6060610bac82610f77565b6000600c8054610bbb9061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610be79061300f565b8015610c345780601f10610c0957610100808354040283529160200191610c34565b820191906000526020600020905b815481529060010190602001808311610c1757829003601f168201915b505050505090506000815111610c595760405180602001604052806000815250610c7a565b80604051602001610c6a9190612ab6565b6040516020818303038152906040525b915050919050565b600c8054610c8f9061300f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb9061300f565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b505050505081565b610d1861137f565b80600c9080519060200190610d2e92919061220a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610dce61137f565b60ff81511115610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90612cb1565b60405180910390fd5b60005b81518160ff161015610e75576000610e2e600b611460565b9050610e3a600b61146e565b610e61838360ff1681518110610e5357610e52613129565b5b602002602001015182611484565b508080610e6d90613072565b915050610e16565b5050565b610e8161137f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890612bd1565b60405180910390fd5b610efa816114a2565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f705750610f6f82611794565b5b9050919050565b610f8081611876565b610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690612d31565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661103d836108dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061108f836108dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110d157506110d08185610d32565b5b8061110f57508373ffffffffffffffffffffffffffffffffffffffff166110f784610585565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611138826108dd565b73ffffffffffffffffffffffffffffffffffffffff161461118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bf1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f590612c31565b60405180910390fd5b6112098383836118e2565b611214600082610fca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112649190612f18565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112bb9190612ec2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461137a8383836118fa565b505050565b611387610fc2565b73ffffffffffffffffffffffffffffffffffffffff166113a5610a6d565b73ffffffffffffffffffffffffffffffffffffffff16146113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290612d11565b60405180910390fd5b565b6114056118ff565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611449610fc2565b6040516114569190612acd565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b61149e828260405180602001604052806000815250611948565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6115706119a3565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115b4610fc2565b6040516115c19190612acd565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612c51565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172b9190612b34565b60405180910390a3505050565b611743848484611118565b61174f848484846119ed565b61178e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178590612bb1565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061185f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061186f575061186e82611b84565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6118ea6119a3565b6118f5838383611bee565b505050565b505050565b6119076108c6565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612b71565b60405180910390fd5b565b6119528383611d02565b61195f60008484846119ed565b61199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590612bb1565b60405180910390fd5b505050565b6119ab6108c6565b156119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290612c71565b60405180910390fd5b565b6000611a0e8473ffffffffffffffffffffffffffffffffffffffff16611edc565b15611b77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a37610fc2565b8786866040518563ffffffff1660e01b8152600401611a599493929190612ae8565b602060405180830381600087803b158015611a7357600080fd5b505af1925050508015611aa457506040513d601f19601f82011682018060405250810190611aa191906126cd565b60015b611b27573d8060008114611ad4576040519150601f19603f3d011682016040523d82523d6000602084013e611ad9565b606091505b50600081511415611b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1690612bb1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b7c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bf9838383611eff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c3c57611c3781611f04565b611c7b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611c7a57611c798382611f4d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbe57611cb9816120ba565b611cfd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611cfc57611cfb828261218b565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990612cf1565b60405180910390fd5b611d7b81611876565b15611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db290612c11565b60405180910390fd5b611dc7600083836118e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e179190612ec2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed8600083836118fa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611f5a8461098f565b611f649190612f18565b9050600060076000848152602001908152602001600020549050818114612049576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506120ce9190612f18565b90506000600960008481526020019081526020016000205490506000600883815481106120fe576120fd613129565b5b9060005260206000200154905080600883815481106121205761211f613129565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061216f5761216e6130fa565b5b6001900381819060005260206000200160009055905550505050565b60006121968361098f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546122169061300f565b90600052602060002090601f016020900481019282612238576000855561227f565b82601f1061225157805160ff191683800117855561227f565b8280016001018555821561227f579182015b8281111561227e578251825591602001919060010190612263565b5b50905061228c9190612290565b5090565b5b808211156122a9576000816000905550600101612291565b5090565b60006122c06122bb84612df1565b612dcc565b905080838252602082019050828560208602820111156122e3576122e261318c565b5b60005b8581101561231357816122f988826123a1565b8452602084019350602083019250506001810190506122e6565b5050509392505050565b600061233061232b84612e1d565b612dcc565b90508281526020810184848401111561234c5761234b613191565b5b612357848285612fcd565b509392505050565b600061237261236d84612e4e565b612dcc565b90508281526020810184848401111561238e5761238d613191565b5b612399848285612fcd565b509392505050565b6000813590506123b08161360f565b92915050565b600082601f8301126123cb576123ca613187565b5b81356123db8482602086016122ad565b91505092915050565b6000813590506123f381613626565b92915050565b6000813590506124088161363d565b92915050565b60008151905061241d8161363d565b92915050565b600082601f83011261243857612437613187565b5b813561244884826020860161231d565b91505092915050565b600082601f83011261246657612465613187565b5b813561247684826020860161235f565b91505092915050565b60008135905061248e81613654565b92915050565b6000602082840312156124aa576124a961319b565b5b60006124b8848285016123a1565b91505092915050565b600080604083850312156124d8576124d761319b565b5b60006124e6858286016123a1565b92505060206124f7858286016123a1565b9150509250929050565b60008060006060848603121561251a5761251961319b565b5b6000612528868287016123a1565b9350506020612539868287016123a1565b925050604061254a8682870161247f565b9150509250925092565b6000806000806080858703121561256e5761256d61319b565b5b600061257c878288016123a1565b945050602061258d878288016123a1565b935050604061259e8782880161247f565b925050606085013567ffffffffffffffff8111156125bf576125be613196565b5b6125cb87828801612423565b91505092959194509250565b600080604083850312156125ee576125ed61319b565b5b60006125fc858286016123a1565b925050602061260d858286016123e4565b9150509250929050565b6000806040838503121561262e5761262d61319b565b5b600061263c858286016123a1565b925050602061264d8582860161247f565b9150509250929050565b60006020828403121561266d5761266c61319b565b5b600082013567ffffffffffffffff81111561268b5761268a613196565b5b612697848285016123b6565b91505092915050565b6000602082840312156126b6576126b561319b565b5b60006126c4848285016123f9565b91505092915050565b6000602082840312156126e3576126e261319b565b5b60006126f18482850161240e565b91505092915050565b6000602082840312156127105761270f61319b565b5b600082013567ffffffffffffffff81111561272e5761272d613196565b5b61273a84828501612451565b91505092915050565b6000602082840312156127595761275861319b565b5b60006127678482850161247f565b91505092915050565b61277981612f4c565b82525050565b61278881612f5e565b82525050565b600061279982612e7f565b6127a38185612e95565b93506127b3818560208601612fdc565b6127bc816131a0565b840191505092915050565b60006127d282612e8a565b6127dc8185612ea6565b93506127ec818560208601612fdc565b6127f5816131a0565b840191505092915050565b600061280b82612e8a565b6128158185612eb7565b9350612825818560208601612fdc565b80840191505092915050565b600061283e601483612ea6565b9150612849826131b1565b602082019050919050565b6000612861602b83612ea6565b915061286c826131da565b604082019050919050565b6000612884603283612ea6565b915061288f82613229565b604082019050919050565b60006128a7602683612ea6565b91506128b282613278565b604082019050919050565b60006128ca602583612ea6565b91506128d5826132c7565b604082019050919050565b60006128ed601c83612ea6565b91506128f882613316565b602082019050919050565b6000612910602483612ea6565b915061291b8261333f565b604082019050919050565b6000612933601983612ea6565b915061293e8261338e565b602082019050919050565b6000612956601083612ea6565b9150612961826133b7565b602082019050919050565b6000612979602983612ea6565b9150612984826133e0565b604082019050919050565b600061299c601983612ea6565b91506129a78261342f565b602082019050919050565b60006129bf603e83612ea6565b91506129ca82613458565b604082019050919050565b60006129e2602083612ea6565b91506129ed826134a7565b602082019050919050565b6000612a05602083612ea6565b9150612a10826134d0565b602082019050919050565b6000612a28601883612ea6565b9150612a33826134f9565b602082019050919050565b6000612a4b602183612ea6565b9150612a5682613522565b604082019050919050565b6000612a6e602c83612ea6565b9150612a7982613571565b604082019050919050565b6000612a91602e83612ea6565b9150612a9c826135c0565b604082019050919050565b612ab081612fb6565b82525050565b6000612ac28284612800565b915081905092915050565b6000602082019050612ae26000830184612770565b92915050565b6000608082019050612afd6000830187612770565b612b0a6020830186612770565b612b176040830185612aa7565b8181036060830152612b29818461278e565b905095945050505050565b6000602082019050612b49600083018461277f565b92915050565b60006020820190508181036000830152612b6981846127c7565b905092915050565b60006020820190508181036000830152612b8a81612831565b9050919050565b60006020820190508181036000830152612baa81612854565b9050919050565b60006020820190508181036000830152612bca81612877565b9050919050565b60006020820190508181036000830152612bea8161289a565b9050919050565b60006020820190508181036000830152612c0a816128bd565b9050919050565b60006020820190508181036000830152612c2a816128e0565b9050919050565b60006020820190508181036000830152612c4a81612903565b9050919050565b60006020820190508181036000830152612c6a81612926565b9050919050565b60006020820190508181036000830152612c8a81612949565b9050919050565b60006020820190508181036000830152612caa8161296c565b9050919050565b60006020820190508181036000830152612cca8161298f565b9050919050565b60006020820190508181036000830152612cea816129b2565b9050919050565b60006020820190508181036000830152612d0a816129d5565b9050919050565b60006020820190508181036000830152612d2a816129f8565b9050919050565b60006020820190508181036000830152612d4a81612a1b565b9050919050565b60006020820190508181036000830152612d6a81612a3e565b9050919050565b60006020820190508181036000830152612d8a81612a61565b9050919050565b60006020820190508181036000830152612daa81612a84565b9050919050565b6000602082019050612dc66000830184612aa7565b92915050565b6000612dd6612de7565b9050612de28282613041565b919050565b6000604051905090565b600067ffffffffffffffff821115612e0c57612e0b613158565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612e3857612e37613158565b5b612e41826131a0565b9050602081019050919050565b600067ffffffffffffffff821115612e6957612e68613158565b5b612e72826131a0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ecd82612fb6565b9150612ed883612fb6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f0d57612f0c61309c565b5b828201905092915050565b6000612f2382612fb6565b9150612f2e83612fb6565b925082821015612f4157612f4061309c565b5b828203905092915050565b6000612f5782612f96565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612ffa578082015181840152602081019050612fdf565b83811115613009576000848401525b50505050565b6000600282049050600182168061302757607f821691505b6020821081141561303b5761303a6130cb565b5b50919050565b61304a826131a0565b810181811067ffffffffffffffff8211171561306957613068613158565b5b80604052505050565b600061307d82612fc0565b915060ff8214156130915761309061309c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4d61782032353520616464726573736573206174206f6e636500000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61361881612f4c565b811461362357600080fd5b50565b61362f81612f5e565b811461363a57600080fd5b50565b61364681612f6a565b811461365157600080fd5b50565b61365d81612fb6565b811461366857600080fd5b5056fea26469706673582212208e5d0a5cec907f6a3b4a2f3b09d903825b9d7474eab41993a559eedb46339acd64736f6c63430008070033
Deployed Bytecode Sourcemap
50351:1904:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52040:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30864:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32377:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31894:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44770:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33077:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44438:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50722:65;;;:::i;:::-;;50795:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33484:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44960:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9228:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30575:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30306:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6738:103;;;:::i;:::-;;50653:61;;;:::i;:::-;;6090:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31033:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32620:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33740:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51699:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50543:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51583:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32846:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50983:357;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6996:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52040:212;52179:4;52208:36;52232:11;52208:23;:36::i;:::-;52201:43;;52040:212;;;:::o;30864:100::-;30918:13;30951:5;30944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30864:100;:::o;32377:171::-;32453:7;32473:23;32488:7;32473:14;:23::i;:::-;32516:15;:24;32532:7;32516:24;;;;;;;;;;;;;;;;;;;;;32509:31;;32377:171;;;:::o;31894:417::-;31975:13;31991:23;32006:7;31991:14;:23::i;:::-;31975:39;;32039:5;32033:11;;:2;:11;;;;32025:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32133:5;32117:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32142:37;32159:5;32166:12;:10;:12::i;:::-;32142:16;:37::i;:::-;32117:62;32095:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;32282:21;32291:2;32295:7;32282:8;:21::i;:::-;31964:347;31894:417;;:::o;44770:113::-;44831:7;44858:10;:17;;;;44851:24;;44770:113;:::o;33077:336::-;33272:41;33291:12;:10;:12::i;:::-;33305:7;33272:18;:41::i;:::-;33264:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33377:28;33387:4;33393:2;33397:7;33377:9;:28::i;:::-;33077:336;;;:::o;44438:256::-;44535:7;44571:23;44588:5;44571:16;:23::i;:::-;44563:5;:31;44555:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44660:12;:19;44673:5;44660:19;;;;;;;;;;;;;;;:26;44680:5;44660:26;;;;;;;;;;;;44653:33;;44438:256;;;;:::o;50722:65::-;5976:13;:11;:13::i;:::-;50769:10:::1;:8;:10::i;:::-;50722:65::o:0;50795:180::-;5976:13;:11;:13::i;:::-;50853:15:::1;50871:25;:15;:23;:25::i;:::-;50853:43;;50907:27;:15;:25;:27::i;:::-;50945:22;50955:2;50959:7;50945:9;:22::i;:::-;50842:133;50795:180:::0;:::o;33484:185::-;33622:39;33639:4;33645:2;33649:7;33622:39;;;;;;;;;;;;:16;:39::i;:::-;33484:185;;;:::o;44960:233::-;45035:7;45071:30;:28;:30::i;:::-;45063:5;:38;45055:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45168:10;45179:5;45168:17;;;;;;;;:::i;:::-;;;;;;;;;;45161:24;;44960:233;;;:::o;9228:86::-;9275:4;9299:7;;;;;;;;;;;9292:14;;9228:86;:::o;30575:222::-;30647:7;30667:13;30683:7;:16;30691:7;30683:16;;;;;;;;;;;;;;;;;;;;;30667:32;;30735:1;30718:19;;:5;:19;;;;30710:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;30784:5;30777:12;;;30575:222;;;:::o;30306:207::-;30378:7;30423:1;30406:19;;:5;:19;;;;30398:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30489:9;:16;30499:5;30489:16;;;;;;;;;;;;;;;;30482:23;;30306:207;;;:::o;6738:103::-;5976:13;:11;:13::i;:::-;6803:30:::1;6830:1;6803:18;:30::i;:::-;6738:103::o:0;50653:61::-;5976:13;:11;:13::i;:::-;50698:8:::1;:6;:8::i;:::-;50653:61::o:0;6090:87::-;6136:7;6163:6;;;;;;;;;;;6156:13;;6090:87;:::o;31033:104::-;31089:13;31122:7;31115:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31033:104;:::o;32620:155::-;32715:52;32734:12;:10;:12::i;:::-;32748:8;32758;32715:18;:52::i;:::-;32620:155;;:::o;33740:323::-;33914:41;33933:12;:10;:12::i;:::-;33947:7;33914:18;:41::i;:::-;33906:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34017:38;34031:4;34037:2;34041:7;34050:4;34017:13;:38::i;:::-;33740:323;;;;:::o;51699:263::-;51772:13;51798:23;51813:7;51798:14;:23::i;:::-;51834:21;51858:12;51834:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51912:1;51894:7;51888:21;:25;:66;;;;;;;;;;;;;;;;;51940:7;51923:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;51888:66;51881:73;;;51699:263;;;:::o;50543:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51583:108::-;5976:13;:11;:13::i;:::-;51672:9:::1;51657:12;:24;;;;;;;;;;;;:::i;:::-;;51583:108:::0;:::o;32846:164::-;32943:4;32967:18;:25;32986:5;32967:25;;;;;;;;;;;;;;;:35;32993:8;32967:35;;;;;;;;;;;;;;;;;;;;;;;;;32960:42;;32846:164;;;;:::o;50983:357::-;5976:13;:11;:13::i;:::-;51081:3:::1;51065:5;:12;:19;;51057:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51132:7;51127:196;51149:5;:12;51145:1;:16;;;51127:196;;;51183:15;51201:25;:15;:23;:25::i;:::-;51183:43;;51241:27;:15;:25;:27::i;:::-;51283:28;51293:5;51299:1;51293:8;;;;;;;;;;:::i;:::-;;;;;;;;51303:7;51283:9;:28::i;:::-;51168:155;51163:3;;;;;:::i;:::-;;;;51127:196;;;;50983:357:::0;:::o;6996:201::-;5976:13;:11;:13::i;:::-;7105:1:::1;7085:22;;:8;:22;;;;7077:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7161:28;7180:8;7161:18;:28::i;:::-;6996:201:::0;:::o;44130:224::-;44232:4;44271:35;44256:50;;;:11;:50;;;;:90;;;;44310:36;44334:11;44310:23;:36::i;:::-;44256:90;44249:97;;44130:224;;;:::o;40352:135::-;40434:16;40442:7;40434;:16::i;:::-;40426:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;40352:135;:::o;4641:98::-;4694:7;4721:10;4714:17;;4641:98;:::o;39631:174::-;39733:2;39706:15;:24;39722:7;39706:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39789:7;39785:2;39751:46;;39760:23;39775:7;39760:14;:23::i;:::-;39751:46;;;;;;;;;;;;39631:174;;:::o;35864:264::-;35957:4;35974:13;35990:23;36005:7;35990:14;:23::i;:::-;35974:39;;36043:5;36032:16;;:7;:16;;;:52;;;;36052:32;36069:5;36076:7;36052:16;:32::i;:::-;36032:52;:87;;;;36112:7;36088:31;;:20;36100:7;36088:11;:20::i;:::-;:31;;;36032:87;36024:96;;;35864:264;;;;:::o;38887:625::-;39046:4;39019:31;;:23;39034:7;39019:14;:23::i;:::-;:31;;;39011:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39125:1;39111:16;;:2;:16;;;;39103:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39181:39;39202:4;39208:2;39212:7;39181:20;:39::i;:::-;39285:29;39302:1;39306:7;39285:8;:29::i;:::-;39346:1;39327:9;:15;39337:4;39327:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39375:1;39358:9;:13;39368:2;39358:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39406:2;39387:7;:16;39395:7;39387:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39445:7;39441:2;39426:27;;39435:4;39426:27;;;;;;;;;;;;39466:38;39486:4;39492:2;39496:7;39466:19;:38::i;:::-;38887:625;;;:::o;6255:132::-;6330:12;:10;:12::i;:::-;6319:23;;:7;:5;:7::i;:::-;:23;;;6311:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6255:132::o;10083:120::-;9092:16;:14;:16::i;:::-;10152:5:::1;10142:7;;:15;;;;;;;;;;;;;;;;;;10173:22;10182:12;:10;:12::i;:::-;10173:22;;;;;;:::i;:::-;;;;;;;;10083:120::o:0;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;36470:110::-;36546:26;36556:2;36560:7;36546:26;;;;;;;;;;;;:9;:26::i;:::-;36470:110;;:::o;7357:191::-;7431:16;7450:6;;;;;;;;;;;7431:25;;7476:8;7467:6;;:17;;;;;;;;;;;;;;;;;;7531:8;7500:40;;7521:8;7500:40;;;;;;;;;;;;7420:128;7357:191;:::o;9824:118::-;8833:19;:17;:19::i;:::-;9894:4:::1;9884:7;;:14;;;;;;;;;;;;;;;;;;9914:20;9921:12;:10;:12::i;:::-;9914:20;;;;;;:::i;:::-;;;;;;;;9824:118::o:0;39948:315::-;40103:8;40094:17;;:5;:17;;;;40086:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40190:8;40152:18;:25;40171:5;40152:25;;;;;;;;;;;;;;;:35;40178:8;40152:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40236:8;40214:41;;40229:5;40214:41;;;40246:8;40214:41;;;;;;:::i;:::-;;;;;;;;39948:315;;;:::o;34944:313::-;35100:28;35110:4;35116:2;35120:7;35100:9;:28::i;:::-;35147:47;35170:4;35176:2;35180:7;35189:4;35147:22;:47::i;:::-;35139:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34944:313;;;;:::o;29937:305::-;30039:4;30091:25;30076:40;;;:11;:40;;;;:105;;;;30148:33;30133:48;;;:11;:48;;;;30076:105;:158;;;;30198:36;30222:11;30198:23;:36::i;:::-;30076:158;30056:178;;29937:305;;;:::o;35570:127::-;35635:4;35687:1;35659:30;;:7;:16;35667:7;35659:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35652:37;;35570:127;;;:::o;51348:227::-;8833:19;:17;:19::i;:::-;51522:45:::1;51549:4;51555:2;51559:7;51522:26;:45::i;:::-;51348:227:::0;;;:::o;42987:125::-;;;;:::o;9572:108::-;9639:8;:6;:8::i;:::-;9631:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:108::o;36807:319::-;36936:18;36942:2;36946:7;36936:5;:18::i;:::-;36987:53;37018:1;37022:2;37026:7;37035:4;36987:22;:53::i;:::-;36965:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;36807:319;;;:::o;9387:108::-;9458:8;:6;:8::i;:::-;9457:9;9449:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9387:108::o;41051:853::-;41205:4;41226:15;:2;:13;;;:15::i;:::-;41222:675;;;41278:2;41262:36;;;41299:12;:10;:12::i;:::-;41313:4;41319:7;41328:4;41262:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41258:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41520:1;41503:6;:13;:18;41499:328;;;41546:60;;;;;;;;;;:::i;:::-;;;;;;;;41499:328;41777:6;41771:13;41762:6;41758:2;41754:15;41747:38;41258:584;41394:41;;;41384:51;;;:6;:51;;;;41377:58;;;;;41222:675;41881:4;41874:11;;41051:853;;;;;;;:::o;21599:157::-;21684:4;21723:25;21708:40;;;:11;:40;;;;21701:47;;21599:157;;;:::o;45806:589::-;45950:45;45977:4;45983:2;45987:7;45950:26;:45::i;:::-;46028:1;46012:18;;:4;:18;;;46008:187;;;46047:40;46079:7;46047:31;:40::i;:::-;46008:187;;;46117:2;46109:10;;:4;:10;;;46105:90;;46136:47;46169:4;46175:7;46136:32;:47::i;:::-;46105:90;46008:187;46223:1;46209:16;;:2;:16;;;46205:183;;;46242:45;46279:7;46242:36;:45::i;:::-;46205:183;;;46315:4;46309:10;;:2;:10;;;46305:83;;46336:40;46364:2;46368:7;46336:27;:40::i;:::-;46305:83;46205:183;45806:589;;;:::o;37462:439::-;37556:1;37542:16;;:2;:16;;;;37534:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37615:16;37623:7;37615;:16::i;:::-;37614:17;37606:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37677:45;37706:1;37710:2;37714:7;37677:20;:45::i;:::-;37752:1;37735:9;:13;37745:2;37735:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37783:2;37764:7;:16;37772:7;37764:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37828:7;37824:2;37803:33;;37820:1;37803:33;;;;;;;;;;;;37849:44;37877:1;37881:2;37885:7;37849:19;:44::i;:::-;37462:439;;:::o;11443:326::-;11503:4;11760:1;11738:7;:19;;;:23;11731:30;;11443:326;;;:::o;42476:126::-;;;;:::o;47118:164::-;47222:10;:17;;;;47195:15;:24;47211:7;47195:24;;;;;;;;;;;:44;;;;47250:10;47266:7;47250:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47118:164;:::o;47909:988::-;48175:22;48225:1;48200:22;48217:4;48200:16;:22::i;:::-;:26;;;;:::i;:::-;48175:51;;48237:18;48258:17;:26;48276:7;48258:26;;;;;;;;;;;;48237:47;;48405:14;48391:10;:28;48387:328;;48436:19;48458:12;:18;48471:4;48458:18;;;;;;;;;;;;;;;:34;48477:14;48458:34;;;;;;;;;;;;48436:56;;48542:11;48509:12;:18;48522:4;48509:18;;;;;;;;;;;;;;;:30;48528:10;48509:30;;;;;;;;;;;:44;;;;48659:10;48626:17;:30;48644:11;48626:30;;;;;;;;;;;:43;;;;48421:294;48387:328;48811:17;:26;48829:7;48811:26;;;;;;;;;;;48804:33;;;48855:12;:18;48868:4;48855:18;;;;;;;;;;;;;;;:34;48874:14;48855:34;;;;;;;;;;;48848:41;;;47990:907;;47909:988;;:::o;49192:1079::-;49445:22;49490:1;49470:10;:17;;;;:21;;;;:::i;:::-;49445:46;;49502:18;49523:15;:24;49539:7;49523:24;;;;;;;;;;;;49502:45;;49874:19;49896:10;49907:14;49896:26;;;;;;;;:::i;:::-;;;;;;;;;;49874:48;;49960:11;49935:10;49946;49935:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50071:10;50040:15;:28;50056:11;50040:28;;;;;;;;;;;:41;;;;50212:15;:24;50228:7;50212:24;;;;;;;;;;;50205:31;;;50247:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49263:1008;;;49192:1079;:::o;46696:221::-;46781:14;46798:20;46815:2;46798:16;:20::i;:::-;46781:37;;46856:7;46829:12;:16;46842:2;46829:16;;;;;;;;;;;;;;;:24;46846:6;46829:24;;;;;;;;;;;:34;;;;46903:6;46874:17;:26;46892:7;46874:26;;;;;;;;;;;:35;;;;46770:147;46696:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7303:327;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7636:349;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:119;;;8115:79;;:::i;:::-;8077:119;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:117;;;8315:79;;:::i;:::-;8279:117;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;7991:509;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:119;;;8620:79;;:::i;:::-;8582:119;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8506:329;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8841:118;;:::o;8965:109::-;9046:21;9061:5;9046:21;:::i;:::-;9041:3;9034:34;8965:109;;:::o;9080:360::-;9166:3;9194:38;9226:5;9194:38;:::i;:::-;9248:70;9311:6;9306:3;9248:70;:::i;:::-;9241:77;;9327:52;9372:6;9367:3;9360:4;9353:5;9349:16;9327:52;:::i;:::-;9404:29;9426:6;9404:29;:::i;:::-;9399:3;9395:39;9388:46;;9170:270;9080:360;;;;:::o;9446:364::-;9534:3;9562:39;9595:5;9562:39;:::i;:::-;9617:71;9681:6;9676:3;9617:71;:::i;:::-;9610:78;;9697:52;9742:6;9737:3;9730:4;9723:5;9719:16;9697:52;:::i;:::-;9774:29;9796:6;9774:29;:::i;:::-;9769:3;9765:39;9758:46;;9538:272;9446:364;;;;:::o;9816:377::-;9922:3;9950:39;9983:5;9950:39;:::i;:::-;10005:89;10087:6;10082:3;10005:89;:::i;:::-;9998:96;;10103:52;10148:6;10143:3;10136:4;10129:5;10125:16;10103:52;:::i;:::-;10180:6;10175:3;10171:16;10164:23;;9926:267;9816:377;;;;:::o;10199:366::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10199:366;;;:::o;10571:::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10571:366;;;:::o;10943:::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;10943:366;;;:::o;11315:::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11315:366;;;:::o;11687:::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11687:366;;;:::o;12059:::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12059:366;;;:::o;12431:::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12431:366;;;:::o;12803:::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12803:366;;;:::o;13175:::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13175:366;;;:::o;13547:::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13547:366;;;:::o;13919:::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;13919:366;;;:::o;14291:::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14291:366;;;:::o;14663:::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14663:366;;;:::o;15035:::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15035:366;;;:::o;15407:::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15779:366;;;:::o;16151:::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16151:366;;;:::o;16523:::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16523:366;;;:::o;16895:118::-;16982:24;17000:5;16982:24;:::i;:::-;16977:3;16970:37;16895:118;;:::o;17019:275::-;17151:3;17173:95;17264:3;17255:6;17173:95;:::i;:::-;17166:102;;17285:3;17278:10;;17019:275;;;;:::o;17300:222::-;17393:4;17431:2;17420:9;17416:18;17408:26;;17444:71;17512:1;17501:9;17497:17;17488:6;17444:71;:::i;:::-;17300:222;;;;:::o;17528:640::-;17723:4;17761:3;17750:9;17746:19;17738:27;;17775:71;17843:1;17832:9;17828:17;17819:6;17775:71;:::i;:::-;17856:72;17924:2;17913:9;17909:18;17900:6;17856:72;:::i;:::-;17938;18006:2;17995:9;17991:18;17982:6;17938:72;:::i;:::-;18057:9;18051:4;18047:20;18042:2;18031:9;18027:18;18020:48;18085:76;18156:4;18147:6;18085:76;:::i;:::-;18077:84;;17528:640;;;;;;;:::o;18174:210::-;18261:4;18299:2;18288:9;18284:18;18276:26;;18312:65;18374:1;18363:9;18359:17;18350:6;18312:65;:::i;:::-;18174:210;;;;:::o;18390:313::-;18503:4;18541:2;18530:9;18526:18;18518:26;;18590:9;18584:4;18580:20;18576:1;18565:9;18561:17;18554:47;18618:78;18691:4;18682:6;18618:78;:::i;:::-;18610:86;;18390:313;;;;:::o;18709:419::-;18875:4;18913:2;18902:9;18898:18;18890:26;;18962:9;18956:4;18952:20;18948:1;18937:9;18933:17;18926:47;18990:131;19116:4;18990:131;:::i;:::-;18982:139;;18709:419;;;:::o;19134:::-;19300:4;19338:2;19327:9;19323:18;19315:26;;19387:9;19381:4;19377:20;19373:1;19362:9;19358:17;19351:47;19415:131;19541:4;19415:131;:::i;:::-;19407:139;;19134:419;;;:::o;19559:::-;19725:4;19763:2;19752:9;19748:18;19740:26;;19812:9;19806:4;19802:20;19798:1;19787:9;19783:17;19776:47;19840:131;19966:4;19840:131;:::i;:::-;19832:139;;19559:419;;;:::o;19984:::-;20150:4;20188:2;20177:9;20173:18;20165:26;;20237:9;20231:4;20227:20;20223:1;20212:9;20208:17;20201:47;20265:131;20391:4;20265:131;:::i;:::-;20257:139;;19984:419;;;:::o;20409:::-;20575:4;20613:2;20602:9;20598:18;20590:26;;20662:9;20656:4;20652:20;20648:1;20637:9;20633:17;20626:47;20690:131;20816:4;20690:131;:::i;:::-;20682:139;;20409:419;;;:::o;20834:::-;21000:4;21038:2;21027:9;21023:18;21015:26;;21087:9;21081:4;21077:20;21073:1;21062:9;21058:17;21051:47;21115:131;21241:4;21115:131;:::i;:::-;21107:139;;20834:419;;;:::o;21259:::-;21425:4;21463:2;21452:9;21448:18;21440:26;;21512:9;21506:4;21502:20;21498:1;21487:9;21483:17;21476:47;21540:131;21666:4;21540:131;:::i;:::-;21532:139;;21259:419;;;:::o;21684:::-;21850:4;21888:2;21877:9;21873:18;21865:26;;21937:9;21931:4;21927:20;21923:1;21912:9;21908:17;21901:47;21965:131;22091:4;21965:131;:::i;:::-;21957:139;;21684:419;;;:::o;22109:::-;22275:4;22313:2;22302:9;22298:18;22290:26;;22362:9;22356:4;22352:20;22348:1;22337:9;22333:17;22326:47;22390:131;22516:4;22390:131;:::i;:::-;22382:139;;22109:419;;;:::o;22534:::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22787:9;22781:4;22777:20;22773:1;22762:9;22758:17;22751:47;22815:131;22941:4;22815:131;:::i;:::-;22807:139;;22534:419;;;:::o;22959:::-;23125:4;23163:2;23152:9;23148:18;23140:26;;23212:9;23206:4;23202:20;23198:1;23187:9;23183:17;23176:47;23240:131;23366:4;23240:131;:::i;:::-;23232:139;;22959:419;;;:::o;23384:::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:131;23791:4;23665:131;:::i;:::-;23657:139;;23384:419;;;:::o;23809:::-;23975:4;24013:2;24002:9;23998:18;23990:26;;24062:9;24056:4;24052:20;24048:1;24037:9;24033:17;24026:47;24090:131;24216:4;24090:131;:::i;:::-;24082:139;;23809:419;;;:::o;24234:::-;24400:4;24438:2;24427:9;24423:18;24415:26;;24487:9;24481:4;24477:20;24473:1;24462:9;24458:17;24451:47;24515:131;24641:4;24515:131;:::i;:::-;24507:139;;24234:419;;;:::o;24659:::-;24825:4;24863:2;24852:9;24848:18;24840:26;;24912:9;24906:4;24902:20;24898:1;24887:9;24883:17;24876:47;24940:131;25066:4;24940:131;:::i;:::-;24932:139;;24659:419;;;:::o;25084:::-;25250:4;25288:2;25277:9;25273:18;25265:26;;25337:9;25331:4;25327:20;25323:1;25312:9;25308:17;25301:47;25365:131;25491:4;25365:131;:::i;:::-;25357:139;;25084:419;;;:::o;25509:::-;25675:4;25713:2;25702:9;25698:18;25690:26;;25762:9;25756:4;25752:20;25748:1;25737:9;25733:17;25726:47;25790:131;25916:4;25790:131;:::i;:::-;25782:139;;25509:419;;;:::o;25934:::-;26100:4;26138:2;26127:9;26123:18;26115:26;;26187:9;26181:4;26177:20;26173:1;26162:9;26158:17;26151:47;26215:131;26341:4;26215:131;:::i;:::-;26207:139;;25934:419;;;:::o;26359:222::-;26452:4;26490:2;26479:9;26475:18;26467:26;;26503:71;26571:1;26560:9;26556:17;26547:6;26503:71;:::i;:::-;26359:222;;;;:::o;26587:129::-;26621:6;26648:20;;:::i;:::-;26638:30;;26677:33;26705:4;26697:6;26677:33;:::i;:::-;26587:129;;;:::o;26722:75::-;26755:6;26788:2;26782:9;26772:19;;26722:75;:::o;26803:311::-;26880:4;26970:18;26962:6;26959:30;26956:56;;;26992:18;;:::i;:::-;26956:56;27042:4;27034:6;27030:17;27022:25;;27102:4;27096;27092:15;27084:23;;26803:311;;;:::o;27120:307::-;27181:4;27271:18;27263:6;27260:30;27257:56;;;27293:18;;:::i;:::-;27257:56;27331:29;27353:6;27331:29;:::i;:::-;27323:37;;27415:4;27409;27405:15;27397:23;;27120:307;;;:::o;27433:308::-;27495:4;27585:18;27577:6;27574:30;27571:56;;;27607:18;;:::i;:::-;27571:56;27645:29;27667:6;27645:29;:::i;:::-;27637:37;;27729:4;27723;27719:15;27711:23;;27433:308;;;:::o;27747:98::-;27798:6;27832:5;27826:12;27816:22;;27747:98;;;:::o;27851:99::-;27903:6;27937:5;27931:12;27921:22;;27851:99;;;:::o;27956:168::-;28039:11;28073:6;28068:3;28061:19;28113:4;28108:3;28104:14;28089:29;;27956:168;;;;:::o;28130:169::-;28214:11;28248:6;28243:3;28236:19;28288:4;28283:3;28279:14;28264:29;;28130:169;;;;:::o;28305:148::-;28407:11;28444:3;28429:18;;28305:148;;;;:::o;28459:305::-;28499:3;28518:20;28536:1;28518:20;:::i;:::-;28513:25;;28552:20;28570:1;28552:20;:::i;:::-;28547:25;;28706:1;28638:66;28634:74;28631:1;28628:81;28625:107;;;28712:18;;:::i;:::-;28625:107;28756:1;28753;28749:9;28742:16;;28459:305;;;;:::o;28770:191::-;28810:4;28830:20;28848:1;28830:20;:::i;:::-;28825:25;;28864:20;28882:1;28864:20;:::i;:::-;28859:25;;28903:1;28900;28897:8;28894:34;;;28908:18;;:::i;:::-;28894:34;28953:1;28950;28946:9;28938:17;;28770:191;;;;:::o;28967:96::-;29004:7;29033:24;29051:5;29033:24;:::i;:::-;29022:35;;28967:96;;;:::o;29069:90::-;29103:7;29146:5;29139:13;29132:21;29121:32;;29069:90;;;:::o;29165:149::-;29201:7;29241:66;29234:5;29230:78;29219:89;;29165:149;;;:::o;29320:126::-;29357:7;29397:42;29390:5;29386:54;29375:65;;29320:126;;;:::o;29452:77::-;29489:7;29518:5;29507:16;;29452:77;;;:::o;29535:86::-;29570:7;29610:4;29603:5;29599:16;29588:27;;29535:86;;;:::o;29627:154::-;29711:6;29706:3;29701;29688:30;29773:1;29764:6;29759:3;29755:16;29748:27;29627:154;;;:::o;29787:307::-;29855:1;29865:113;29879:6;29876:1;29873:13;29865:113;;;29964:1;29959:3;29955:11;29949:18;29945:1;29940:3;29936:11;29929:39;29901:2;29898:1;29894:10;29889:15;;29865:113;;;29996:6;29993:1;29990:13;29987:101;;;30076:1;30067:6;30062:3;30058:16;30051:27;29987:101;29836:258;29787:307;;;:::o;30100:320::-;30144:6;30181:1;30175:4;30171:12;30161:22;;30228:1;30222:4;30218:12;30249:18;30239:81;;30305:4;30297:6;30293:17;30283:27;;30239:81;30367:2;30359:6;30356:14;30336:18;30333:38;30330:84;;;30386:18;;:::i;:::-;30330:84;30151:269;30100:320;;;:::o;30426:281::-;30509:27;30531:4;30509:27;:::i;:::-;30501:6;30497:40;30639:6;30627:10;30624:22;30603:18;30591:10;30588:34;30585:62;30582:88;;;30650:18;;:::i;:::-;30582:88;30690:10;30686:2;30679:22;30469:238;30426:281;;:::o;30713:167::-;30750:3;30773:22;30789:5;30773:22;:::i;:::-;30764:31;;30817:4;30810:5;30807:15;30804:41;;;30825:18;;:::i;:::-;30804:41;30872:1;30865:5;30861:13;30854:20;;30713:167;;;:::o;30886:180::-;30934:77;30931:1;30924:88;31031:4;31028:1;31021:15;31055:4;31052:1;31045:15;31072:180;31120:77;31117:1;31110:88;31217:4;31214:1;31207:15;31241:4;31238:1;31231:15;31258:180;31306:77;31303:1;31296:88;31403:4;31400:1;31393:15;31427:4;31424:1;31417:15;31444:180;31492:77;31489:1;31482:88;31589:4;31586:1;31579:15;31613:4;31610:1;31603:15;31630:180;31678:77;31675:1;31668:88;31775:4;31772:1;31765:15;31799:4;31796:1;31789:15;31816:117;31925:1;31922;31915:12;31939:117;32048:1;32045;32038:12;32062:117;32171:1;32168;32161:12;32185:117;32294:1;32291;32284:12;32308:117;32417:1;32414;32407:12;32431:102;32472:6;32523:2;32519:7;32514:2;32507:5;32503:14;32499:28;32489:38;;32431:102;;;:::o;32539:170::-;32679:22;32675:1;32667:6;32663:14;32656:46;32539:170;:::o;32715:230::-;32855:34;32851:1;32843:6;32839:14;32832:58;32924:13;32919:2;32911:6;32907:15;32900:38;32715:230;:::o;32951:237::-;33091:34;33087:1;33079:6;33075:14;33068:58;33160:20;33155:2;33147:6;33143:15;33136:45;32951:237;:::o;33194:225::-;33334:34;33330:1;33322:6;33318:14;33311:58;33403:8;33398:2;33390:6;33386:15;33379:33;33194:225;:::o;33425:224::-;33565:34;33561:1;33553:6;33549:14;33542:58;33634:7;33629:2;33621:6;33617:15;33610:32;33425:224;:::o;33655:178::-;33795:30;33791:1;33783:6;33779:14;33772:54;33655:178;:::o;33839:223::-;33979:34;33975:1;33967:6;33963:14;33956:58;34048:6;34043:2;34035:6;34031:15;34024:31;33839:223;:::o;34068:175::-;34208:27;34204:1;34196:6;34192:14;34185:51;34068:175;:::o;34249:166::-;34389:18;34385:1;34377:6;34373:14;34366:42;34249:166;:::o;34421:228::-;34561:34;34557:1;34549:6;34545:14;34538:58;34630:11;34625:2;34617:6;34613:15;34606:36;34421:228;:::o;34655:175::-;34795:27;34791:1;34783:6;34779:14;34772:51;34655:175;:::o;34836:249::-;34976:34;34972:1;34964:6;34960:14;34953:58;35045:32;35040:2;35032:6;35028:15;35021:57;34836:249;:::o;35091:182::-;35231:34;35227:1;35219:6;35215:14;35208:58;35091:182;:::o;35279:::-;35419:34;35415:1;35407:6;35403:14;35396:58;35279:182;:::o;35467:174::-;35607:26;35603:1;35595:6;35591:14;35584:50;35467:174;:::o;35647:220::-;35787:34;35783:1;35775:6;35771:14;35764:58;35856:3;35851:2;35843:6;35839:15;35832:28;35647:220;:::o;35873:231::-;36013:34;36009:1;36001:6;35997:14;35990:58;36082:14;36077:2;36069:6;36065:15;36058:39;35873:231;:::o;36110:233::-;36250:34;36246:1;36238:6;36234:14;36227:58;36319:16;36314:2;36306:6;36302:15;36295:41;36110:233;:::o;36349:122::-;36422:24;36440:5;36422:24;:::i;:::-;36415:5;36412:35;36402:63;;36461:1;36458;36451:12;36402:63;36349:122;:::o;36477:116::-;36547:21;36562:5;36547:21;:::i;:::-;36540:5;36537:32;36527:60;;36583:1;36580;36573:12;36527:60;36477:116;:::o;36599:120::-;36671:23;36688:5;36671:23;:::i;:::-;36664:5;36661:34;36651:62;;36709:1;36706;36699:12;36651:62;36599:120;:::o;36725:122::-;36798:24;36816:5;36798:24;:::i;:::-;36791:5;36788:35;36778:63;;36837:1;36834;36827:12;36778:63;36725:122;:::o
Swarm Source
ipfs://8e5d0a5cec907f6a3b4a2f3b09d903825b9d7474eab41993a559eedb46339acd
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.