Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,639 LANGELS
Holders
1,014
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 LANGELSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LordAngelsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-04 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/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 v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/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 v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/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: contracts/Angel2.sol pragma solidity >=0.7.0 <0.9.0; contract LordAngelsNFT is ERC721Enumerable, Ownable { using Strings for uint256; string baseURI; string public baseExtension = ".json"; uint256 public maxSupply = 7777; bool public paused = false; mapping(address => uint256) private _ownedTokens; address lordAddress = 0x1fB50495005ab3cCaF22c5049072D4af5de4a1e7; constructor() ERC721("Lord Angels", "LANGELS") { setBaseURI("ipfs://QmTG3QJbTvRCDaj5BUya8bphYd4hJcJcDvcEkxZxvoaZxt/"); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function getTokens() private returns (uint256[] memory) { (bool status, bytes memory _data) = lordAddress.call( abi.encodeWithSignature("walletOfOwner(address)", msg.sender) ); require( status, "Sorry, we couldn't verify your tokens. Please try again later." ); uint256[] memory tokens = abi.decode(_data, (uint256[])); require( tokens.length > 0, "Sorry, but you don't have the required tokens to proceed with minting." ); return tokens; } function validateTokenIds( uint256[] memory _tokenIds, uint256[] memory _existTokenIds ) private pure returns (bool) { if (_tokenIds.length != _existTokenIds.length) { return false; } for (uint256 i = 0; i < _tokenIds.length; i++) { if (_tokenIds[i] != _existTokenIds[i]) { return false; } } return true; } // public function mint(uint256[] memory _tokenIds, uint256 _mintAmount) public { require(!paused, "The contract is paused."); require(_mintAmount > 0, "Invalid mint amount!"); uint256[] memory tokens = getTokens(); require( _tokenIds.length == tokens.length, "Invalid list of token ids!" ); require( validateTokenIds(_tokenIds, tokens), "Invalid list of token ids!" ); require( tokens.length - _ownedTokens[msg.sender] >= _mintAmount, "Sorry, but you don't have the required tokens to proceed with minting." ); uint256 supply = totalSupply(); for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } _ownedTokens[msg.sender] += _mintAmount; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } //only owner function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool status, ) = payable(owner()).call{value: address(this).balance}(""); require(status); } }
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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseExtension","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000369565b50611e61600d556000600e60006101000a81548160ff021916908315150217905550731fb50495005ab3ccaf22c5049072d4af5de4a1e7601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d557600080fd5b506040518060400160405280600b81526020017f4c6f726420416e67656c730000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4c414e47454c530000000000000000000000000000000000000000000000000081525081600090805190602001906200015a92919062000369565b5080600190805190602001906200017392919062000369565b505050620001966200018a620001c660201b60201c565b620001ce60201b60201c565b620001c060405180606001604052806036815260200162004c37603691396200029460201b60201c565b62000501565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a4620001c660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ca6200033f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000323576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031a9062000440565b60405180910390fd5b80600b90805190602001906200033b92919062000369565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003779062000473565b90600052602060002090601f0160209004810192826200039b5760008555620003e7565b82601f10620003b657805160ff1916838001178555620003e7565b82800160010185558215620003e7579182015b82811115620003e6578251825591602001919060010190620003c9565b5b509050620003f69190620003fa565b5090565b5b8082111562000415576000816000905550600101620003fb565b5090565b60006200042860208362000462565b91506200043582620004d8565b602082019050919050565b600060208201905081810360008301526200045b8162000419565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048c57607f821691505b60208210811415620004a357620004a2620004a9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61472680620005116000396000f3fe6080604052600436106101b75760003560e01c80635c975abb116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461060f578063da3ef23f1461063a578063e985e9c514610663578063f2fde38b146106a0576101b7565b8063b88d4fde1461057e578063c6682862146105a7578063c87b56dd146105d2576101b7565b8063715018a6116100c6578063715018a6146104e85780638da5cb5b146104ff57806395d89b411461052a578063a22cb46514610555576101b7565b80635c975abb146104435780636352211e1461046e57806370a08231146104ab576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e14610377578063438b6300146103a05780634f6ccce7146103dd57806355f804b31461041a576101b7565b806323b872dd146103075780632f745c59146103305780633ccfd60b1461036d576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a5780630bd06246146102b357806318160ddd146102dc576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190613140565b6106c9565b6040516101f09190613843565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190613113565b610743565b005b34801561022e57600080fd5b506102376107dc565b604051610244919061385e565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906131e3565b61086e565b60405161028191906137ba565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061302e565b6108f3565b005b3480156102bf57600080fd5b506102da60048036038101906102d591906130b7565b610a0b565b005b3480156102e857600080fd5b506102f1610c64565b6040516102fe9190613b60565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612f18565b610c71565b005b34801561033c57600080fd5b506103576004803603810190610352919061302e565b610cd1565b6040516103649190613b60565b60405180910390f35b610375610d76565b005b34801561038357600080fd5b5061039e60048036038101906103999190612f18565b610e72565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190612eab565b610e92565b6040516103d49190613821565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff91906131e3565b610f40565b6040516104119190613b60565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061319a565b610fb1565b005b34801561044f57600080fd5b50610458611047565b6040516104659190613843565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906131e3565b61105a565b6040516104a291906137ba565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190612eab565b61110c565b6040516104df9190613b60565b60405180910390f35b3480156104f457600080fd5b506104fd6111c4565b005b34801561050b57600080fd5b5061051461124c565b60405161052191906137ba565b60405180910390f35b34801561053657600080fd5b5061053f611276565b60405161054c919061385e565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612fee565b611308565b005b34801561058a57600080fd5b506105a560048036038101906105a09190612f6b565b61131e565b005b3480156105b357600080fd5b506105bc611380565b6040516105c9919061385e565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f491906131e3565b61140e565b604051610606919061385e565b60405180910390f35b34801561061b57600080fd5b506106246114b8565b6040516106319190613b60565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061319a565b6114be565b005b34801561066f57600080fd5b5061068a60048036038101906106859190612ed8565b611554565b6040516106979190613843565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190612eab565b6115e8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073c575061073b826116e0565b5b9050919050565b61074b6117c2565b73ffffffffffffffffffffffffffffffffffffffff1661076961124c565b73ffffffffffffffffffffffffffffffffffffffff16146107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b690613aa0565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107eb90613e3b565b80601f016020809104026020016040519081016040528092919081815260200182805461081790613e3b565b80156108645780601f1061083957610100808354040283529160200191610864565b820191906000526020600020905b81548152906001019060200180831161084757829003601f168201915b5050505050905090565b6000610879826117ca565b6108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90613a80565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108fe8261105a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690613b00565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098e6117c2565b73ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc816109b76117c2565b611554565b5b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f3906139c0565b60405180910390fd5b610a068383611836565b505050565b600e60009054906101000a900460ff1615610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290613a60565b60405180910390fd5b60008111610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590613940565b60405180910390fd5b6000610aa86118ef565b90508051835114610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906138a0565b60405180910390fd5b610af88382611ab4565b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e906138a0565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548251610b849190613d51565b1015610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90613880565b60405180910390fd5b6000610bcf610c64565b90506000600190505b838111610c0757610bf4338284610bef9190613cca565b611b38565b8080610bff90613e9e565b915050610bd8565b5082600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c579190613cca565b9250508190555050505050565b6000600880549050905090565b610c82610c7c6117c2565b82611b56565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613b20565b60405180910390fd5b610ccc838383611c34565b505050565b6000610cdc8361110c565b8210610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d14906138c0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d7e6117c2565b73ffffffffffffffffffffffffffffffffffffffff16610d9c61124c565b73ffffffffffffffffffffffffffffffffffffffff1614610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613aa0565b60405180910390fd5b6000610dfc61124c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e1f906137a5565b60006040518083038185875af1925050503d8060008114610e5c576040519150601f19603f3d011682016040523d82523d6000602084013e610e61565b606091505b5050905080610e6f57600080fd5b50565b610e8d8383836040518060200160405280600081525061131e565b505050565b60606000610e9f8361110c565b905060008167ffffffffffffffff811115610ebd57610ebc614003565b5b604051908082528060200260200182016040528015610eeb5781602001602082028036833780820191505090505b50905060005b82811015610f3557610f038582610cd1565b828281518110610f1657610f15613fd4565b5b6020026020010181815250508080610f2d90613e9e565b915050610ef1565b508092505050919050565b6000610f4a610c64565b8210610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613b40565b60405180910390fd5b60088281548110610f9f57610f9e613fd4565b5b90600052602060002001549050919050565b610fb96117c2565b73ffffffffffffffffffffffffffffffffffffffff16610fd761124c565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490613aa0565b60405180910390fd5b80600b9080519060200190611043929190612b6e565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fa90613a20565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490613a00565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111cc6117c2565b73ffffffffffffffffffffffffffffffffffffffff166111ea61124c565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790613aa0565b60405180910390fd5b61124a6000611e90565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128590613e3b565b80601f01602080910402602001604051908101604052809291908181526020018280546112b190613e3b565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b5050505050905090565b61131a6113136117c2565b8383611f56565b5050565b61132f6113296117c2565b83611b56565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613b20565b60405180910390fd5b61137a848484846120c3565b50505050565b600c805461138d90613e3b565b80601f01602080910402602001604051908101604052809291908181526020018280546113b990613e3b565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b505050505081565b6060611419826117ca565b611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613ae0565b60405180910390fd5b600061146261211f565b9050600081511161148257604051806020016040528060008152506114b0565b8061148c846121b1565b600c6040516020016114a093929190613774565b6040516020818303038152906040525b915050919050565b600d5481565b6114c66117c2565b73ffffffffffffffffffffffffffffffffffffffff166114e461124c565b73ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613aa0565b60405180910390fd5b80600c9080519060200190611550929190612b6e565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115f06117c2565b73ffffffffffffffffffffffffffffffffffffffff1661160e61124c565b73ffffffffffffffffffffffffffffffffffffffff1614611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613aa0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613900565b60405180910390fd5b6116dd81611e90565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bb57506117ba82612312565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118a98361105a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163360405160240161193e91906137ba565b6040516020818303038152906040527f438b6300000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119c8919061375d565b6000604051808303816000865af19150503d8060008114611a05576040519150601f19603f3d011682016040523d82523d6000602084013e611a0a565b606091505b509150915081611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906139e0565b60405180910390fd5b600081806020019051810190611a65919061306e565b90506000815111611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290613880565b60405180910390fd5b80935050505090565b60008151835114611ac85760009050611b32565b60005b8351811015611b2c57828181518110611ae757611ae6613fd4565b5b6020026020010151848281518110611b0257611b01613fd4565b5b602002602001015114611b19576000915050611b32565b8080611b2490613e9e565b915050611acb565b50600190505b92915050565b611b5282826040518060200160405280600081525061237c565b5050565b6000611b61826117ca565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906139a0565b60405180910390fd5b6000611bab8361105a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c1a57508373ffffffffffffffffffffffffffffffffffffffff16611c028461086e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c2b5750611c2a8185611554565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c548261105a565b73ffffffffffffffffffffffffffffffffffffffff1614611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190613960565b60405180910390fd5b611d258383836123d7565b611d30600082611836565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d809190613d51565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd79190613cca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbc90613980565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b69190613843565b60405180910390a3505050565b6120ce848484611c34565b6120da848484846124eb565b612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906138e0565b60405180910390fd5b50505050565b6060600b805461212e90613e3b565b80601f016020809104026020016040519081016040528092919081815260200182805461215a90613e3b565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b5050505050905090565b606060008214156121f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061230d565b600082905060005b6000821461222b57808061221490613e9e565b915050600a826122249190613d20565b9150612201565b60008167ffffffffffffffff81111561224757612246614003565b5b6040519080825280601f01601f1916602001820160405280156122795781602001600182028036833780820191505090505b5090505b60008514612306576001826122929190613d51565b9150600a856122a19190613ee7565b60306122ad9190613cca565b60f81b8183815181106122c3576122c2613fd4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122ff9190613d20565b945061227d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123868383612682565b61239360008484846124eb565b6123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c9906138e0565b60405180910390fd5b505050565b6123e2838383612850565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124255761242081612855565b612464565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246357612462838261289e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a7576124a281612a0b565b6124e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124e5576124e48282612adc565b5b5b505050565b600061250c8473ffffffffffffffffffffffffffffffffffffffff16612b5b565b15612675578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125356117c2565b8786866040518563ffffffff1660e01b815260040161255794939291906137d5565b602060405180830381600087803b15801561257157600080fd5b505af19250505080156125a257506040513d601f19601f8201168201806040525081019061259f919061316d565b60015b612625573d80600081146125d2576040519150601f19603f3d011682016040523d82523d6000602084013e6125d7565b606091505b5060008151141561261d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612614906138e0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061267a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990613a40565b60405180910390fd5b6126fb816117ca565b1561273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290613920565b60405180910390fd5b612747600083836123d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127979190613cca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128ab8461110c565b6128b59190613d51565b905060006007600084815260200190815260200160002054905081811461299a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a1f9190613d51565b9050600060096000848152602001908152602001600020549050600060088381548110612a4f57612a4e613fd4565b5b906000526020600020015490508060088381548110612a7157612a70613fd4565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ac057612abf613fa5565b5b6001900381819060005260206000200160009055905550505050565b6000612ae78361110c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b7a90613e3b565b90600052602060002090601f016020900481019282612b9c5760008555612be3565b82601f10612bb557805160ff1916838001178555612be3565b82800160010185558215612be3579182015b82811115612be2578251825591602001919060010190612bc7565b5b509050612bf09190612bf4565b5090565b5b80821115612c0d576000816000905550600101612bf5565b5090565b6000612c24612c1f84613ba0565b613b7b565b90508083825260208201905082856020860282011115612c4757612c46614037565b5b60005b85811015612c775781612c5d8882612e81565b845260208401935060208301925050600181019050612c4a565b5050509392505050565b6000612c94612c8f84613ba0565b613b7b565b90508083825260208201905082856020860282011115612cb757612cb6614037565b5b60005b85811015612ce75781612ccd8882612e96565b845260208401935060208301925050600181019050612cba565b5050509392505050565b6000612d04612cff84613bcc565b613b7b565b905082815260208101848484011115612d2057612d1f61403c565b5b612d2b848285613df9565b509392505050565b6000612d46612d4184613bfd565b613b7b565b905082815260208101848484011115612d6257612d6161403c565b5b612d6d848285613df9565b509392505050565b600081359050612d8481614694565b92915050565b600082601f830112612d9f57612d9e614032565b5b8135612daf848260208601612c11565b91505092915050565b600082601f830112612dcd57612dcc614032565b5b8151612ddd848260208601612c81565b91505092915050565b600081359050612df5816146ab565b92915050565b600081359050612e0a816146c2565b92915050565b600081519050612e1f816146c2565b92915050565b600082601f830112612e3a57612e39614032565b5b8135612e4a848260208601612cf1565b91505092915050565b600082601f830112612e6857612e67614032565b5b8135612e78848260208601612d33565b91505092915050565b600081359050612e90816146d9565b92915050565b600081519050612ea5816146d9565b92915050565b600060208284031215612ec157612ec0614046565b5b6000612ecf84828501612d75565b91505092915050565b60008060408385031215612eef57612eee614046565b5b6000612efd85828601612d75565b9250506020612f0e85828601612d75565b9150509250929050565b600080600060608486031215612f3157612f30614046565b5b6000612f3f86828701612d75565b9350506020612f5086828701612d75565b9250506040612f6186828701612e81565b9150509250925092565b60008060008060808587031215612f8557612f84614046565b5b6000612f9387828801612d75565b9450506020612fa487828801612d75565b9350506040612fb587828801612e81565b925050606085013567ffffffffffffffff811115612fd657612fd5614041565b5b612fe287828801612e25565b91505092959194509250565b6000806040838503121561300557613004614046565b5b600061301385828601612d75565b925050602061302485828601612de6565b9150509250929050565b6000806040838503121561304557613044614046565b5b600061305385828601612d75565b925050602061306485828601612e81565b9150509250929050565b60006020828403121561308457613083614046565b5b600082015167ffffffffffffffff8111156130a2576130a1614041565b5b6130ae84828501612db8565b91505092915050565b600080604083850312156130ce576130cd614046565b5b600083013567ffffffffffffffff8111156130ec576130eb614041565b5b6130f885828601612d8a565b925050602061310985828601612e81565b9150509250929050565b60006020828403121561312957613128614046565b5b600061313784828501612de6565b91505092915050565b60006020828403121561315657613155614046565b5b600061316484828501612dfb565b91505092915050565b60006020828403121561318357613182614046565b5b600061319184828501612e10565b91505092915050565b6000602082840312156131b0576131af614046565b5b600082013567ffffffffffffffff8111156131ce576131cd614041565b5b6131da84828501612e53565b91505092915050565b6000602082840312156131f9576131f8614046565b5b600061320784828501612e81565b91505092915050565b600061321c838361373f565b60208301905092915050565b61323181613d85565b82525050565b600061324282613c53565b61324c8185613c81565b935061325783613c2e565b8060005b8381101561328857815161326f8882613210565b975061327a83613c74565b92505060018101905061325b565b5085935050505092915050565b61329e81613d97565b82525050565b60006132af82613c5e565b6132b98185613c92565b93506132c9818560208601613e08565b6132d28161404b565b840191505092915050565b60006132e882613c5e565b6132f28185613ca3565b9350613302818560208601613e08565b80840191505092915050565b600061331982613c69565b6133238185613cae565b9350613333818560208601613e08565b61333c8161404b565b840191505092915050565b600061335282613c69565b61335c8185613cbf565b935061336c818560208601613e08565b80840191505092915050565b6000815461338581613e3b565b61338f8186613cbf565b945060018216600081146133aa57600181146133bb576133ee565b60ff198316865281860193506133ee565b6133c485613c3e565b60005b838110156133e6578154818901526001820191506020810190506133c7565b838801955050505b50505092915050565b6000613404604683613cae565b915061340f8261405c565b606082019050919050565b6000613427601a83613cae565b9150613432826140d1565b602082019050919050565b600061344a602b83613cae565b9150613455826140fa565b604082019050919050565b600061346d603283613cae565b915061347882614149565b604082019050919050565b6000613490602683613cae565b915061349b82614198565b604082019050919050565b60006134b3601c83613cae565b91506134be826141e7565b602082019050919050565b60006134d6601483613cae565b91506134e182614210565b602082019050919050565b60006134f9602483613cae565b915061350482614239565b604082019050919050565b600061351c601983613cae565b915061352782614288565b602082019050919050565b600061353f602c83613cae565b915061354a826142b1565b604082019050919050565b6000613562603883613cae565b915061356d82614300565b604082019050919050565b6000613585603e83613cae565b91506135908261434f565b604082019050919050565b60006135a8602a83613cae565b91506135b38261439e565b604082019050919050565b60006135cb602983613cae565b91506135d6826143ed565b604082019050919050565b60006135ee602083613cae565b91506135f98261443c565b602082019050919050565b6000613611601783613cae565b915061361c82614465565b602082019050919050565b6000613634602c83613cae565b915061363f8261448e565b604082019050919050565b6000613657602083613cae565b9150613662826144dd565b602082019050919050565b600061367a602983613cae565b915061368582614506565b604082019050919050565b600061369d602f83613cae565b91506136a882614555565b604082019050919050565b60006136c0602183613cae565b91506136cb826145a4565b604082019050919050565b60006136e3600083613ca3565b91506136ee826145f3565b600082019050919050565b6000613706603183613cae565b9150613711826145f6565b604082019050919050565b6000613729602c83613cae565b915061373482614645565b604082019050919050565b61374881613def565b82525050565b61375781613def565b82525050565b600061376982846132dd565b915081905092915050565b60006137808286613347565b915061378c8285613347565b91506137988284613378565b9150819050949350505050565b60006137b0826136d6565b9150819050919050565b60006020820190506137cf6000830184613228565b92915050565b60006080820190506137ea6000830187613228565b6137f76020830186613228565b613804604083018561374e565b818103606083015261381681846132a4565b905095945050505050565b6000602082019050818103600083015261383b8184613237565b905092915050565b60006020820190506138586000830184613295565b92915050565b60006020820190508181036000830152613878818461330e565b905092915050565b60006020820190508181036000830152613899816133f7565b9050919050565b600060208201905081810360008301526138b98161341a565b9050919050565b600060208201905081810360008301526138d98161343d565b9050919050565b600060208201905081810360008301526138f981613460565b9050919050565b6000602082019050818103600083015261391981613483565b9050919050565b60006020820190508181036000830152613939816134a6565b9050919050565b60006020820190508181036000830152613959816134c9565b9050919050565b60006020820190508181036000830152613979816134ec565b9050919050565b600060208201905081810360008301526139998161350f565b9050919050565b600060208201905081810360008301526139b981613532565b9050919050565b600060208201905081810360008301526139d981613555565b9050919050565b600060208201905081810360008301526139f981613578565b9050919050565b60006020820190508181036000830152613a198161359b565b9050919050565b60006020820190508181036000830152613a39816135be565b9050919050565b60006020820190508181036000830152613a59816135e1565b9050919050565b60006020820190508181036000830152613a7981613604565b9050919050565b60006020820190508181036000830152613a9981613627565b9050919050565b60006020820190508181036000830152613ab98161364a565b9050919050565b60006020820190508181036000830152613ad98161366d565b9050919050565b60006020820190508181036000830152613af981613690565b9050919050565b60006020820190508181036000830152613b19816136b3565b9050919050565b60006020820190508181036000830152613b39816136f9565b9050919050565b60006020820190508181036000830152613b598161371c565b9050919050565b6000602082019050613b75600083018461374e565b92915050565b6000613b85613b96565b9050613b918282613e6d565b919050565b6000604051905090565b600067ffffffffffffffff821115613bbb57613bba614003565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613be757613be6614003565b5b613bf08261404b565b9050602081019050919050565b600067ffffffffffffffff821115613c1857613c17614003565b5b613c218261404b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd582613def565b9150613ce083613def565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1557613d14613f18565b5b828201905092915050565b6000613d2b82613def565b9150613d3683613def565b925082613d4657613d45613f47565b5b828204905092915050565b6000613d5c82613def565b9150613d6783613def565b925082821015613d7a57613d79613f18565b5b828203905092915050565b6000613d9082613dcf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e26578082015181840152602081019050613e0b565b83811115613e35576000848401525b50505050565b60006002820490506001821680613e5357607f821691505b60208210811415613e6757613e66613f76565b5b50919050565b613e768261404b565b810181811067ffffffffffffffff82111715613e9557613e94614003565b5b80604052505050565b6000613ea982613def565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613edc57613edb613f18565b5b600182019050919050565b6000613ef282613def565b9150613efd83613def565b925082613f0d57613f0c613f47565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f536f7272792c2062757420796f7520646f6e277420686176652074686520726560008201527f71756972656420746f6b656e7320746f2070726f636565642077697468206d6960208201527f6e74696e672e0000000000000000000000000000000000000000000000000000604082015250565b7f496e76616c6964206c697374206f6620746f6b656e2069647321000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f536f7272792c20776520636f756c646e27742076657269667920796f7572207460008201527f6f6b656e732e20506c656173652074727920616761696e206c617465722e0000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f54686520636f6e7472616374206973207061757365642e000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61469d81613d85565b81146146a857600080fd5b50565b6146b481613d97565b81146146bf57600080fd5b50565b6146cb81613da3565b81146146d657600080fd5b50565b6146e281613def565b81146146ed57600080fd5b5056fea2646970667358221220740424a8c5d5d4485f3f7a0bcb6e80ade7b79a37dc5056686ed40d5d3c093ba764736f6c63430008070033697066733a2f2f516d544733514a625476524344616a354255796138627068596434684a634a63447663456b785a78766f615a78742f
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80635c975abb116100ec578063b88d4fde1161008a578063d5abeb0111610064578063d5abeb011461060f578063da3ef23f1461063a578063e985e9c514610663578063f2fde38b146106a0576101b7565b8063b88d4fde1461057e578063c6682862146105a7578063c87b56dd146105d2576101b7565b8063715018a6116100c6578063715018a6146104e85780638da5cb5b146104ff57806395d89b411461052a578063a22cb46514610555576101b7565b80635c975abb146104435780636352211e1461046e57806370a08231146104ab576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e14610377578063438b6300146103a05780634f6ccce7146103dd57806355f804b31461041a576101b7565b806323b872dd146103075780632f745c59146103305780633ccfd60b1461036d576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a5780630bd06246146102b357806318160ddd146102dc576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190613140565b6106c9565b6040516101f09190613843565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190613113565b610743565b005b34801561022e57600080fd5b506102376107dc565b604051610244919061385e565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906131e3565b61086e565b60405161028191906137ba565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061302e565b6108f3565b005b3480156102bf57600080fd5b506102da60048036038101906102d591906130b7565b610a0b565b005b3480156102e857600080fd5b506102f1610c64565b6040516102fe9190613b60565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612f18565b610c71565b005b34801561033c57600080fd5b506103576004803603810190610352919061302e565b610cd1565b6040516103649190613b60565b60405180910390f35b610375610d76565b005b34801561038357600080fd5b5061039e60048036038101906103999190612f18565b610e72565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190612eab565b610e92565b6040516103d49190613821565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff91906131e3565b610f40565b6040516104119190613b60565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061319a565b610fb1565b005b34801561044f57600080fd5b50610458611047565b6040516104659190613843565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906131e3565b61105a565b6040516104a291906137ba565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190612eab565b61110c565b6040516104df9190613b60565b60405180910390f35b3480156104f457600080fd5b506104fd6111c4565b005b34801561050b57600080fd5b5061051461124c565b60405161052191906137ba565b60405180910390f35b34801561053657600080fd5b5061053f611276565b60405161054c919061385e565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612fee565b611308565b005b34801561058a57600080fd5b506105a560048036038101906105a09190612f6b565b61131e565b005b3480156105b357600080fd5b506105bc611380565b6040516105c9919061385e565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f491906131e3565b61140e565b604051610606919061385e565b60405180910390f35b34801561061b57600080fd5b506106246114b8565b6040516106319190613b60565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061319a565b6114be565b005b34801561066f57600080fd5b5061068a60048036038101906106859190612ed8565b611554565b6040516106979190613843565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190612eab565b6115e8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073c575061073b826116e0565b5b9050919050565b61074b6117c2565b73ffffffffffffffffffffffffffffffffffffffff1661076961124c565b73ffffffffffffffffffffffffffffffffffffffff16146107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b690613aa0565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107eb90613e3b565b80601f016020809104026020016040519081016040528092919081815260200182805461081790613e3b565b80156108645780601f1061083957610100808354040283529160200191610864565b820191906000526020600020905b81548152906001019060200180831161084757829003601f168201915b5050505050905090565b6000610879826117ca565b6108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90613a80565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108fe8261105a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690613b00565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098e6117c2565b73ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc816109b76117c2565b611554565b5b6109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f3906139c0565b60405180910390fd5b610a068383611836565b505050565b600e60009054906101000a900460ff1615610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290613a60565b60405180910390fd5b60008111610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590613940565b60405180910390fd5b6000610aa86118ef565b90508051835114610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906138a0565b60405180910390fd5b610af88382611ab4565b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e906138a0565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548251610b849190613d51565b1015610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90613880565b60405180910390fd5b6000610bcf610c64565b90506000600190505b838111610c0757610bf4338284610bef9190613cca565b611b38565b8080610bff90613e9e565b915050610bd8565b5082600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c579190613cca565b9250508190555050505050565b6000600880549050905090565b610c82610c7c6117c2565b82611b56565b610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613b20565b60405180910390fd5b610ccc838383611c34565b505050565b6000610cdc8361110c565b8210610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d14906138c0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d7e6117c2565b73ffffffffffffffffffffffffffffffffffffffff16610d9c61124c565b73ffffffffffffffffffffffffffffffffffffffff1614610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613aa0565b60405180910390fd5b6000610dfc61124c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e1f906137a5565b60006040518083038185875af1925050503d8060008114610e5c576040519150601f19603f3d011682016040523d82523d6000602084013e610e61565b606091505b5050905080610e6f57600080fd5b50565b610e8d8383836040518060200160405280600081525061131e565b505050565b60606000610e9f8361110c565b905060008167ffffffffffffffff811115610ebd57610ebc614003565b5b604051908082528060200260200182016040528015610eeb5781602001602082028036833780820191505090505b50905060005b82811015610f3557610f038582610cd1565b828281518110610f1657610f15613fd4565b5b6020026020010181815250508080610f2d90613e9e565b915050610ef1565b508092505050919050565b6000610f4a610c64565b8210610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290613b40565b60405180910390fd5b60088281548110610f9f57610f9e613fd4565b5b90600052602060002001549050919050565b610fb96117c2565b73ffffffffffffffffffffffffffffffffffffffff16610fd761124c565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490613aa0565b60405180910390fd5b80600b9080519060200190611043929190612b6e565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fa90613a20565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490613a00565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111cc6117c2565b73ffffffffffffffffffffffffffffffffffffffff166111ea61124c565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790613aa0565b60405180910390fd5b61124a6000611e90565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128590613e3b565b80601f01602080910402602001604051908101604052809291908181526020018280546112b190613e3b565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b5050505050905090565b61131a6113136117c2565b8383611f56565b5050565b61132f6113296117c2565b83611b56565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613b20565b60405180910390fd5b61137a848484846120c3565b50505050565b600c805461138d90613e3b565b80601f01602080910402602001604051908101604052809291908181526020018280546113b990613e3b565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b505050505081565b6060611419826117ca565b611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613ae0565b60405180910390fd5b600061146261211f565b9050600081511161148257604051806020016040528060008152506114b0565b8061148c846121b1565b600c6040516020016114a093929190613774565b6040516020818303038152906040525b915050919050565b600d5481565b6114c66117c2565b73ffffffffffffffffffffffffffffffffffffffff166114e461124c565b73ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613aa0565b60405180910390fd5b80600c9080519060200190611550929190612b6e565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115f06117c2565b73ffffffffffffffffffffffffffffffffffffffff1661160e61124c565b73ffffffffffffffffffffffffffffffffffffffff1614611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613aa0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90613900565b60405180910390fd5b6116dd81611e90565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bb57506117ba82612312565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118a98361105a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163360405160240161193e91906137ba565b6040516020818303038152906040527f438b6300000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119c8919061375d565b6000604051808303816000865af19150503d8060008114611a05576040519150601f19603f3d011682016040523d82523d6000602084013e611a0a565b606091505b509150915081611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906139e0565b60405180910390fd5b600081806020019051810190611a65919061306e565b90506000815111611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290613880565b60405180910390fd5b80935050505090565b60008151835114611ac85760009050611b32565b60005b8351811015611b2c57828181518110611ae757611ae6613fd4565b5b6020026020010151848281518110611b0257611b01613fd4565b5b602002602001015114611b19576000915050611b32565b8080611b2490613e9e565b915050611acb565b50600190505b92915050565b611b5282826040518060200160405280600081525061237c565b5050565b6000611b61826117ca565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906139a0565b60405180910390fd5b6000611bab8361105a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c1a57508373ffffffffffffffffffffffffffffffffffffffff16611c028461086e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c2b5750611c2a8185611554565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c548261105a565b73ffffffffffffffffffffffffffffffffffffffff1614611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613ac0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190613960565b60405180910390fd5b611d258383836123d7565b611d30600082611836565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d809190613d51565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd79190613cca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbc90613980565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b69190613843565b60405180910390a3505050565b6120ce848484611c34565b6120da848484846124eb565b612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906138e0565b60405180910390fd5b50505050565b6060600b805461212e90613e3b565b80601f016020809104026020016040519081016040528092919081815260200182805461215a90613e3b565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b5050505050905090565b606060008214156121f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061230d565b600082905060005b6000821461222b57808061221490613e9e565b915050600a826122249190613d20565b9150612201565b60008167ffffffffffffffff81111561224757612246614003565b5b6040519080825280601f01601f1916602001820160405280156122795781602001600182028036833780820191505090505b5090505b60008514612306576001826122929190613d51565b9150600a856122a19190613ee7565b60306122ad9190613cca565b60f81b8183815181106122c3576122c2613fd4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122ff9190613d20565b945061227d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6123868383612682565b61239360008484846124eb565b6123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c9906138e0565b60405180910390fd5b505050565b6123e2838383612850565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124255761242081612855565b612464565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246357612462838261289e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a7576124a281612a0b565b6124e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124e5576124e48282612adc565b5b5b505050565b600061250c8473ffffffffffffffffffffffffffffffffffffffff16612b5b565b15612675578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125356117c2565b8786866040518563ffffffff1660e01b815260040161255794939291906137d5565b602060405180830381600087803b15801561257157600080fd5b505af19250505080156125a257506040513d601f19601f8201168201806040525081019061259f919061316d565b60015b612625573d80600081146125d2576040519150601f19603f3d011682016040523d82523d6000602084013e6125d7565b606091505b5060008151141561261d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612614906138e0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061267a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990613a40565b60405180910390fd5b6126fb816117ca565b1561273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290613920565b60405180910390fd5b612747600083836123d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127979190613cca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128ab8461110c565b6128b59190613d51565b905060006007600084815260200190815260200160002054905081811461299a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a1f9190613d51565b9050600060096000848152602001908152602001600020549050600060088381548110612a4f57612a4e613fd4565b5b906000526020600020015490508060088381548110612a7157612a70613fd4565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ac057612abf613fa5565b5b6001900381819060005260206000200160009055905550505050565b6000612ae78361110c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b7a90613e3b565b90600052602060002090601f016020900481019282612b9c5760008555612be3565b82601f10612bb557805160ff1916838001178555612be3565b82800160010185558215612be3579182015b82811115612be2578251825591602001919060010190612bc7565b5b509050612bf09190612bf4565b5090565b5b80821115612c0d576000816000905550600101612bf5565b5090565b6000612c24612c1f84613ba0565b613b7b565b90508083825260208201905082856020860282011115612c4757612c46614037565b5b60005b85811015612c775781612c5d8882612e81565b845260208401935060208301925050600181019050612c4a565b5050509392505050565b6000612c94612c8f84613ba0565b613b7b565b90508083825260208201905082856020860282011115612cb757612cb6614037565b5b60005b85811015612ce75781612ccd8882612e96565b845260208401935060208301925050600181019050612cba565b5050509392505050565b6000612d04612cff84613bcc565b613b7b565b905082815260208101848484011115612d2057612d1f61403c565b5b612d2b848285613df9565b509392505050565b6000612d46612d4184613bfd565b613b7b565b905082815260208101848484011115612d6257612d6161403c565b5b612d6d848285613df9565b509392505050565b600081359050612d8481614694565b92915050565b600082601f830112612d9f57612d9e614032565b5b8135612daf848260208601612c11565b91505092915050565b600082601f830112612dcd57612dcc614032565b5b8151612ddd848260208601612c81565b91505092915050565b600081359050612df5816146ab565b92915050565b600081359050612e0a816146c2565b92915050565b600081519050612e1f816146c2565b92915050565b600082601f830112612e3a57612e39614032565b5b8135612e4a848260208601612cf1565b91505092915050565b600082601f830112612e6857612e67614032565b5b8135612e78848260208601612d33565b91505092915050565b600081359050612e90816146d9565b92915050565b600081519050612ea5816146d9565b92915050565b600060208284031215612ec157612ec0614046565b5b6000612ecf84828501612d75565b91505092915050565b60008060408385031215612eef57612eee614046565b5b6000612efd85828601612d75565b9250506020612f0e85828601612d75565b9150509250929050565b600080600060608486031215612f3157612f30614046565b5b6000612f3f86828701612d75565b9350506020612f5086828701612d75565b9250506040612f6186828701612e81565b9150509250925092565b60008060008060808587031215612f8557612f84614046565b5b6000612f9387828801612d75565b9450506020612fa487828801612d75565b9350506040612fb587828801612e81565b925050606085013567ffffffffffffffff811115612fd657612fd5614041565b5b612fe287828801612e25565b91505092959194509250565b6000806040838503121561300557613004614046565b5b600061301385828601612d75565b925050602061302485828601612de6565b9150509250929050565b6000806040838503121561304557613044614046565b5b600061305385828601612d75565b925050602061306485828601612e81565b9150509250929050565b60006020828403121561308457613083614046565b5b600082015167ffffffffffffffff8111156130a2576130a1614041565b5b6130ae84828501612db8565b91505092915050565b600080604083850312156130ce576130cd614046565b5b600083013567ffffffffffffffff8111156130ec576130eb614041565b5b6130f885828601612d8a565b925050602061310985828601612e81565b9150509250929050565b60006020828403121561312957613128614046565b5b600061313784828501612de6565b91505092915050565b60006020828403121561315657613155614046565b5b600061316484828501612dfb565b91505092915050565b60006020828403121561318357613182614046565b5b600061319184828501612e10565b91505092915050565b6000602082840312156131b0576131af614046565b5b600082013567ffffffffffffffff8111156131ce576131cd614041565b5b6131da84828501612e53565b91505092915050565b6000602082840312156131f9576131f8614046565b5b600061320784828501612e81565b91505092915050565b600061321c838361373f565b60208301905092915050565b61323181613d85565b82525050565b600061324282613c53565b61324c8185613c81565b935061325783613c2e565b8060005b8381101561328857815161326f8882613210565b975061327a83613c74565b92505060018101905061325b565b5085935050505092915050565b61329e81613d97565b82525050565b60006132af82613c5e565b6132b98185613c92565b93506132c9818560208601613e08565b6132d28161404b565b840191505092915050565b60006132e882613c5e565b6132f28185613ca3565b9350613302818560208601613e08565b80840191505092915050565b600061331982613c69565b6133238185613cae565b9350613333818560208601613e08565b61333c8161404b565b840191505092915050565b600061335282613c69565b61335c8185613cbf565b935061336c818560208601613e08565b80840191505092915050565b6000815461338581613e3b565b61338f8186613cbf565b945060018216600081146133aa57600181146133bb576133ee565b60ff198316865281860193506133ee565b6133c485613c3e565b60005b838110156133e6578154818901526001820191506020810190506133c7565b838801955050505b50505092915050565b6000613404604683613cae565b915061340f8261405c565b606082019050919050565b6000613427601a83613cae565b9150613432826140d1565b602082019050919050565b600061344a602b83613cae565b9150613455826140fa565b604082019050919050565b600061346d603283613cae565b915061347882614149565b604082019050919050565b6000613490602683613cae565b915061349b82614198565b604082019050919050565b60006134b3601c83613cae565b91506134be826141e7565b602082019050919050565b60006134d6601483613cae565b91506134e182614210565b602082019050919050565b60006134f9602483613cae565b915061350482614239565b604082019050919050565b600061351c601983613cae565b915061352782614288565b602082019050919050565b600061353f602c83613cae565b915061354a826142b1565b604082019050919050565b6000613562603883613cae565b915061356d82614300565b604082019050919050565b6000613585603e83613cae565b91506135908261434f565b604082019050919050565b60006135a8602a83613cae565b91506135b38261439e565b604082019050919050565b60006135cb602983613cae565b91506135d6826143ed565b604082019050919050565b60006135ee602083613cae565b91506135f98261443c565b602082019050919050565b6000613611601783613cae565b915061361c82614465565b602082019050919050565b6000613634602c83613cae565b915061363f8261448e565b604082019050919050565b6000613657602083613cae565b9150613662826144dd565b602082019050919050565b600061367a602983613cae565b915061368582614506565b604082019050919050565b600061369d602f83613cae565b91506136a882614555565b604082019050919050565b60006136c0602183613cae565b91506136cb826145a4565b604082019050919050565b60006136e3600083613ca3565b91506136ee826145f3565b600082019050919050565b6000613706603183613cae565b9150613711826145f6565b604082019050919050565b6000613729602c83613cae565b915061373482614645565b604082019050919050565b61374881613def565b82525050565b61375781613def565b82525050565b600061376982846132dd565b915081905092915050565b60006137808286613347565b915061378c8285613347565b91506137988284613378565b9150819050949350505050565b60006137b0826136d6565b9150819050919050565b60006020820190506137cf6000830184613228565b92915050565b60006080820190506137ea6000830187613228565b6137f76020830186613228565b613804604083018561374e565b818103606083015261381681846132a4565b905095945050505050565b6000602082019050818103600083015261383b8184613237565b905092915050565b60006020820190506138586000830184613295565b92915050565b60006020820190508181036000830152613878818461330e565b905092915050565b60006020820190508181036000830152613899816133f7565b9050919050565b600060208201905081810360008301526138b98161341a565b9050919050565b600060208201905081810360008301526138d98161343d565b9050919050565b600060208201905081810360008301526138f981613460565b9050919050565b6000602082019050818103600083015261391981613483565b9050919050565b60006020820190508181036000830152613939816134a6565b9050919050565b60006020820190508181036000830152613959816134c9565b9050919050565b60006020820190508181036000830152613979816134ec565b9050919050565b600060208201905081810360008301526139998161350f565b9050919050565b600060208201905081810360008301526139b981613532565b9050919050565b600060208201905081810360008301526139d981613555565b9050919050565b600060208201905081810360008301526139f981613578565b9050919050565b60006020820190508181036000830152613a198161359b565b9050919050565b60006020820190508181036000830152613a39816135be565b9050919050565b60006020820190508181036000830152613a59816135e1565b9050919050565b60006020820190508181036000830152613a7981613604565b9050919050565b60006020820190508181036000830152613a9981613627565b9050919050565b60006020820190508181036000830152613ab98161364a565b9050919050565b60006020820190508181036000830152613ad98161366d565b9050919050565b60006020820190508181036000830152613af981613690565b9050919050565b60006020820190508181036000830152613b19816136b3565b9050919050565b60006020820190508181036000830152613b39816136f9565b9050919050565b60006020820190508181036000830152613b598161371c565b9050919050565b6000602082019050613b75600083018461374e565b92915050565b6000613b85613b96565b9050613b918282613e6d565b919050565b6000604051905090565b600067ffffffffffffffff821115613bbb57613bba614003565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613be757613be6614003565b5b613bf08261404b565b9050602081019050919050565b600067ffffffffffffffff821115613c1857613c17614003565b5b613c218261404b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd582613def565b9150613ce083613def565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1557613d14613f18565b5b828201905092915050565b6000613d2b82613def565b9150613d3683613def565b925082613d4657613d45613f47565b5b828204905092915050565b6000613d5c82613def565b9150613d6783613def565b925082821015613d7a57613d79613f18565b5b828203905092915050565b6000613d9082613dcf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e26578082015181840152602081019050613e0b565b83811115613e35576000848401525b50505050565b60006002820490506001821680613e5357607f821691505b60208210811415613e6757613e66613f76565b5b50919050565b613e768261404b565b810181811067ffffffffffffffff82111715613e9557613e94614003565b5b80604052505050565b6000613ea982613def565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613edc57613edb613f18565b5b600182019050919050565b6000613ef282613def565b9150613efd83613def565b925082613f0d57613f0c613f47565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f536f7272792c2062757420796f7520646f6e277420686176652074686520726560008201527f71756972656420746f6b656e7320746f2070726f636565642077697468206d6960208201527f6e74696e672e0000000000000000000000000000000000000000000000000000604082015250565b7f496e76616c6964206c697374206f6620746f6b656e2069647321000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f536f7272792c20776520636f756c646e27742076657269667920796f7572207460008201527f6f6b656e732e20506c656173652074727920616761696e206c617465722e0000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f54686520636f6e7472616374206973207061757365642e000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61469d81613d85565b81146146a857600080fd5b50565b6146b481613d97565b81146146bf57600080fd5b50565b6146cb81613da3565b81146146d657600080fd5b50565b6146e281613def565b81146146ed57600080fd5b5056fea2646970667358221220740424a8c5d5d4485f3f7a0bcb6e80ade7b79a37dc5056686ed40d5d3c093ba764736f6c63430008070033
Deployed Bytecode Sourcemap
44527:4195:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38303:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48469:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25797:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27356:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26879:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46241:881;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38943:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28106:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38611:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48556:163;;;:::i;:::-;;28516:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47130:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39133:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48198:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44727:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25491:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25221:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4767:103;;;;;;;;;;;;;:::i;:::-;;4116:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25966:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27649:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28772:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44641:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47530:642;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44687:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48310:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27875:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5025:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38303:224;38405:4;38444:35;38429:50;;;:11;:50;;;;:90;;;;38483:36;38507:11;38483:23;:36::i;:::-;38429:90;38422:97;;38303:224;;;:::o;48469:79::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48534:6:::1;48525;;:15;;;;;;;;;;;;;;;;;;48469:79:::0;:::o;25797:100::-;25851:13;25884:5;25877:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25797:100;:::o;27356:221::-;27432:7;27460:16;27468:7;27460;:16::i;:::-;27452:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27545:15;:24;27561:7;27545:24;;;;;;;;;;;;;;;;;;;;;27538:31;;27356:221;;;:::o;26879:411::-;26960:13;26976:23;26991:7;26976:14;:23::i;:::-;26960:39;;27024:5;27018:11;;:2;:11;;;;27010:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27118:5;27102:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27127:37;27144:5;27151:12;:10;:12::i;:::-;27127:16;:37::i;:::-;27102:62;27080:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27261:21;27270:2;27274:7;27261:8;:21::i;:::-;26949:341;26879:411;;:::o;46241:881::-;46331:6;;;;;;;;;;;46330:7;46322:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;46398:1;46384:11;:15;46376:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;46437:23;46463:11;:9;:11::i;:::-;46437:37;;46529:6;:13;46509:9;:16;:33;46487:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;46629:35;46646:9;46657:6;46629:16;:35::i;:::-;46607:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46795:11;46767:12;:24;46780:10;46767:24;;;;;;;;;;;;;;;;46751:6;:13;:40;;;;:::i;:::-;:55;;46729:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;46917:14;46934:13;:11;:13::i;:::-;46917:30;;46965:9;46977:1;46965:13;;46960:103;46985:11;46980:1;:16;46960:103;;47018:33;47028:10;47049:1;47040:6;:10;;;;:::i;:::-;47018:9;:33::i;:::-;46998:3;;;;;:::i;:::-;;;;46960:103;;;;47103:11;47075:12;:24;47088:10;47075:24;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;46311:811;;46241:881;;:::o;38943:113::-;39004:7;39031:10;:17;;;;39024:24;;38943:113;:::o;28106:339::-;28301:41;28320:12;:10;:12::i;:::-;28334:7;28301:18;:41::i;:::-;28293:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28409:28;28419:4;28425:2;28429:7;28409:9;:28::i;:::-;28106:339;;;:::o;38611:256::-;38708:7;38744:23;38761:5;38744:16;:23::i;:::-;38736:5;:31;38728:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38833:12;:19;38846:5;38833:19;;;;;;;;;;;;;;;:26;38853:5;38833:26;;;;;;;;;;;;38826:33;;38611:256;;;;:::o;48556:163::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48613:11:::1;48638:7;:5;:7::i;:::-;48630:21;;48659;48630:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48612:73;;;48704:6;48696:15;;;::::0;::::1;;48601:118;48556:163::o:0;28516:185::-;28654:39;28671:4;28677:2;28681:7;28654:39;;;;;;;;;;;;:16;:39::i;:::-;28516:185;;;:::o;47130:392::-;47217:16;47251:23;47277:17;47287:6;47277:9;:17::i;:::-;47251:43;;47305:25;47347:15;47333:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47305:58;;47381:9;47376:113;47396:15;47392:1;:19;47376:113;;;47447:30;47467:6;47475:1;47447:19;:30::i;:::-;47433:8;47442:1;47433:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47413:3;;;;;:::i;:::-;;;;47376:113;;;;47506:8;47499:15;;;;47130:392;;;:::o;39133:233::-;39208:7;39244:30;:28;:30::i;:::-;39236:5;:38;39228:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39341:10;39352:5;39341:17;;;;;;;;:::i;:::-;;;;;;;;;;39334:24;;39133:233;;;:::o;48198:104::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48283:11:::1;48273:7;:21;;;;;;;;;;;;:::i;:::-;;48198:104:::0;:::o;44727:26::-;;;;;;;;;;;;;:::o;25491:239::-;25563:7;25583:13;25599:7;:16;25607:7;25599:16;;;;;;;;;;;;;;;;;;;;;25583:32;;25651:1;25634:19;;:5;:19;;;;25626:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25717:5;25710:12;;;25491:239;;;:::o;25221:208::-;25293:7;25338:1;25321:19;;:5;:19;;;;25313:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25405:9;:16;25415:5;25405:16;;;;;;;;;;;;;;;;25398:23;;25221:208;;;:::o;4767:103::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4832:30:::1;4859:1;4832:18;:30::i;:::-;4767:103::o:0;4116:87::-;4162:7;4189:6;;;;;;;;;;;4182:13;;4116:87;:::o;25966:104::-;26022:13;26055:7;26048:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25966:104;:::o;27649:155::-;27744:52;27763:12;:10;:12::i;:::-;27777:8;27787;27744:18;:52::i;:::-;27649:155;;:::o;28772:328::-;28947:41;28966:12;:10;:12::i;:::-;28980:7;28947:18;:41::i;:::-;28939:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29053:39;29067:4;29073:2;29077:7;29086:5;29053:13;:39::i;:::-;28772:328;;;;:::o;44641:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47530:642::-;47648:13;47701:16;47709:7;47701;:16::i;:::-;47679:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47805:28;47836:10;:8;:10::i;:::-;47805:41;;47908:1;47883:14;47877:28;:32;:287;;;;;;;;;;;;;;;;;48001:14;48042:18;:7;:16;:18::i;:::-;48087:13;47958:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47877:287;47857:307;;;47530:642;;;:::o;44687:31::-;;;;:::o;48310:151::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48436:17:::1;48420:13;:33;;;;;;;;;;;;:::i;:::-;;48310:151:::0;:::o;27875:164::-;27972:4;27996:18;:25;28015:5;27996:25;;;;;;;;;;;;;;;:35;28022:8;27996:35;;;;;;;;;;;;;;;;;;;;;;;;;27989:42;;27875:164;;;;:::o;5025:201::-;4347:12;:10;:12::i;:::-;4336:23;;:7;:5;:7::i;:::-;:23;;;4328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5134:1:::1;5114:22;;:8;:22;;;;5106:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5190:28;5209:8;5190:18;:28::i;:::-;5025:201:::0;:::o;24852:305::-;24954:4;25006:25;24991:40;;;:11;:40;;;;:105;;;;25063:33;25048:48;;;:11;:48;;;;24991:105;:158;;;;25113:36;25137:11;25113:23;:36::i;:::-;24991:158;24971:178;;24852:305;;;:::o;2840:98::-;2893:7;2920:10;2913:17;;2840:98;:::o;30610:127::-;30675:4;30727:1;30699:30;;:7;:16;30707:7;30699:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30692:37;;30610:127;;;:::o;34592:174::-;34694:2;34667:15;:24;34683:7;34667:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34750:7;34746:2;34712:46;;34721:23;34736:7;34721:14;:23::i;:::-;34712:46;;;;;;;;;;;;34592:174;;:::o;45181:590::-;45219:16;45249:11;45262:18;45284:11;;;;;;;;;;;:16;;45365:10;45315:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45284:103;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45248:139;;;;45422:6;45400:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45531:23;45568:5;45557:30;;;;;;;;;;;;:::i;:::-;45531:56;;45638:1;45622:6;:13;:17;45600:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;45757:6;45750:13;;;;;45181:590;:::o;45779:439::-;45913:4;45954:14;:21;45934:9;:16;:41;45930:86;;45999:5;45992:12;;;;45930:86;46033:9;46028:159;46052:9;:16;46048:1;:20;46028:159;;;46110:14;46125:1;46110:17;;;;;;;;:::i;:::-;;;;;;;;46094:9;46104:1;46094:12;;;;;;;;:::i;:::-;;;;;;;;:33;46090:86;;46155:5;46148:12;;;;;46090:86;46070:3;;;;;:::i;:::-;;;;46028:159;;;;46206:4;46199:11;;45779:439;;;;;:::o;31594:110::-;31670:26;31680:2;31684:7;31670:26;;;;;;;;;;;;:9;:26::i;:::-;31594:110;;:::o;30904:348::-;30997:4;31022:16;31030:7;31022;:16::i;:::-;31014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31098:13;31114:23;31129:7;31114:14;:23::i;:::-;31098:39;;31167:5;31156:16;;:7;:16;;;:51;;;;31200:7;31176:31;;:20;31188:7;31176:11;:20::i;:::-;:31;;;31156:51;:87;;;;31211:32;31228:5;31235:7;31211:16;:32::i;:::-;31156:87;31148:96;;;30904:348;;;;:::o;33896:578::-;34055:4;34028:31;;:23;34043:7;34028:14;:23::i;:::-;:31;;;34020:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34138:1;34124:16;;:2;:16;;;;34116:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34194:39;34215:4;34221:2;34225:7;34194:20;:39::i;:::-;34298:29;34315:1;34319:7;34298:8;:29::i;:::-;34359:1;34340:9;:15;34350:4;34340:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34388:1;34371:9;:13;34381:2;34371:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34419:2;34400:7;:16;34408:7;34400:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34458:7;34454:2;34439:27;;34448:4;34439:27;;;;;;;;;;;;33896:578;;;:::o;5386:191::-;5460:16;5479:6;;;;;;;;;;;5460:25;;5505:8;5496:6;;:17;;;;;;;;;;;;;;;;;;5560:8;5529:40;;5550:8;5529:40;;;;;;;;;;;;5449:128;5386:191;:::o;34908:315::-;35063:8;35054:17;;:5;:17;;;;35046:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35150:8;35112:18;:25;35131:5;35112:25;;;;;;;;;;;;;;;:35;35138:8;35112:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35196:8;35174:41;;35189:5;35174:41;;;35206:8;35174:41;;;;;;:::i;:::-;;;;;;;;34908:315;;;:::o;29982:::-;30139:28;30149:4;30155:2;30159:7;30139:9;:28::i;:::-;30186:48;30209:4;30215:2;30219:7;30228:5;30186:22;:48::i;:::-;30178:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29982:315;;;;:::o;45065:108::-;45125:13;45158:7;45151:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45065:108;:::o;402:723::-;458:13;688:1;679:5;:10;675:53;;;706:10;;;;;;;;;;;;;;;;;;;;;675:53;738:12;753:5;738:20;;769:14;794:78;809:1;801:4;:9;794:78;;827:8;;;;;:::i;:::-;;;;858:2;850:10;;;;;:::i;:::-;;;794:78;;;882:19;914:6;904:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;882:39;;932:154;948:1;939:5;:10;932:154;;976:1;966:11;;;;;:::i;:::-;;;1043:2;1035:5;:10;;;;:::i;:::-;1022:2;:24;;;;:::i;:::-;1009:39;;992:6;999;992:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1072:2;1063:11;;;;;:::i;:::-;;;932:154;;;1110:6;1096:21;;;;;402:723;;;;:::o;16548:157::-;16633:4;16672:25;16657:40;;;:11;:40;;;;16650:47;;16548:157;;;:::o;31931:321::-;32061:18;32067:2;32071:7;32061:5;:18::i;:::-;32112:54;32143:1;32147:2;32151:7;32160:5;32112:22;:54::i;:::-;32090:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31931:321;;;:::o;39979:589::-;40123:45;40150:4;40156:2;40160:7;40123:26;:45::i;:::-;40201:1;40185:18;;:4;:18;;;40181:187;;;40220:40;40252:7;40220:31;:40::i;:::-;40181:187;;;40290:2;40282:10;;:4;:10;;;40278:90;;40309:47;40342:4;40348:7;40309:32;:47::i;:::-;40278:90;40181:187;40396:1;40382:16;;:2;:16;;;40378:183;;;40415:45;40452:7;40415:36;:45::i;:::-;40378:183;;;40488:4;40482:10;;:2;:10;;;40478:83;;40509:40;40537:2;40541:7;40509:27;:40::i;:::-;40478:83;40378:183;39979:589;;;:::o;35788:799::-;35943:4;35964:15;:2;:13;;;:15::i;:::-;35960:620;;;36016:2;36000:36;;;36037:12;:10;:12::i;:::-;36051:4;36057:7;36066:5;36000:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35996:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36259:1;36242:6;:13;:18;36238:272;;;36285:60;;;;;;;;;;:::i;:::-;;;;;;;;36238:272;36460:6;36454:13;36445:6;36441:2;36437:15;36430:38;35996:529;36133:41;;;36123:51;;;:6;:51;;;;36116:58;;;;;35960:620;36564:4;36557:11;;35788:799;;;;;;;:::o;32588:382::-;32682:1;32668:16;;:2;:16;;;;32660:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32741:16;32749:7;32741;:16::i;:::-;32740:17;32732:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32803:45;32832:1;32836:2;32840:7;32803:20;:45::i;:::-;32878:1;32861:9;:13;32871:2;32861:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32909:2;32890:7;:16;32898:7;32890:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32954:7;32950:2;32929:33;;32946:1;32929:33;;;;;;;;;;;;32588:382;;:::o;37159:126::-;;;;:::o;41291:164::-;41395:10;:17;;;;41368:15;:24;41384:7;41368:24;;;;;;;;;;;:44;;;;41423:10;41439:7;41423:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41291:164;:::o;42082:988::-;42348:22;42398:1;42373:22;42390:4;42373:16;:22::i;:::-;:26;;;;:::i;:::-;42348:51;;42410:18;42431:17;:26;42449:7;42431:26;;;;;;;;;;;;42410:47;;42578:14;42564:10;:28;42560:328;;42609:19;42631:12;:18;42644:4;42631:18;;;;;;;;;;;;;;;:34;42650:14;42631:34;;;;;;;;;;;;42609:56;;42715:11;42682:12;:18;42695:4;42682:18;;;;;;;;;;;;;;;:30;42701:10;42682:30;;;;;;;;;;;:44;;;;42832:10;42799:17;:30;42817:11;42799:30;;;;;;;;;;;:43;;;;42594:294;42560:328;42984:17;:26;43002:7;42984:26;;;;;;;;;;;42977:33;;;43028:12;:18;43041:4;43028:18;;;;;;;;;;;;;;;:34;43047:14;43028:34;;;;;;;;;;;43021:41;;;42163:907;;42082:988;;:::o;43365:1079::-;43618:22;43663:1;43643:10;:17;;;;:21;;;;:::i;:::-;43618:46;;43675:18;43696:15;:24;43712:7;43696:24;;;;;;;;;;;;43675:45;;44047:19;44069:10;44080:14;44069:26;;;;;;;;:::i;:::-;;;;;;;;;;44047:48;;44133:11;44108:10;44119;44108:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44244:10;44213:15;:28;44229:11;44213:28;;;;;;;;;;;:41;;;;44385:15;:24;44401:7;44385:24;;;;;;;;;;;44378:31;;;44420:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43436:1008;;;43365:1079;:::o;40869:221::-;40954:14;40971:20;40988:2;40971:16;:20::i;:::-;40954:37;;41029:7;41002:12;:16;41015:2;41002:16;;;;;;;;;;;;;;;:24;41019:6;41002:24;;;;;;;;;;;:34;;;;41076:6;41047:17;:26;41065:7;41047:26;;;;;;;;;;;:35;;;;40943:147;40869:221;;:::o;6404:387::-;6464:4;6672:12;6739:7;6727:20;6719:28;;6782:1;6775:4;:8;6768:15;;;6404:387;;;:::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;769:744::-;876:5;901:81;917:64;974:6;917:64;:::i;:::-;901:81;:::i;:::-;892:90;;1002:5;1031:6;1024:5;1017:21;1065:4;1058:5;1054:16;1047:23;;1091:6;1141:3;1133:4;1125:6;1121:17;1116:3;1112:27;1109:36;1106:143;;;1160:79;;:::i;:::-;1106:143;1273:1;1258:249;1283:6;1280:1;1277:13;1258:249;;;1351:3;1380:48;1424:3;1412:10;1380:48;:::i;:::-;1375:3;1368:61;1458:4;1453:3;1449:14;1442:21;;1492:4;1487:3;1483:14;1476:21;;1318:189;1305:1;1302;1298:9;1293:14;;1258:249;;;1262:14;882:631;;769:744;;;;;:::o;1519:410::-;1596:5;1621:65;1637:48;1678:6;1637:48;:::i;:::-;1621:65;:::i;:::-;1612:74;;1709:6;1702:5;1695:21;1747:4;1740:5;1736:16;1785:3;1776:6;1771:3;1767:16;1764:25;1761:112;;;1792:79;;:::i;:::-;1761:112;1882:41;1916:6;1911:3;1906;1882:41;:::i;:::-;1602:327;1519:410;;;;;:::o;1935:412::-;2013:5;2038:66;2054:49;2096:6;2054:49;:::i;:::-;2038:66;:::i;:::-;2029:75;;2127:6;2120:5;2113:21;2165:4;2158:5;2154:16;2203:3;2194:6;2189:3;2185:16;2182:25;2179:112;;;2210:79;;:::i;:::-;2179:112;2300:41;2334:6;2329:3;2324;2300:41;:::i;:::-;2019:328;1935:412;;;;;:::o;2353:139::-;2399:5;2437:6;2424:20;2415:29;;2453:33;2480:5;2453:33;:::i;:::-;2353:139;;;;:::o;2515:370::-;2586:5;2635:3;2628:4;2620:6;2616:17;2612:27;2602:122;;2643:79;;:::i;:::-;2602:122;2760:6;2747:20;2785:94;2875:3;2867:6;2860:4;2852:6;2848:17;2785:94;:::i;:::-;2776:103;;2592:293;2515:370;;;;:::o;2908:385::-;2990:5;3039:3;3032:4;3024:6;3020:17;3016:27;3006:122;;3047:79;;:::i;:::-;3006:122;3157:6;3151:13;3182:105;3283:3;3275:6;3268:4;3260:6;3256:17;3182:105;:::i;:::-;3173:114;;2996:297;2908:385;;;;:::o;3299:133::-;3342:5;3380:6;3367:20;3358:29;;3396:30;3420:5;3396:30;:::i;:::-;3299:133;;;;:::o;3438:137::-;3483:5;3521:6;3508:20;3499:29;;3537:32;3563:5;3537:32;:::i;:::-;3438:137;;;;:::o;3581:141::-;3637:5;3668:6;3662:13;3653:22;;3684:32;3710:5;3684:32;:::i;:::-;3581:141;;;;:::o;3741:338::-;3796:5;3845:3;3838:4;3830:6;3826:17;3822:27;3812:122;;3853:79;;:::i;:::-;3812:122;3970:6;3957:20;3995:78;4069:3;4061:6;4054:4;4046:6;4042:17;3995:78;:::i;:::-;3986:87;;3802:277;3741:338;;;;:::o;4099:340::-;4155:5;4204:3;4197:4;4189:6;4185:17;4181:27;4171:122;;4212:79;;:::i;:::-;4171:122;4329:6;4316:20;4354:79;4429:3;4421:6;4414:4;4406:6;4402:17;4354:79;:::i;:::-;4345:88;;4161:278;4099:340;;;;:::o;4445:139::-;4491:5;4529:6;4516:20;4507:29;;4545:33;4572:5;4545:33;:::i;:::-;4445:139;;;;:::o;4590:143::-;4647:5;4678:6;4672:13;4663:22;;4694:33;4721:5;4694:33;:::i;:::-;4590:143;;;;:::o;4739:329::-;4798:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:119;;;4853:79;;:::i;:::-;4815:119;4973:1;4998:53;5043:7;5034:6;5023:9;5019:22;4998:53;:::i;:::-;4988:63;;4944:117;4739:329;;;;:::o;5074:474::-;5142:6;5150;5199:2;5187:9;5178:7;5174:23;5170:32;5167:119;;;5205:79;;:::i;:::-;5167:119;5325:1;5350:53;5395:7;5386:6;5375:9;5371:22;5350:53;:::i;:::-;5340:63;;5296:117;5452:2;5478:53;5523:7;5514:6;5503:9;5499:22;5478:53;:::i;:::-;5468:63;;5423:118;5074:474;;;;;:::o;5554:619::-;5631:6;5639;5647;5696:2;5684:9;5675:7;5671:23;5667:32;5664:119;;;5702:79;;:::i;:::-;5664:119;5822:1;5847:53;5892:7;5883:6;5872:9;5868:22;5847:53;:::i;:::-;5837:63;;5793:117;5949:2;5975:53;6020:7;6011:6;6000:9;5996:22;5975:53;:::i;:::-;5965:63;;5920:118;6077:2;6103:53;6148:7;6139:6;6128:9;6124:22;6103:53;:::i;:::-;6093:63;;6048:118;5554:619;;;;;:::o;6179:943::-;6274:6;6282;6290;6298;6347:3;6335:9;6326:7;6322:23;6318:33;6315:120;;;6354:79;;:::i;:::-;6315:120;6474:1;6499:53;6544:7;6535:6;6524:9;6520:22;6499:53;:::i;:::-;6489:63;;6445:117;6601:2;6627:53;6672:7;6663:6;6652:9;6648:22;6627:53;:::i;:::-;6617:63;;6572:118;6729:2;6755:53;6800:7;6791:6;6780:9;6776:22;6755:53;:::i;:::-;6745:63;;6700:118;6885:2;6874:9;6870:18;6857:32;6916:18;6908:6;6905:30;6902:117;;;6938:79;;:::i;:::-;6902:117;7043:62;7097:7;7088:6;7077:9;7073:22;7043:62;:::i;:::-;7033:72;;6828:287;6179:943;;;;;;;:::o;7128:468::-;7193:6;7201;7250:2;7238:9;7229:7;7225:23;7221:32;7218:119;;;7256:79;;:::i;:::-;7218:119;7376:1;7401:53;7446:7;7437:6;7426:9;7422:22;7401:53;:::i;:::-;7391:63;;7347:117;7503:2;7529:50;7571:7;7562:6;7551:9;7547:22;7529:50;:::i;:::-;7519:60;;7474:115;7128:468;;;;;:::o;7602:474::-;7670:6;7678;7727:2;7715:9;7706:7;7702:23;7698:32;7695:119;;;7733:79;;:::i;:::-;7695:119;7853:1;7878:53;7923:7;7914:6;7903:9;7899:22;7878:53;:::i;:::-;7868:63;;7824:117;7980:2;8006:53;8051:7;8042:6;8031:9;8027:22;8006:53;:::i;:::-;7996:63;;7951:118;7602:474;;;;;:::o;8082:554::-;8177:6;8226:2;8214:9;8205:7;8201:23;8197:32;8194:119;;;8232:79;;:::i;:::-;8194:119;8373:1;8362:9;8358:17;8352:24;8403:18;8395:6;8392:30;8389:117;;;8425:79;;:::i;:::-;8389:117;8530:89;8611:7;8602:6;8591:9;8587:22;8530:89;:::i;:::-;8520:99;;8323:306;8082:554;;;;:::o;8642:684::-;8735:6;8743;8792:2;8780:9;8771:7;8767:23;8763:32;8760:119;;;8798:79;;:::i;:::-;8760:119;8946:1;8935:9;8931:17;8918:31;8976:18;8968:6;8965:30;8962:117;;;8998:79;;:::i;:::-;8962:117;9103:78;9173:7;9164:6;9153:9;9149:22;9103:78;:::i;:::-;9093:88;;8889:302;9230:2;9256:53;9301:7;9292:6;9281:9;9277:22;9256:53;:::i;:::-;9246:63;;9201:118;8642:684;;;;;:::o;9332:323::-;9388:6;9437:2;9425:9;9416:7;9412:23;9408:32;9405:119;;;9443:79;;:::i;:::-;9405:119;9563:1;9588:50;9630:7;9621:6;9610:9;9606:22;9588:50;:::i;:::-;9578:60;;9534:114;9332:323;;;;:::o;9661:327::-;9719:6;9768:2;9756:9;9747:7;9743:23;9739:32;9736:119;;;9774:79;;:::i;:::-;9736:119;9894:1;9919:52;9963:7;9954:6;9943:9;9939:22;9919:52;:::i;:::-;9909:62;;9865:116;9661:327;;;;:::o;9994:349::-;10063:6;10112:2;10100:9;10091:7;10087:23;10083:32;10080:119;;;10118:79;;:::i;:::-;10080:119;10238:1;10263:63;10318:7;10309:6;10298:9;10294:22;10263:63;:::i;:::-;10253:73;;10209:127;9994:349;;;;:::o;10349:509::-;10418:6;10467:2;10455:9;10446:7;10442:23;10438:32;10435:119;;;10473:79;;:::i;:::-;10435:119;10621:1;10610:9;10606:17;10593:31;10651:18;10643:6;10640:30;10637:117;;;10673:79;;:::i;:::-;10637:117;10778:63;10833:7;10824:6;10813:9;10809:22;10778:63;:::i;:::-;10768:73;;10564:287;10349:509;;;;:::o;10864:329::-;10923:6;10972:2;10960:9;10951:7;10947:23;10943:32;10940:119;;;10978:79;;:::i;:::-;10940:119;11098:1;11123:53;11168:7;11159:6;11148:9;11144:22;11123:53;:::i;:::-;11113:63;;11069:117;10864:329;;;;:::o;11199:179::-;11268:10;11289:46;11331:3;11323:6;11289:46;:::i;:::-;11367:4;11362:3;11358:14;11344:28;;11199:179;;;;:::o;11384:118::-;11471:24;11489:5;11471:24;:::i;:::-;11466:3;11459:37;11384:118;;:::o;11538:732::-;11657:3;11686:54;11734:5;11686:54;:::i;:::-;11756:86;11835:6;11830:3;11756:86;:::i;:::-;11749:93;;11866:56;11916:5;11866:56;:::i;:::-;11945:7;11976:1;11961:284;11986:6;11983:1;11980:13;11961:284;;;12062:6;12056:13;12089:63;12148:3;12133:13;12089:63;:::i;:::-;12082:70;;12175:60;12228:6;12175:60;:::i;:::-;12165:70;;12021:224;12008:1;12005;12001:9;11996:14;;11961:284;;;11965:14;12261:3;12254:10;;11662:608;;;11538:732;;;;:::o;12276:109::-;12357:21;12372:5;12357:21;:::i;:::-;12352:3;12345:34;12276:109;;:::o;12391:360::-;12477:3;12505:38;12537:5;12505:38;:::i;:::-;12559:70;12622:6;12617:3;12559:70;:::i;:::-;12552:77;;12638:52;12683:6;12678:3;12671:4;12664:5;12660:16;12638:52;:::i;:::-;12715:29;12737:6;12715:29;:::i;:::-;12710:3;12706:39;12699:46;;12481:270;12391:360;;;;:::o;12757:373::-;12861:3;12889:38;12921:5;12889:38;:::i;:::-;12943:88;13024:6;13019:3;12943:88;:::i;:::-;12936:95;;13040:52;13085:6;13080:3;13073:4;13066:5;13062:16;13040:52;:::i;:::-;13117:6;13112:3;13108:16;13101:23;;12865:265;12757:373;;;;:::o;13136:364::-;13224:3;13252:39;13285:5;13252:39;:::i;:::-;13307:71;13371:6;13366:3;13307:71;:::i;:::-;13300:78;;13387:52;13432:6;13427:3;13420:4;13413:5;13409:16;13387:52;:::i;:::-;13464:29;13486:6;13464:29;:::i;:::-;13459:3;13455:39;13448:46;;13228:272;13136:364;;;;:::o;13506:377::-;13612:3;13640:39;13673:5;13640:39;:::i;:::-;13695:89;13777:6;13772:3;13695:89;:::i;:::-;13688:96;;13793:52;13838:6;13833:3;13826:4;13819:5;13815:16;13793:52;:::i;:::-;13870:6;13865:3;13861:16;13854:23;;13616:267;13506:377;;;;:::o;13913:845::-;14016:3;14053:5;14047:12;14082:36;14108:9;14082:36;:::i;:::-;14134:89;14216:6;14211:3;14134:89;:::i;:::-;14127:96;;14254:1;14243:9;14239:17;14270:1;14265:137;;;;14416:1;14411:341;;;;14232:520;;14265:137;14349:4;14345:9;14334;14330:25;14325:3;14318:38;14385:6;14380:3;14376:16;14369:23;;14265:137;;14411:341;14478:38;14510:5;14478:38;:::i;:::-;14538:1;14552:154;14566:6;14563:1;14560:13;14552:154;;;14640:7;14634:14;14630:1;14625:3;14621:11;14614:35;14690:1;14681:7;14677:15;14666:26;;14588:4;14585:1;14581:12;14576:17;;14552:154;;;14735:6;14730:3;14726:16;14719:23;;14418:334;;14232:520;;14020:738;;13913:845;;;;:::o;14764:366::-;14906:3;14927:67;14991:2;14986:3;14927:67;:::i;:::-;14920:74;;15003:93;15092:3;15003:93;:::i;:::-;15121:2;15116:3;15112:12;15105:19;;14764:366;;;:::o;15136:::-;15278:3;15299:67;15363:2;15358:3;15299:67;:::i;:::-;15292:74;;15375:93;15464:3;15375:93;:::i;:::-;15493:2;15488:3;15484:12;15477:19;;15136:366;;;:::o;15508:::-;15650:3;15671:67;15735:2;15730:3;15671:67;:::i;:::-;15664:74;;15747:93;15836:3;15747:93;:::i;:::-;15865:2;15860:3;15856:12;15849:19;;15508:366;;;:::o;15880:::-;16022:3;16043:67;16107:2;16102:3;16043:67;:::i;:::-;16036:74;;16119:93;16208:3;16119:93;:::i;:::-;16237:2;16232:3;16228:12;16221:19;;15880:366;;;:::o;16252:::-;16394:3;16415:67;16479:2;16474:3;16415:67;:::i;:::-;16408:74;;16491:93;16580:3;16491:93;:::i;:::-;16609:2;16604:3;16600:12;16593:19;;16252:366;;;:::o;16624:::-;16766:3;16787:67;16851:2;16846:3;16787:67;:::i;:::-;16780:74;;16863:93;16952:3;16863:93;:::i;:::-;16981:2;16976:3;16972:12;16965:19;;16624:366;;;:::o;16996:::-;17138:3;17159:67;17223:2;17218:3;17159:67;:::i;:::-;17152:74;;17235:93;17324:3;17235:93;:::i;:::-;17353:2;17348:3;17344:12;17337:19;;16996:366;;;:::o;17368:::-;17510:3;17531:67;17595:2;17590:3;17531:67;:::i;:::-;17524:74;;17607:93;17696:3;17607:93;:::i;:::-;17725:2;17720:3;17716:12;17709:19;;17368:366;;;:::o;17740:::-;17882:3;17903:67;17967:2;17962:3;17903:67;:::i;:::-;17896:74;;17979:93;18068:3;17979:93;:::i;:::-;18097:2;18092:3;18088:12;18081:19;;17740:366;;;:::o;18112:::-;18254:3;18275:67;18339:2;18334:3;18275:67;:::i;:::-;18268:74;;18351:93;18440:3;18351:93;:::i;:::-;18469:2;18464:3;18460:12;18453:19;;18112:366;;;:::o;18484:::-;18626:3;18647:67;18711:2;18706:3;18647:67;:::i;:::-;18640:74;;18723:93;18812:3;18723:93;:::i;:::-;18841:2;18836:3;18832:12;18825:19;;18484:366;;;:::o;18856:::-;18998:3;19019:67;19083:2;19078:3;19019:67;:::i;:::-;19012:74;;19095:93;19184:3;19095:93;:::i;:::-;19213:2;19208:3;19204:12;19197:19;;18856:366;;;:::o;19228:::-;19370:3;19391:67;19455:2;19450:3;19391:67;:::i;:::-;19384:74;;19467:93;19556:3;19467:93;:::i;:::-;19585:2;19580:3;19576:12;19569:19;;19228:366;;;:::o;19600:::-;19742:3;19763:67;19827:2;19822:3;19763:67;:::i;:::-;19756:74;;19839:93;19928:3;19839:93;:::i;:::-;19957:2;19952:3;19948:12;19941:19;;19600:366;;;:::o;19972:::-;20114:3;20135:67;20199:2;20194:3;20135:67;:::i;:::-;20128:74;;20211:93;20300:3;20211:93;:::i;:::-;20329:2;20324:3;20320:12;20313:19;;19972:366;;;:::o;20344:::-;20486:3;20507:67;20571:2;20566:3;20507:67;:::i;:::-;20500:74;;20583:93;20672:3;20583:93;:::i;:::-;20701:2;20696:3;20692:12;20685:19;;20344:366;;;:::o;20716:::-;20858:3;20879:67;20943:2;20938:3;20879:67;:::i;:::-;20872:74;;20955:93;21044:3;20955:93;:::i;:::-;21073:2;21068:3;21064:12;21057:19;;20716:366;;;:::o;21088:::-;21230:3;21251:67;21315:2;21310:3;21251:67;:::i;:::-;21244:74;;21327:93;21416:3;21327:93;:::i;:::-;21445:2;21440:3;21436:12;21429:19;;21088:366;;;:::o;21460:::-;21602:3;21623:67;21687:2;21682:3;21623:67;:::i;:::-;21616:74;;21699:93;21788:3;21699:93;:::i;:::-;21817:2;21812:3;21808:12;21801:19;;21460:366;;;:::o;21832:::-;21974:3;21995:67;22059:2;22054:3;21995:67;:::i;:::-;21988:74;;22071:93;22160:3;22071:93;:::i;:::-;22189:2;22184:3;22180:12;22173:19;;21832:366;;;:::o;22204:::-;22346:3;22367:67;22431:2;22426:3;22367:67;:::i;:::-;22360:74;;22443:93;22532:3;22443:93;:::i;:::-;22561:2;22556:3;22552:12;22545:19;;22204:366;;;:::o;22576:398::-;22735:3;22756:83;22837:1;22832:3;22756:83;:::i;:::-;22749:90;;22848:93;22937:3;22848:93;:::i;:::-;22966:1;22961:3;22957:11;22950:18;;22576:398;;;:::o;22980:366::-;23122:3;23143:67;23207:2;23202:3;23143:67;:::i;:::-;23136:74;;23219:93;23308:3;23219:93;:::i;:::-;23337:2;23332:3;23328:12;23321:19;;22980:366;;;:::o;23352:::-;23494:3;23515:67;23579:2;23574:3;23515:67;:::i;:::-;23508:74;;23591:93;23680:3;23591:93;:::i;:::-;23709:2;23704:3;23700:12;23693:19;;23352:366;;;:::o;23724:108::-;23801:24;23819:5;23801:24;:::i;:::-;23796:3;23789:37;23724:108;;:::o;23838:118::-;23925:24;23943:5;23925:24;:::i;:::-;23920:3;23913:37;23838:118;;:::o;23962:271::-;24092:3;24114:93;24203:3;24194:6;24114:93;:::i;:::-;24107:100;;24224:3;24217:10;;23962:271;;;;:::o;24239:589::-;24464:3;24486:95;24577:3;24568:6;24486:95;:::i;:::-;24479:102;;24598:95;24689:3;24680:6;24598:95;:::i;:::-;24591:102;;24710:92;24798:3;24789:6;24710:92;:::i;:::-;24703:99;;24819:3;24812:10;;24239:589;;;;;;:::o;24834:379::-;25018:3;25040:147;25183:3;25040:147;:::i;:::-;25033:154;;25204:3;25197:10;;24834:379;;;:::o;25219:222::-;25312:4;25350:2;25339:9;25335:18;25327:26;;25363:71;25431:1;25420:9;25416:17;25407:6;25363:71;:::i;:::-;25219:222;;;;:::o;25447:640::-;25642:4;25680:3;25669:9;25665:19;25657:27;;25694:71;25762:1;25751:9;25747:17;25738:6;25694:71;:::i;:::-;25775:72;25843:2;25832:9;25828:18;25819:6;25775:72;:::i;:::-;25857;25925:2;25914:9;25910:18;25901:6;25857:72;:::i;:::-;25976:9;25970:4;25966:20;25961:2;25950:9;25946:18;25939:48;26004:76;26075:4;26066:6;26004:76;:::i;:::-;25996:84;;25447:640;;;;;;;:::o;26093:373::-;26236:4;26274:2;26263:9;26259:18;26251:26;;26323:9;26317:4;26313:20;26309:1;26298:9;26294:17;26287:47;26351:108;26454:4;26445:6;26351:108;:::i;:::-;26343:116;;26093:373;;;;:::o;26472:210::-;26559:4;26597:2;26586:9;26582:18;26574:26;;26610:65;26672:1;26661:9;26657:17;26648:6;26610:65;:::i;:::-;26472:210;;;;:::o;26688:313::-;26801:4;26839:2;26828:9;26824:18;26816:26;;26888:9;26882:4;26878:20;26874:1;26863:9;26859:17;26852:47;26916:78;26989:4;26980:6;26916:78;:::i;:::-;26908:86;;26688:313;;;;:::o;27007:419::-;27173:4;27211:2;27200:9;27196:18;27188:26;;27260:9;27254:4;27250:20;27246:1;27235:9;27231:17;27224:47;27288:131;27414:4;27288:131;:::i;:::-;27280:139;;27007:419;;;:::o;27432:::-;27598:4;27636:2;27625:9;27621:18;27613:26;;27685:9;27679:4;27675:20;27671:1;27660:9;27656:17;27649:47;27713:131;27839:4;27713:131;:::i;:::-;27705:139;;27432:419;;;:::o;27857:::-;28023:4;28061:2;28050:9;28046:18;28038:26;;28110:9;28104:4;28100:20;28096:1;28085:9;28081:17;28074:47;28138:131;28264:4;28138:131;:::i;:::-;28130:139;;27857:419;;;:::o;28282:::-;28448:4;28486:2;28475:9;28471:18;28463:26;;28535:9;28529:4;28525:20;28521:1;28510:9;28506:17;28499:47;28563:131;28689:4;28563:131;:::i;:::-;28555:139;;28282:419;;;:::o;28707:::-;28873:4;28911:2;28900:9;28896:18;28888:26;;28960:9;28954:4;28950:20;28946:1;28935:9;28931:17;28924:47;28988:131;29114:4;28988:131;:::i;:::-;28980:139;;28707:419;;;:::o;29132:::-;29298:4;29336:2;29325:9;29321:18;29313:26;;29385:9;29379:4;29375:20;29371:1;29360:9;29356:17;29349:47;29413:131;29539:4;29413:131;:::i;:::-;29405:139;;29132:419;;;:::o;29557:::-;29723:4;29761:2;29750:9;29746:18;29738:26;;29810:9;29804:4;29800:20;29796:1;29785:9;29781:17;29774:47;29838:131;29964:4;29838:131;:::i;:::-;29830:139;;29557:419;;;:::o;29982:::-;30148:4;30186:2;30175:9;30171:18;30163:26;;30235:9;30229:4;30225:20;30221:1;30210:9;30206:17;30199:47;30263:131;30389:4;30263:131;:::i;:::-;30255:139;;29982:419;;;:::o;30407:::-;30573:4;30611:2;30600:9;30596:18;30588:26;;30660:9;30654:4;30650:20;30646:1;30635:9;30631:17;30624:47;30688:131;30814:4;30688:131;:::i;:::-;30680:139;;30407:419;;;:::o;30832:::-;30998:4;31036:2;31025:9;31021:18;31013:26;;31085:9;31079:4;31075:20;31071:1;31060:9;31056:17;31049:47;31113:131;31239:4;31113:131;:::i;:::-;31105:139;;30832:419;;;:::o;31257:::-;31423:4;31461:2;31450:9;31446:18;31438:26;;31510:9;31504:4;31500:20;31496:1;31485:9;31481:17;31474:47;31538:131;31664:4;31538:131;:::i;:::-;31530:139;;31257:419;;;:::o;31682:::-;31848:4;31886:2;31875:9;31871:18;31863:26;;31935:9;31929:4;31925:20;31921:1;31910:9;31906:17;31899:47;31963:131;32089:4;31963:131;:::i;:::-;31955:139;;31682:419;;;:::o;32107:::-;32273:4;32311:2;32300:9;32296:18;32288:26;;32360:9;32354:4;32350:20;32346:1;32335:9;32331:17;32324:47;32388:131;32514:4;32388:131;:::i;:::-;32380:139;;32107:419;;;:::o;32532:::-;32698:4;32736:2;32725:9;32721:18;32713:26;;32785:9;32779:4;32775:20;32771:1;32760:9;32756:17;32749:47;32813:131;32939:4;32813:131;:::i;:::-;32805:139;;32532:419;;;:::o;32957:::-;33123:4;33161:2;33150:9;33146:18;33138:26;;33210:9;33204:4;33200:20;33196:1;33185:9;33181:17;33174:47;33238:131;33364:4;33238:131;:::i;:::-;33230:139;;32957:419;;;:::o;33382:::-;33548:4;33586:2;33575:9;33571:18;33563:26;;33635:9;33629:4;33625:20;33621:1;33610:9;33606:17;33599:47;33663:131;33789:4;33663:131;:::i;:::-;33655:139;;33382:419;;;:::o;33807:::-;33973:4;34011:2;34000:9;33996:18;33988:26;;34060:9;34054:4;34050:20;34046:1;34035:9;34031:17;34024:47;34088:131;34214:4;34088:131;:::i;:::-;34080:139;;33807:419;;;:::o;34232:::-;34398:4;34436:2;34425:9;34421:18;34413:26;;34485:9;34479:4;34475:20;34471:1;34460:9;34456:17;34449:47;34513:131;34639:4;34513:131;:::i;:::-;34505:139;;34232:419;;;:::o;34657:::-;34823:4;34861:2;34850:9;34846:18;34838:26;;34910:9;34904:4;34900:20;34896:1;34885:9;34881:17;34874:47;34938:131;35064:4;34938:131;:::i;:::-;34930:139;;34657:419;;;:::o;35082:::-;35248:4;35286:2;35275:9;35271:18;35263:26;;35335:9;35329:4;35325:20;35321:1;35310:9;35306:17;35299:47;35363:131;35489:4;35363:131;:::i;:::-;35355:139;;35082:419;;;:::o;35507:::-;35673:4;35711:2;35700:9;35696:18;35688:26;;35760:9;35754:4;35750:20;35746:1;35735:9;35731:17;35724:47;35788:131;35914:4;35788:131;:::i;:::-;35780:139;;35507:419;;;:::o;35932:::-;36098:4;36136:2;36125:9;36121:18;36113:26;;36185:9;36179:4;36175:20;36171:1;36160:9;36156:17;36149:47;36213:131;36339:4;36213:131;:::i;:::-;36205:139;;35932:419;;;:::o;36357:::-;36523:4;36561:2;36550:9;36546:18;36538:26;;36610:9;36604:4;36600:20;36596:1;36585:9;36581:17;36574:47;36638:131;36764:4;36638:131;:::i;:::-;36630:139;;36357:419;;;:::o;36782:222::-;36875:4;36913:2;36902:9;36898:18;36890:26;;36926:71;36994:1;36983:9;36979:17;36970:6;36926:71;:::i;:::-;36782:222;;;;:::o;37010:129::-;37044:6;37071:20;;:::i;:::-;37061:30;;37100:33;37128:4;37120:6;37100:33;:::i;:::-;37010:129;;;:::o;37145:75::-;37178:6;37211:2;37205:9;37195:19;;37145:75;:::o;37226:311::-;37303:4;37393:18;37385:6;37382:30;37379:56;;;37415:18;;:::i;:::-;37379:56;37465:4;37457:6;37453:17;37445:25;;37525:4;37519;37515:15;37507:23;;37226:311;;;:::o;37543:307::-;37604:4;37694:18;37686:6;37683:30;37680:56;;;37716:18;;:::i;:::-;37680:56;37754:29;37776:6;37754:29;:::i;:::-;37746:37;;37838:4;37832;37828:15;37820:23;;37543:307;;;:::o;37856:308::-;37918:4;38008:18;38000:6;37997:30;37994:56;;;38030:18;;:::i;:::-;37994:56;38068:29;38090:6;38068:29;:::i;:::-;38060:37;;38152:4;38146;38142:15;38134:23;;37856:308;;;:::o;38170:132::-;38237:4;38260:3;38252:11;;38290:4;38285:3;38281:14;38273:22;;38170:132;;;:::o;38308:141::-;38357:4;38380:3;38372:11;;38403:3;38400:1;38393:14;38437:4;38434:1;38424:18;38416:26;;38308:141;;;:::o;38455:114::-;38522:6;38556:5;38550:12;38540:22;;38455:114;;;:::o;38575:98::-;38626:6;38660:5;38654:12;38644:22;;38575:98;;;:::o;38679:99::-;38731:6;38765:5;38759:12;38749:22;;38679:99;;;:::o;38784:113::-;38854:4;38886;38881:3;38877:14;38869:22;;38784:113;;;:::o;38903:184::-;39002:11;39036:6;39031:3;39024:19;39076:4;39071:3;39067:14;39052:29;;38903:184;;;;:::o;39093:168::-;39176:11;39210:6;39205:3;39198:19;39250:4;39245:3;39241:14;39226:29;;39093:168;;;;:::o;39267:147::-;39368:11;39405:3;39390:18;;39267:147;;;;:::o;39420:169::-;39504:11;39538:6;39533:3;39526:19;39578:4;39573:3;39569:14;39554:29;;39420:169;;;;:::o;39595:148::-;39697:11;39734:3;39719:18;;39595:148;;;;:::o;39749:305::-;39789:3;39808:20;39826:1;39808:20;:::i;:::-;39803:25;;39842:20;39860:1;39842:20;:::i;:::-;39837:25;;39996:1;39928:66;39924:74;39921:1;39918:81;39915:107;;;40002:18;;:::i;:::-;39915:107;40046:1;40043;40039:9;40032:16;;39749:305;;;;:::o;40060:185::-;40100:1;40117:20;40135:1;40117:20;:::i;:::-;40112:25;;40151:20;40169:1;40151:20;:::i;:::-;40146:25;;40190:1;40180:35;;40195:18;;:::i;:::-;40180:35;40237:1;40234;40230:9;40225:14;;40060:185;;;;:::o;40251:191::-;40291:4;40311:20;40329:1;40311:20;:::i;:::-;40306:25;;40345:20;40363:1;40345:20;:::i;:::-;40340:25;;40384:1;40381;40378:8;40375:34;;;40389:18;;:::i;:::-;40375:34;40434:1;40431;40427:9;40419:17;;40251:191;;;;:::o;40448:96::-;40485:7;40514:24;40532:5;40514:24;:::i;:::-;40503:35;;40448:96;;;:::o;40550:90::-;40584:7;40627:5;40620:13;40613:21;40602:32;;40550:90;;;:::o;40646:149::-;40682:7;40722:66;40715:5;40711:78;40700:89;;40646:149;;;:::o;40801:126::-;40838:7;40878:42;40871:5;40867:54;40856:65;;40801:126;;;:::o;40933:77::-;40970:7;40999:5;40988:16;;40933:77;;;:::o;41016:154::-;41100:6;41095:3;41090;41077:30;41162:1;41153:6;41148:3;41144:16;41137:27;41016:154;;;:::o;41176:307::-;41244:1;41254:113;41268:6;41265:1;41262:13;41254:113;;;41353:1;41348:3;41344:11;41338:18;41334:1;41329:3;41325:11;41318:39;41290:2;41287:1;41283:10;41278:15;;41254:113;;;41385:6;41382:1;41379:13;41376:101;;;41465:1;41456:6;41451:3;41447:16;41440:27;41376:101;41225:258;41176:307;;;:::o;41489:320::-;41533:6;41570:1;41564:4;41560:12;41550:22;;41617:1;41611:4;41607:12;41638:18;41628:81;;41694:4;41686:6;41682:17;41672:27;;41628:81;41756:2;41748:6;41745:14;41725:18;41722:38;41719:84;;;41775:18;;:::i;:::-;41719:84;41540:269;41489:320;;;:::o;41815:281::-;41898:27;41920:4;41898:27;:::i;:::-;41890:6;41886:40;42028:6;42016:10;42013:22;41992:18;41980:10;41977:34;41974:62;41971:88;;;42039:18;;:::i;:::-;41971:88;42079:10;42075:2;42068:22;41858:238;41815:281;;:::o;42102:233::-;42141:3;42164:24;42182:5;42164:24;:::i;:::-;42155:33;;42210:66;42203:5;42200:77;42197:103;;;42280:18;;:::i;:::-;42197:103;42327:1;42320:5;42316:13;42309:20;;42102:233;;;:::o;42341:176::-;42373:1;42390:20;42408:1;42390:20;:::i;:::-;42385:25;;42424:20;42442:1;42424:20;:::i;:::-;42419:25;;42463:1;42453:35;;42468:18;;:::i;:::-;42453:35;42509:1;42506;42502:9;42497:14;;42341:176;;;;:::o;42523:180::-;42571:77;42568:1;42561:88;42668:4;42665:1;42658:15;42692:4;42689:1;42682:15;42709:180;42757:77;42754:1;42747:88;42854:4;42851:1;42844:15;42878:4;42875:1;42868:15;42895:180;42943:77;42940:1;42933:88;43040:4;43037:1;43030:15;43064:4;43061:1;43054:15;43081:180;43129:77;43126:1;43119:88;43226:4;43223:1;43216:15;43250:4;43247:1;43240:15;43267:180;43315:77;43312:1;43305:88;43412:4;43409:1;43402:15;43436:4;43433:1;43426:15;43453:180;43501:77;43498:1;43491:88;43598:4;43595:1;43588:15;43622:4;43619:1;43612:15;43639:117;43748:1;43745;43738:12;43762:117;43871:1;43868;43861:12;43885:117;43994:1;43991;43984:12;44008:117;44117:1;44114;44107:12;44131:117;44240:1;44237;44230:12;44254:102;44295:6;44346:2;44342:7;44337:2;44330:5;44326:14;44322:28;44312:38;;44254:102;;;:::o;44362:294::-;44502:34;44498:1;44490:6;44486:14;44479:58;44571:34;44566:2;44558:6;44554:15;44547:59;44640:8;44635:2;44627:6;44623:15;44616:33;44362:294;:::o;44662:176::-;44802:28;44798:1;44790:6;44786:14;44779:52;44662:176;:::o;44844:230::-;44984:34;44980:1;44972:6;44968:14;44961:58;45053:13;45048:2;45040:6;45036:15;45029:38;44844:230;:::o;45080:237::-;45220:34;45216:1;45208:6;45204:14;45197:58;45289:20;45284:2;45276:6;45272:15;45265:45;45080:237;:::o;45323:225::-;45463:34;45459:1;45451:6;45447:14;45440:58;45532:8;45527:2;45519:6;45515:15;45508:33;45323:225;:::o;45554:178::-;45694:30;45690:1;45682:6;45678:14;45671:54;45554:178;:::o;45738:170::-;45878:22;45874:1;45866:6;45862:14;45855:46;45738:170;:::o;45914:223::-;46054:34;46050:1;46042:6;46038:14;46031:58;46123:6;46118:2;46110:6;46106:15;46099:31;45914:223;:::o;46143:175::-;46283:27;46279:1;46271:6;46267:14;46260:51;46143:175;:::o;46324:231::-;46464:34;46460:1;46452:6;46448:14;46441:58;46533:14;46528:2;46520:6;46516:15;46509:39;46324:231;:::o;46561:243::-;46701:34;46697:1;46689:6;46685:14;46678:58;46770:26;46765:2;46757:6;46753:15;46746:51;46561:243;:::o;46810:249::-;46950:34;46946:1;46938:6;46934:14;46927:58;47019:32;47014:2;47006:6;47002:15;46995:57;46810:249;:::o;47065:229::-;47205:34;47201:1;47193:6;47189:14;47182:58;47274:12;47269:2;47261:6;47257:15;47250:37;47065:229;:::o;47300:228::-;47440:34;47436:1;47428:6;47424:14;47417:58;47509:11;47504:2;47496:6;47492:15;47485:36;47300:228;:::o;47534:182::-;47674:34;47670:1;47662:6;47658:14;47651:58;47534:182;:::o;47722:173::-;47862:25;47858:1;47850:6;47846:14;47839:49;47722:173;:::o;47901:231::-;48041:34;48037:1;48029:6;48025:14;48018:58;48110:14;48105:2;48097:6;48093:15;48086:39;47901:231;:::o;48138:182::-;48278:34;48274:1;48266:6;48262:14;48255:58;48138:182;:::o;48326:228::-;48466:34;48462:1;48454:6;48450:14;48443:58;48535:11;48530:2;48522:6;48518:15;48511:36;48326:228;:::o;48560:234::-;48700:34;48696:1;48688:6;48684:14;48677:58;48769:17;48764:2;48756:6;48752:15;48745:42;48560:234;:::o;48800:220::-;48940:34;48936:1;48928:6;48924:14;48917:58;49009:3;49004:2;48996:6;48992:15;48985:28;48800:220;:::o;49026:114::-;;:::o;49146:236::-;49286:34;49282:1;49274:6;49270:14;49263:58;49355:19;49350:2;49342:6;49338:15;49331:44;49146:236;:::o;49388:231::-;49528:34;49524:1;49516:6;49512:14;49505:58;49597:14;49592:2;49584:6;49580:15;49573:39;49388:231;:::o;49625:122::-;49698:24;49716:5;49698:24;:::i;:::-;49691:5;49688:35;49678:63;;49737:1;49734;49727:12;49678:63;49625:122;:::o;49753:116::-;49823:21;49838:5;49823:21;:::i;:::-;49816:5;49813:32;49803:60;;49859:1;49856;49849:12;49803:60;49753:116;:::o;49875:120::-;49947:23;49964:5;49947:23;:::i;:::-;49940:5;49937:34;49927:62;;49985:1;49982;49975:12;49927:62;49875:120;:::o;50001:122::-;50074:24;50092:5;50074:24;:::i;:::-;50067:5;50064:35;50054:63;;50113:1;50110;50103:12;50054:63;50001:122;:::o
Swarm Source
ipfs://740424a8c5d5d4485f3f7a0bcb6e80ade7b79a37dc5056686ed40d5d3c093ba7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.