Overview
CRO Balance
CRO Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
VOLTAIK_PLANT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-06-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @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; } /** * @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); } /** * @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); } /** * @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); } } } } /** * @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; } } /** * @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); } } /** * @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; } } /** * @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 {} } /** * @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); } /** * @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(); } } /** * @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); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } interface PanelsBonus { function getBonusDefiInBP() external view returns(uint256); function getBonusP2EInBP() external view returns(uint256); } contract VOLTAIK_PLANT is ERC721Enumerable, Ownable, PanelsBonus { using SafeMath for uint256; using Address for address; string private baseURI; bool public sameURIForAll = true; uint256 private bonusDefiInBP = 0; uint256 private bonusP2EInBP = 0; constructor() ERC721("Voltaik Nuclear Plant", "VOLTAIK-PLANT") { } function airdrop(uint256 numberOfMints, address wallet) public onlyOwner { uint256 supply = totalSupply(); for (uint256 i = 0; i < numberOfMints; i++) { _safeMint(wallet, supply + 1 + i); } } function airdrops(uint256 numberOfMints, address[] calldata wallets) public onlyOwner { uint256 supply = totalSupply(); for (uint256 j = 0; j < wallets.length; j++) { for (uint256 i = 0; i < numberOfMints; i++) { _safeMint(wallets[j], supply + 1 + i + j * numberOfMints); } } } function mint(uint256 numberOfMints) public onlyOwner { uint256 supply = totalSupply(); for (uint256 i = 0; i < numberOfMints; i++) { _safeMint(msg.sender, supply + 1 + i); } } function walletOfOwner(address owner) external view returns(uint256[] memory) { uint256 tokenCount = balanceOf(owner); uint256[] memory tokensId = new uint256[](tokenCount); for(uint256 i; i < tokenCount; i++){ tokensId[i] = tokenOfOwnerByIndex(owner, i); } return tokensId; } function setBonusDefiInBP(uint256 _bonusDefiInBP) public onlyOwner { bonusDefiInBP = _bonusDefiInBP; } function getBonusDefiInBP() external view override returns(uint256) { return bonusDefiInBP; } function setBonusP2EInBP(uint256 _bonusP2EInBP) public onlyOwner { bonusP2EInBP = _bonusP2EInBP; } function getBonusP2EInBP() external view override returns(uint256) { return bonusP2EInBP; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function setSameURIForAll(bool newSameURIForAll) public onlyOwner { sameURIForAll = newSameURIForAll; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory base = _baseURI(); if (sameURIForAll){ return bytes(base).length > 0 ? string(abi.encodePacked(base)) : ""; } return bytes(base).length > 0 ? string(abi.encodePacked(base, uint2str(tokenId), ".json")) : ""; } function uint2str(uint _i) private pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"airdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBonusDefiInBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBonusP2EInBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sameURIForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusDefiInBP","type":"uint256"}],"name":"setBonusDefiInBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusP2EInBP","type":"uint256"}],"name":"setBonusP2EInBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSameURIForAll","type":"bool"}],"name":"setSameURIForAll","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"}]
Contract Creation Code
60806040526001600c60006101000a81548160ff0219169083151502179055506000600d556000600e553480156200003657600080fd5b506040518060400160405280601581526020017f566f6c7461696b204e75636c65617220506c616e7400000000000000000000008152506040518060400160405280600d81526020017f564f4c5441494b2d504c414e54000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001cb565b508060019080519060200190620000d4929190620001cb565b505050620000f7620000eb620000fd60201b60201c565b6200010560201b60201c565b620002e0565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d9906200027b565b90600052602060002090601f016020900481019282620001fd576000855562000249565b82601f106200021857805160ff191683800117855562000249565b8280016001018555821562000249579182015b82811115620002485782518255916020019190600101906200022b565b5b5090506200025891906200025c565b5090565b5b80821115620002775760008160009055506001016200025d565b5090565b600060028204905060018216806200029457607f821691505b60208210811415620002ab57620002aa620002b1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fcb80620002f06000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063c06fd11b11610071578063c06fd11b1461053f578063c87b56dd1461055b578063e985e9c51461058b578063f2fde38b146105bb576101da565b8063a22cb465146104cf578063b88d4fde146104eb578063ba73bdd314610507578063bc63f02e14610523576101da565b80638c47e88a116100de5780638c47e88a1461045b5780638da5cb5b1461047757806395d89b4114610495578063a0712d68146104b3576101da565b806370a0823114610403578063715018a61461043357806385d08c921461043d576101da565b806342842e0e1161017c5780634f6ccce71161014b5780634f6ccce71461036b57806355f804b31461039b5780636352211e146103b757806363562f74146103e7576101da565b806342842e0e146102e3578063438b6300146102ff5780634d76791e1461032f5780634f135b381461034d576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612c4e565b6105d7565b604051610206919061327b565b60405180910390f35b610217610651565b6040516102249190613296565b60405180910390f35b61024760048036038101906102429190612cf1565b6106e3565b60405161025491906131f2565b60405180910390f35b61027760048036038101906102729190612be1565b610768565b005b610281610880565b60405161028e91906134f8565b60405180910390f35b6102b160048036038101906102ac9190612acb565b61088d565b005b6102cd60048036038101906102c89190612be1565b6108ed565b6040516102da91906134f8565b60405180910390f35b6102fd60048036038101906102f89190612acb565b610992565b005b61031960048036038101906103149190612a5e565b6109b2565b6040516103269190613259565b60405180910390f35b610337610a60565b60405161034491906134f8565b60405180910390f35b610355610a6a565b604051610362919061327b565b60405180910390f35b61038560048036038101906103809190612cf1565b610a7d565b60405161039291906134f8565b60405180910390f35b6103b560048036038101906103b09190612ca8565b610aee565b005b6103d160048036038101906103cc9190612cf1565b610b84565b6040516103de91906131f2565b60405180910390f35b61040160048036038101906103fc9190612cf1565b610c36565b005b61041d60048036038101906104189190612a5e565b610cbc565b60405161042a91906134f8565b60405180910390f35b61043b610d74565b005b610445610dfc565b60405161045291906134f8565b60405180910390f35b61047560048036038101906104709190612c21565b610e06565b005b61047f610e9f565b60405161048c91906131f2565b60405180910390f35b61049d610ec9565b6040516104aa9190613296565b60405180910390f35b6104cd60048036038101906104c89190612cf1565b610f5b565b005b6104e960048036038101906104e49190612ba1565b611027565b005b61050560048036038101906105009190612b1e565b61103d565b005b610521600480360381019061051c9190612cf1565b61109f565b005b61053d60048036038101906105389190612d1e565b611125565b005b61055960048036038101906105549190612d5e565b6111f2565b005b61057560048036038101906105709190612cf1565b61131f565b6040516105829190613296565b60405180910390f35b6105a560048036038101906105a09190612a8b565b611423565b6040516105b2919061327b565b60405180910390f35b6105d560048036038101906105d09190612a5e565b6114b7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a5750610649826115af565b5b9050919050565b60606000805461066090613825565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90613825565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b60006106ee82611691565b61072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072490613418565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077382610b84565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db90613498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108036116fd565b73ffffffffffffffffffffffffffffffffffffffff16148061083257506108318161082c6116fd565b611423565b5b610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890613398565b60405180910390fd5b61087b8383611705565b505050565b6000600880549050905090565b61089e6108986116fd565b826117be565b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d4906134b8565b60405180910390fd5b6108e883838361189c565b505050565b60006108f883610cbc565b8210610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906132b8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ad8383836040518060200160405280600081525061103d565b505050565b606060006109bf83610cbc565b905060008167ffffffffffffffff8111156109dd576109dc6139bc565b5b604051908082528060200260200182016040528015610a0b5781602001602082028036833780820191505090505b50905060005b82811015610a5557610a2385826108ed565b828281518110610a3657610a3561398d565b5b6020026020010181815250508080610a4d90613888565b915050610a11565b508092505050919050565b6000600d54905090565b600c60009054906101000a900460ff1681565b6000610a87610880565b8210610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf906134d8565b60405180910390fd5b60088281548110610adc57610adb61398d565b5b90600052602060002001549050919050565b610af66116fd565b73ffffffffffffffffffffffffffffffffffffffff16610b14610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190613438565b60405180910390fd5b80600b9080519060200190610b8092919061281c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c24906133d8565b60405180910390fd5b80915050919050565b610c3e6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610c5c610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613438565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906133b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d7c6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610d9a610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790613438565b60405180910390fd5b610dfa6000611af8565b565b6000600e54905090565b610e0e6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610e2c610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613438565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ed890613825565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0490613825565b8015610f515780601f10610f2657610100808354040283529160200191610f51565b820191906000526020600020905b815481529060010190602001808311610f3457829003601f168201915b5050505050905090565b610f636116fd565b73ffffffffffffffffffffffffffffffffffffffff16610f81610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613438565b60405180910390fd5b6000610fe1610880565b905060005b828110156110225761100f33826001856110009190613616565b61100a9190613616565b611bbe565b808061101a90613888565b915050610fe6565b505050565b6110396110326116fd565b8383611bdc565b5050565b61104e6110486116fd565b836117be565b61108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906134b8565b60405180910390fd5b61109984848484611d49565b50505050565b6110a76116fd565b73ffffffffffffffffffffffffffffffffffffffff166110c5610e9f565b73ffffffffffffffffffffffffffffffffffffffff161461111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290613438565b60405180910390fd5b80600e8190555050565b61112d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1661114b610e9f565b73ffffffffffffffffffffffffffffffffffffffff16146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890613438565b60405180910390fd5b60006111ab610880565b905060005b838110156111ec576111d983826001856111ca9190613616565b6111d49190613616565b611bbe565b80806111e490613888565b9150506111b0565b50505050565b6111fa6116fd565b73ffffffffffffffffffffffffffffffffffffffff16611218610e9f565b73ffffffffffffffffffffffffffffffffffffffff161461126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590613438565b60405180910390fd5b6000611278610880565b905060005b838390508110156113185760005b85811015611304576112f18585848181106112a9576112a861398d565b5b90506020020160208101906112be9190612a5e565b87846112ca91906136d4565b836001876112d89190613616565b6112e29190613616565b6112ec9190613616565b611bbe565b80806112fc90613888565b91505061128b565b50808061131090613888565b91505061127d565b5050505050565b606061132a82611691565b611369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136090613478565b60405180910390fd5b6000611373611da5565b9050600c60009054906101000a900460ff16156113d15760008151116113a857604051806020016040528060008152506113c9565b806040516020016113b991906131ac565b6040516020818303038152906040525b91505061141e565b60008151116113ef576040518060200160405280600081525061141a565b806113f984611e37565b60405160200161140a9291906131c3565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114bf6116fd565b73ffffffffffffffffffffffffffffffffffffffff166114dd610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90613438565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a906132f8565b60405180910390fd5b6115ac81611af8565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061168a575061168982611fc0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177883610b84565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117c982611691565b611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90613378565b60405180910390fd5b600061181383610b84565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061188257508373ffffffffffffffffffffffffffffffffffffffff1661186a846106e3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061189357506118928185611423565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118bc82610b84565b73ffffffffffffffffffffffffffffffffffffffff1614611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990613458565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990613338565b60405180910390fd5b61198d83838361202a565b611998600082611705565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e8919061372e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3f9190613616565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611bd882826040518060200160405280600081525061213e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4290613358565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3c919061327b565b60405180910390a3505050565b611d5484848461189c565b611d6084848484612199565b611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d96906132d8565b60405180910390fd5b50505050565b6060600b8054611db490613825565b80601f0160208091040260200160405190810160405280929190818152602001828054611de090613825565b8015611e2d5780601f10611e0257610100808354040283529160200191611e2d565b820191906000526020600020905b815481529060010190602001808311611e1057829003601f168201915b5050505050905090565b60606000821415611e7f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fbb565b600082905060005b60008214611eb1578080611e9a90613888565b915050600a82611eaa91906136a3565b9150611e87565b60008167ffffffffffffffff811115611ecd57611ecc6139bc565b5b6040519080825280601f01601f191660200182016040528015611eff5781602001600182028036833780820191505090505b50905060008290505b60008614611fb357600181611f1d919061372e565b90506000600a8088611f2f91906136a3565b611f3991906136d4565b87611f44919061372e565b6030611f50919061366c565b905060008160f81b905080848481518110611f6e57611f6d61398d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611faa91906136a3565b97505050611f08565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612035838383612330565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120785761207381612335565b6120b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120b6576120b5838261237e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fa576120f5816124eb565b612139565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121385761213782826125bc565b5b5b505050565b612148838361263b565b6121556000848484612199565b612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906132d8565b60405180910390fd5b505050565b60006121ba8473ffffffffffffffffffffffffffffffffffffffff16612809565b15612323578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121e36116fd565b8786866040518563ffffffff1660e01b8152600401612205949392919061320d565b602060405180830381600087803b15801561221f57600080fd5b505af192505050801561225057506040513d601f19601f8201168201806040525081019061224d9190612c7b565b60015b6122d3573d8060008114612280576040519150601f19603f3d011682016040523d82523d6000602084013e612285565b606091505b506000815114156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c2906132d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612328565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161238b84610cbc565b612395919061372e565b905060006007600084815260200190815260200160002054905081811461247a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506124ff919061372e565b905060006009600084815260200190815260200160002054905060006008838154811061252f5761252e61398d565b5b9060005260206000200154905080600883815481106125515761255061398d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125a05761259f61395e565b5b6001900381819060005260206000200160009055905550505050565b60006125c783610cbc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906133f8565b60405180910390fd5b6126b481611691565b156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613318565b60405180910390fd5b6127006000838361202a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127509190613616565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461282890613825565b90600052602060002090601f01602090048101928261284a5760008555612891565b82601f1061286357805160ff1916838001178555612891565b82800160010185558215612891579182015b82811115612890578251825591602001919060010190612875565b5b50905061289e91906128a2565b5090565b5b808211156128bb5760008160009055506001016128a3565b5090565b60006128d26128cd84613538565b613513565b9050828152602081018484840111156128ee576128ed6139fa565b5b6128f98482856137e3565b509392505050565b600061291461290f84613569565b613513565b9050828152602081018484840111156129305761292f6139fa565b5b61293b8482856137e3565b509392505050565b60008135905061295281613f39565b92915050565b60008083601f84011261296e5761296d6139f0565b5b8235905067ffffffffffffffff81111561298b5761298a6139eb565b5b6020830191508360208202830111156129a7576129a66139f5565b5b9250929050565b6000813590506129bd81613f50565b92915050565b6000813590506129d281613f67565b92915050565b6000815190506129e781613f67565b92915050565b600082601f830112612a0257612a016139f0565b5b8135612a128482602086016128bf565b91505092915050565b600082601f830112612a3057612a2f6139f0565b5b8135612a40848260208601612901565b91505092915050565b600081359050612a5881613f7e565b92915050565b600060208284031215612a7457612a73613a04565b5b6000612a8284828501612943565b91505092915050565b60008060408385031215612aa257612aa1613a04565b5b6000612ab085828601612943565b9250506020612ac185828601612943565b9150509250929050565b600080600060608486031215612ae457612ae3613a04565b5b6000612af286828701612943565b9350506020612b0386828701612943565b9250506040612b1486828701612a49565b9150509250925092565b60008060008060808587031215612b3857612b37613a04565b5b6000612b4687828801612943565b9450506020612b5787828801612943565b9350506040612b6887828801612a49565b925050606085013567ffffffffffffffff811115612b8957612b886139ff565b5b612b95878288016129ed565b91505092959194509250565b60008060408385031215612bb857612bb7613a04565b5b6000612bc685828601612943565b9250506020612bd7858286016129ae565b9150509250929050565b60008060408385031215612bf857612bf7613a04565b5b6000612c0685828601612943565b9250506020612c1785828601612a49565b9150509250929050565b600060208284031215612c3757612c36613a04565b5b6000612c45848285016129ae565b91505092915050565b600060208284031215612c6457612c63613a04565b5b6000612c72848285016129c3565b91505092915050565b600060208284031215612c9157612c90613a04565b5b6000612c9f848285016129d8565b91505092915050565b600060208284031215612cbe57612cbd613a04565b5b600082013567ffffffffffffffff811115612cdc57612cdb6139ff565b5b612ce884828501612a1b565b91505092915050565b600060208284031215612d0757612d06613a04565b5b6000612d1584828501612a49565b91505092915050565b60008060408385031215612d3557612d34613a04565b5b6000612d4385828601612a49565b9250506020612d5485828601612943565b9150509250929050565b600080600060408486031215612d7757612d76613a04565b5b6000612d8586828701612a49565b935050602084013567ffffffffffffffff811115612da657612da56139ff565b5b612db286828701612958565b92509250509250925092565b6000612dca838361318e565b60208301905092915050565b612ddf81613762565b82525050565b6000612df0826135aa565b612dfa81856135d8565b9350612e058361359a565b8060005b83811015612e36578151612e1d8882612dbe565b9750612e28836135cb565b925050600181019050612e09565b5085935050505092915050565b612e4c81613774565b82525050565b6000612e5d826135b5565b612e6781856135e9565b9350612e778185602086016137f2565b612e8081613a09565b840191505092915050565b6000612e96826135c0565b612ea081856135fa565b9350612eb08185602086016137f2565b612eb981613a09565b840191505092915050565b6000612ecf826135c0565b612ed9818561360b565b9350612ee98185602086016137f2565b80840191505092915050565b6000612f02602b836135fa565b9150612f0d82613a1a565b604082019050919050565b6000612f256032836135fa565b9150612f3082613a69565b604082019050919050565b6000612f486026836135fa565b9150612f5382613ab8565b604082019050919050565b6000612f6b601c836135fa565b9150612f7682613b07565b602082019050919050565b6000612f8e6024836135fa565b9150612f9982613b30565b604082019050919050565b6000612fb16019836135fa565b9150612fbc82613b7f565b602082019050919050565b6000612fd4602c836135fa565b9150612fdf82613ba8565b604082019050919050565b6000612ff76038836135fa565b915061300282613bf7565b604082019050919050565b600061301a602a836135fa565b915061302582613c46565b604082019050919050565b600061303d6029836135fa565b915061304882613c95565b604082019050919050565b60006130606020836135fa565b915061306b82613ce4565b602082019050919050565b6000613083602c836135fa565b915061308e82613d0d565b604082019050919050565b60006130a660058361360b565b91506130b182613d5c565b600582019050919050565b60006130c96020836135fa565b91506130d482613d85565b602082019050919050565b60006130ec6029836135fa565b91506130f782613dae565b604082019050919050565b600061310f602f836135fa565b915061311a82613dfd565b604082019050919050565b60006131326021836135fa565b915061313d82613e4c565b604082019050919050565b60006131556031836135fa565b915061316082613e9b565b604082019050919050565b6000613178602c836135fa565b915061318382613eea565b604082019050919050565b613197816137cc565b82525050565b6131a6816137cc565b82525050565b60006131b88284612ec4565b915081905092915050565b60006131cf8285612ec4565b91506131db8284612ec4565b91506131e682613099565b91508190509392505050565b60006020820190506132076000830184612dd6565b92915050565b60006080820190506132226000830187612dd6565b61322f6020830186612dd6565b61323c604083018561319d565b818103606083015261324e8184612e52565b905095945050505050565b600060208201905081810360008301526132738184612de5565b905092915050565b60006020820190506132906000830184612e43565b92915050565b600060208201905081810360008301526132b08184612e8b565b905092915050565b600060208201905081810360008301526132d181612ef5565b9050919050565b600060208201905081810360008301526132f181612f18565b9050919050565b6000602082019050818103600083015261331181612f3b565b9050919050565b6000602082019050818103600083015261333181612f5e565b9050919050565b6000602082019050818103600083015261335181612f81565b9050919050565b6000602082019050818103600083015261337181612fa4565b9050919050565b6000602082019050818103600083015261339181612fc7565b9050919050565b600060208201905081810360008301526133b181612fea565b9050919050565b600060208201905081810360008301526133d18161300d565b9050919050565b600060208201905081810360008301526133f181613030565b9050919050565b6000602082019050818103600083015261341181613053565b9050919050565b6000602082019050818103600083015261343181613076565b9050919050565b60006020820190508181036000830152613451816130bc565b9050919050565b60006020820190508181036000830152613471816130df565b9050919050565b6000602082019050818103600083015261349181613102565b9050919050565b600060208201905081810360008301526134b181613125565b9050919050565b600060208201905081810360008301526134d181613148565b9050919050565b600060208201905081810360008301526134f18161316b565b9050919050565b600060208201905061350d600083018461319d565b92915050565b600061351d61352e565b90506135298282613857565b919050565b6000604051905090565b600067ffffffffffffffff821115613553576135526139bc565b5b61355c82613a09565b9050602081019050919050565b600067ffffffffffffffff821115613584576135836139bc565b5b61358d82613a09565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613621826137cc565b915061362c836137cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613661576136606138d1565b5b828201905092915050565b6000613677826137d6565b9150613682836137d6565b92508260ff03821115613698576136976138d1565b5b828201905092915050565b60006136ae826137cc565b91506136b9836137cc565b9250826136c9576136c8613900565b5b828204905092915050565b60006136df826137cc565b91506136ea836137cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613723576137226138d1565b5b828202905092915050565b6000613739826137cc565b9150613744836137cc565b925082821015613757576137566138d1565b5b828203905092915050565b600061376d826137ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156138105780820151818401526020810190506137f5565b8381111561381f576000848401525b50505050565b6000600282049050600182168061383d57607f821691505b602082108114156138515761385061392f565b5b50919050565b61386082613a09565b810181811067ffffffffffffffff8211171561387f5761387e6139bc565b5b80604052505050565b6000613893826137cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c6576138c56138d1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f4281613762565b8114613f4d57600080fd5b50565b613f5981613774565b8114613f6457600080fd5b50565b613f7081613780565b8114613f7b57600080fd5b50565b613f87816137cc565b8114613f9257600080fd5b5056fea264697066735822122044e0211e30095a444bb9153cb00db951da7b094104bea75920ce834ff85f04f064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063c06fd11b11610071578063c06fd11b1461053f578063c87b56dd1461055b578063e985e9c51461058b578063f2fde38b146105bb576101da565b8063a22cb465146104cf578063b88d4fde146104eb578063ba73bdd314610507578063bc63f02e14610523576101da565b80638c47e88a116100de5780638c47e88a1461045b5780638da5cb5b1461047757806395d89b4114610495578063a0712d68146104b3576101da565b806370a0823114610403578063715018a61461043357806385d08c921461043d576101da565b806342842e0e1161017c5780634f6ccce71161014b5780634f6ccce71461036b57806355f804b31461039b5780636352211e146103b757806363562f74146103e7576101da565b806342842e0e146102e3578063438b6300146102ff5780634d76791e1461032f5780634f135b381461034d576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612c4e565b6105d7565b604051610206919061327b565b60405180910390f35b610217610651565b6040516102249190613296565b60405180910390f35b61024760048036038101906102429190612cf1565b6106e3565b60405161025491906131f2565b60405180910390f35b61027760048036038101906102729190612be1565b610768565b005b610281610880565b60405161028e91906134f8565b60405180910390f35b6102b160048036038101906102ac9190612acb565b61088d565b005b6102cd60048036038101906102c89190612be1565b6108ed565b6040516102da91906134f8565b60405180910390f35b6102fd60048036038101906102f89190612acb565b610992565b005b61031960048036038101906103149190612a5e565b6109b2565b6040516103269190613259565b60405180910390f35b610337610a60565b60405161034491906134f8565b60405180910390f35b610355610a6a565b604051610362919061327b565b60405180910390f35b61038560048036038101906103809190612cf1565b610a7d565b60405161039291906134f8565b60405180910390f35b6103b560048036038101906103b09190612ca8565b610aee565b005b6103d160048036038101906103cc9190612cf1565b610b84565b6040516103de91906131f2565b60405180910390f35b61040160048036038101906103fc9190612cf1565b610c36565b005b61041d60048036038101906104189190612a5e565b610cbc565b60405161042a91906134f8565b60405180910390f35b61043b610d74565b005b610445610dfc565b60405161045291906134f8565b60405180910390f35b61047560048036038101906104709190612c21565b610e06565b005b61047f610e9f565b60405161048c91906131f2565b60405180910390f35b61049d610ec9565b6040516104aa9190613296565b60405180910390f35b6104cd60048036038101906104c89190612cf1565b610f5b565b005b6104e960048036038101906104e49190612ba1565b611027565b005b61050560048036038101906105009190612b1e565b61103d565b005b610521600480360381019061051c9190612cf1565b61109f565b005b61053d60048036038101906105389190612d1e565b611125565b005b61055960048036038101906105549190612d5e565b6111f2565b005b61057560048036038101906105709190612cf1565b61131f565b6040516105829190613296565b60405180910390f35b6105a560048036038101906105a09190612a8b565b611423565b6040516105b2919061327b565b60405180910390f35b6105d560048036038101906105d09190612a5e565b6114b7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064a5750610649826115af565b5b9050919050565b60606000805461066090613825565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90613825565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b60006106ee82611691565b61072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072490613418565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077382610b84565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db90613498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108036116fd565b73ffffffffffffffffffffffffffffffffffffffff16148061083257506108318161082c6116fd565b611423565b5b610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890613398565b60405180910390fd5b61087b8383611705565b505050565b6000600880549050905090565b61089e6108986116fd565b826117be565b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d4906134b8565b60405180910390fd5b6108e883838361189c565b505050565b60006108f883610cbc565b8210610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906132b8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ad8383836040518060200160405280600081525061103d565b505050565b606060006109bf83610cbc565b905060008167ffffffffffffffff8111156109dd576109dc6139bc565b5b604051908082528060200260200182016040528015610a0b5781602001602082028036833780820191505090505b50905060005b82811015610a5557610a2385826108ed565b828281518110610a3657610a3561398d565b5b6020026020010181815250508080610a4d90613888565b915050610a11565b508092505050919050565b6000600d54905090565b600c60009054906101000a900460ff1681565b6000610a87610880565b8210610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf906134d8565b60405180910390fd5b60088281548110610adc57610adb61398d565b5b90600052602060002001549050919050565b610af66116fd565b73ffffffffffffffffffffffffffffffffffffffff16610b14610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190613438565b60405180910390fd5b80600b9080519060200190610b8092919061281c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c24906133d8565b60405180910390fd5b80915050919050565b610c3e6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610c5c610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613438565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d24906133b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d7c6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610d9a610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790613438565b60405180910390fd5b610dfa6000611af8565b565b6000600e54905090565b610e0e6116fd565b73ffffffffffffffffffffffffffffffffffffffff16610e2c610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613438565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ed890613825565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0490613825565b8015610f515780601f10610f2657610100808354040283529160200191610f51565b820191906000526020600020905b815481529060010190602001808311610f3457829003601f168201915b5050505050905090565b610f636116fd565b73ffffffffffffffffffffffffffffffffffffffff16610f81610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613438565b60405180910390fd5b6000610fe1610880565b905060005b828110156110225761100f33826001856110009190613616565b61100a9190613616565b611bbe565b808061101a90613888565b915050610fe6565b505050565b6110396110326116fd565b8383611bdc565b5050565b61104e6110486116fd565b836117be565b61108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906134b8565b60405180910390fd5b61109984848484611d49565b50505050565b6110a76116fd565b73ffffffffffffffffffffffffffffffffffffffff166110c5610e9f565b73ffffffffffffffffffffffffffffffffffffffff161461111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290613438565b60405180910390fd5b80600e8190555050565b61112d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1661114b610e9f565b73ffffffffffffffffffffffffffffffffffffffff16146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890613438565b60405180910390fd5b60006111ab610880565b905060005b838110156111ec576111d983826001856111ca9190613616565b6111d49190613616565b611bbe565b80806111e490613888565b9150506111b0565b50505050565b6111fa6116fd565b73ffffffffffffffffffffffffffffffffffffffff16611218610e9f565b73ffffffffffffffffffffffffffffffffffffffff161461126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590613438565b60405180910390fd5b6000611278610880565b905060005b838390508110156113185760005b85811015611304576112f18585848181106112a9576112a861398d565b5b90506020020160208101906112be9190612a5e565b87846112ca91906136d4565b836001876112d89190613616565b6112e29190613616565b6112ec9190613616565b611bbe565b80806112fc90613888565b91505061128b565b50808061131090613888565b91505061127d565b5050505050565b606061132a82611691565b611369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136090613478565b60405180910390fd5b6000611373611da5565b9050600c60009054906101000a900460ff16156113d15760008151116113a857604051806020016040528060008152506113c9565b806040516020016113b991906131ac565b6040516020818303038152906040525b91505061141e565b60008151116113ef576040518060200160405280600081525061141a565b806113f984611e37565b60405160200161140a9291906131c3565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114bf6116fd565b73ffffffffffffffffffffffffffffffffffffffff166114dd610e9f565b73ffffffffffffffffffffffffffffffffffffffff1614611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90613438565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a906132f8565b60405180910390fd5b6115ac81611af8565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061168a575061168982611fc0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177883610b84565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117c982611691565b611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90613378565b60405180910390fd5b600061181383610b84565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061188257508373ffffffffffffffffffffffffffffffffffffffff1661186a846106e3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061189357506118928185611423565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118bc82610b84565b73ffffffffffffffffffffffffffffffffffffffff1614611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990613458565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990613338565b60405180910390fd5b61198d83838361202a565b611998600082611705565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e8919061372e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3f9190613616565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611bd882826040518060200160405280600081525061213e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4290613358565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3c919061327b565b60405180910390a3505050565b611d5484848461189c565b611d6084848484612199565b611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d96906132d8565b60405180910390fd5b50505050565b6060600b8054611db490613825565b80601f0160208091040260200160405190810160405280929190818152602001828054611de090613825565b8015611e2d5780601f10611e0257610100808354040283529160200191611e2d565b820191906000526020600020905b815481529060010190602001808311611e1057829003601f168201915b5050505050905090565b60606000821415611e7f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fbb565b600082905060005b60008214611eb1578080611e9a90613888565b915050600a82611eaa91906136a3565b9150611e87565b60008167ffffffffffffffff811115611ecd57611ecc6139bc565b5b6040519080825280601f01601f191660200182016040528015611eff5781602001600182028036833780820191505090505b50905060008290505b60008614611fb357600181611f1d919061372e565b90506000600a8088611f2f91906136a3565b611f3991906136d4565b87611f44919061372e565b6030611f50919061366c565b905060008160f81b905080848481518110611f6e57611f6d61398d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611faa91906136a3565b97505050611f08565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612035838383612330565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120785761207381612335565b6120b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120b6576120b5838261237e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fa576120f5816124eb565b612139565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121385761213782826125bc565b5b5b505050565b612148838361263b565b6121556000848484612199565b612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906132d8565b60405180910390fd5b505050565b60006121ba8473ffffffffffffffffffffffffffffffffffffffff16612809565b15612323578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121e36116fd565b8786866040518563ffffffff1660e01b8152600401612205949392919061320d565b602060405180830381600087803b15801561221f57600080fd5b505af192505050801561225057506040513d601f19601f8201168201806040525081019061224d9190612c7b565b60015b6122d3573d8060008114612280576040519150601f19603f3d011682016040523d82523d6000602084013e612285565b606091505b506000815114156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c2906132d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612328565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161238b84610cbc565b612395919061372e565b905060006007600084815260200190815260200160002054905081811461247a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506124ff919061372e565b905060006009600084815260200190815260200160002054905060006008838154811061252f5761252e61398d565b5b9060005260206000200154905080600883815481106125515761255061398d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125a05761259f61395e565b5b6001900381819060005260206000200160009055905550505050565b60006125c783610cbc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906133f8565b60405180910390fd5b6126b481611691565b156126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613318565b60405180910390fd5b6127006000838361202a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127509190613616565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461282890613825565b90600052602060002090601f01602090048101928261284a5760008555612891565b82601f1061286357805160ff1916838001178555612891565b82800160010185558215612891579182015b82811115612890578251825591602001919060010190612875565b5b50905061289e91906128a2565b5090565b5b808211156128bb5760008160009055506001016128a3565b5090565b60006128d26128cd84613538565b613513565b9050828152602081018484840111156128ee576128ed6139fa565b5b6128f98482856137e3565b509392505050565b600061291461290f84613569565b613513565b9050828152602081018484840111156129305761292f6139fa565b5b61293b8482856137e3565b509392505050565b60008135905061295281613f39565b92915050565b60008083601f84011261296e5761296d6139f0565b5b8235905067ffffffffffffffff81111561298b5761298a6139eb565b5b6020830191508360208202830111156129a7576129a66139f5565b5b9250929050565b6000813590506129bd81613f50565b92915050565b6000813590506129d281613f67565b92915050565b6000815190506129e781613f67565b92915050565b600082601f830112612a0257612a016139f0565b5b8135612a128482602086016128bf565b91505092915050565b600082601f830112612a3057612a2f6139f0565b5b8135612a40848260208601612901565b91505092915050565b600081359050612a5881613f7e565b92915050565b600060208284031215612a7457612a73613a04565b5b6000612a8284828501612943565b91505092915050565b60008060408385031215612aa257612aa1613a04565b5b6000612ab085828601612943565b9250506020612ac185828601612943565b9150509250929050565b600080600060608486031215612ae457612ae3613a04565b5b6000612af286828701612943565b9350506020612b0386828701612943565b9250506040612b1486828701612a49565b9150509250925092565b60008060008060808587031215612b3857612b37613a04565b5b6000612b4687828801612943565b9450506020612b5787828801612943565b9350506040612b6887828801612a49565b925050606085013567ffffffffffffffff811115612b8957612b886139ff565b5b612b95878288016129ed565b91505092959194509250565b60008060408385031215612bb857612bb7613a04565b5b6000612bc685828601612943565b9250506020612bd7858286016129ae565b9150509250929050565b60008060408385031215612bf857612bf7613a04565b5b6000612c0685828601612943565b9250506020612c1785828601612a49565b9150509250929050565b600060208284031215612c3757612c36613a04565b5b6000612c45848285016129ae565b91505092915050565b600060208284031215612c6457612c63613a04565b5b6000612c72848285016129c3565b91505092915050565b600060208284031215612c9157612c90613a04565b5b6000612c9f848285016129d8565b91505092915050565b600060208284031215612cbe57612cbd613a04565b5b600082013567ffffffffffffffff811115612cdc57612cdb6139ff565b5b612ce884828501612a1b565b91505092915050565b600060208284031215612d0757612d06613a04565b5b6000612d1584828501612a49565b91505092915050565b60008060408385031215612d3557612d34613a04565b5b6000612d4385828601612a49565b9250506020612d5485828601612943565b9150509250929050565b600080600060408486031215612d7757612d76613a04565b5b6000612d8586828701612a49565b935050602084013567ffffffffffffffff811115612da657612da56139ff565b5b612db286828701612958565b92509250509250925092565b6000612dca838361318e565b60208301905092915050565b612ddf81613762565b82525050565b6000612df0826135aa565b612dfa81856135d8565b9350612e058361359a565b8060005b83811015612e36578151612e1d8882612dbe565b9750612e28836135cb565b925050600181019050612e09565b5085935050505092915050565b612e4c81613774565b82525050565b6000612e5d826135b5565b612e6781856135e9565b9350612e778185602086016137f2565b612e8081613a09565b840191505092915050565b6000612e96826135c0565b612ea081856135fa565b9350612eb08185602086016137f2565b612eb981613a09565b840191505092915050565b6000612ecf826135c0565b612ed9818561360b565b9350612ee98185602086016137f2565b80840191505092915050565b6000612f02602b836135fa565b9150612f0d82613a1a565b604082019050919050565b6000612f256032836135fa565b9150612f3082613a69565b604082019050919050565b6000612f486026836135fa565b9150612f5382613ab8565b604082019050919050565b6000612f6b601c836135fa565b9150612f7682613b07565b602082019050919050565b6000612f8e6024836135fa565b9150612f9982613b30565b604082019050919050565b6000612fb16019836135fa565b9150612fbc82613b7f565b602082019050919050565b6000612fd4602c836135fa565b9150612fdf82613ba8565b604082019050919050565b6000612ff76038836135fa565b915061300282613bf7565b604082019050919050565b600061301a602a836135fa565b915061302582613c46565b604082019050919050565b600061303d6029836135fa565b915061304882613c95565b604082019050919050565b60006130606020836135fa565b915061306b82613ce4565b602082019050919050565b6000613083602c836135fa565b915061308e82613d0d565b604082019050919050565b60006130a660058361360b565b91506130b182613d5c565b600582019050919050565b60006130c96020836135fa565b91506130d482613d85565b602082019050919050565b60006130ec6029836135fa565b91506130f782613dae565b604082019050919050565b600061310f602f836135fa565b915061311a82613dfd565b604082019050919050565b60006131326021836135fa565b915061313d82613e4c565b604082019050919050565b60006131556031836135fa565b915061316082613e9b565b604082019050919050565b6000613178602c836135fa565b915061318382613eea565b604082019050919050565b613197816137cc565b82525050565b6131a6816137cc565b82525050565b60006131b88284612ec4565b915081905092915050565b60006131cf8285612ec4565b91506131db8284612ec4565b91506131e682613099565b91508190509392505050565b60006020820190506132076000830184612dd6565b92915050565b60006080820190506132226000830187612dd6565b61322f6020830186612dd6565b61323c604083018561319d565b818103606083015261324e8184612e52565b905095945050505050565b600060208201905081810360008301526132738184612de5565b905092915050565b60006020820190506132906000830184612e43565b92915050565b600060208201905081810360008301526132b08184612e8b565b905092915050565b600060208201905081810360008301526132d181612ef5565b9050919050565b600060208201905081810360008301526132f181612f18565b9050919050565b6000602082019050818103600083015261331181612f3b565b9050919050565b6000602082019050818103600083015261333181612f5e565b9050919050565b6000602082019050818103600083015261335181612f81565b9050919050565b6000602082019050818103600083015261337181612fa4565b9050919050565b6000602082019050818103600083015261339181612fc7565b9050919050565b600060208201905081810360008301526133b181612fea565b9050919050565b600060208201905081810360008301526133d18161300d565b9050919050565b600060208201905081810360008301526133f181613030565b9050919050565b6000602082019050818103600083015261341181613053565b9050919050565b6000602082019050818103600083015261343181613076565b9050919050565b60006020820190508181036000830152613451816130bc565b9050919050565b60006020820190508181036000830152613471816130df565b9050919050565b6000602082019050818103600083015261349181613102565b9050919050565b600060208201905081810360008301526134b181613125565b9050919050565b600060208201905081810360008301526134d181613148565b9050919050565b600060208201905081810360008301526134f18161316b565b9050919050565b600060208201905061350d600083018461319d565b92915050565b600061351d61352e565b90506135298282613857565b919050565b6000604051905090565b600067ffffffffffffffff821115613553576135526139bc565b5b61355c82613a09565b9050602081019050919050565b600067ffffffffffffffff821115613584576135836139bc565b5b61358d82613a09565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613621826137cc565b915061362c836137cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613661576136606138d1565b5b828201905092915050565b6000613677826137d6565b9150613682836137d6565b92508260ff03821115613698576136976138d1565b5b828201905092915050565b60006136ae826137cc565b91506136b9836137cc565b9250826136c9576136c8613900565b5b828204905092915050565b60006136df826137cc565b91506136ea836137cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613723576137226138d1565b5b828202905092915050565b6000613739826137cc565b9150613744836137cc565b925082821015613757576137566138d1565b5b828203905092915050565b600061376d826137ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156138105780820151818401526020810190506137f5565b8381111561381f576000848401525b50505050565b6000600282049050600182168061383d57607f821691505b602082108114156138515761385061392f565b5b50919050565b61386082613a09565b810181811067ffffffffffffffff8211171561387f5761387e6139bc565b5b80604052505050565b6000613893826137cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c6576138c56138d1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f4281613762565b8114613f4d57600080fd5b50565b613f5981613774565b8114613f6457600080fd5b50565b613f7081613780565b8114613f7b57600080fd5b50565b613f87816137cc565b8114613f9257600080fd5b5056fea264697066735822122044e0211e30095a444bb9153cb00db951da7b094104bea75920ce834ff85f04f064736f6c63430008070033
Deployed Bytecode Sourcemap
49377:3392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33959:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20774:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22333:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21856:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34599:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23083:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34267:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23493:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50581:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51054:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49545:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34789:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51402:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20468:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50930:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20198:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41677:103;;;:::i;:::-;;51289:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51498:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41026:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20943:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50352:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22626:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23749:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51169:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49748:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49992:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51731:455;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22852:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41935:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33959:224;34061:4;34100:35;34085:50;;;:11;:50;;;;:90;;;;34139:36;34163:11;34139:23;:36::i;:::-;34085:90;34078:97;;33959:224;;;:::o;20774:100::-;20828:13;20861:5;20854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20774:100;:::o;22333:221::-;22409:7;22437:16;22445:7;22437;:16::i;:::-;22429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22522:15;:24;22538:7;22522:24;;;;;;;;;;;;;;;;;;;;;22515:31;;22333:221;;;:::o;21856:411::-;21937:13;21953:23;21968:7;21953:14;:23::i;:::-;21937:39;;22001:5;21995:11;;:2;:11;;;;21987:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22095:5;22079:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22104:37;22121:5;22128:12;:10;:12::i;:::-;22104:16;:37::i;:::-;22079:62;22057:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22238:21;22247:2;22251:7;22238:8;:21::i;:::-;21926:341;21856:411;;:::o;34599:113::-;34660:7;34687:10;:17;;;;34680:24;;34599:113;:::o;23083:339::-;23278:41;23297:12;:10;:12::i;:::-;23311:7;23278:18;:41::i;:::-;23270:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23386:28;23396:4;23402:2;23406:7;23386:9;:28::i;:::-;23083:339;;;:::o;34267:256::-;34364:7;34400:23;34417:5;34400:16;:23::i;:::-;34392:5;:31;34384:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34489:12;:19;34502:5;34489:19;;;;;;;;;;;;;;;:26;34509:5;34489:26;;;;;;;;;;;;34482:33;;34267:256;;;;:::o;23493:185::-;23631:39;23648:4;23654:2;23658:7;23631:39;;;;;;;;;;;;:16;:39::i;:::-;23493:185;;;:::o;50581:341::-;50641:16;50670:18;50691:16;50701:5;50691:9;:16::i;:::-;50670:37;;50720:25;50762:10;50748:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50720:53;;50788:9;50784:105;50803:10;50799:1;:14;50784:105;;;50848:29;50868:5;50875:1;50848:19;:29::i;:::-;50834:8;50843:1;50834:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;50815:3;;;;;:::i;:::-;;;;50784:105;;;;50906:8;50899:15;;;;50581:341;;;:::o;51054:107::-;51113:7;51140:13;;51133:20;;51054:107;:::o;49545:32::-;;;;;;;;;;;;;:::o;34789:233::-;34864:7;34900:30;:28;:30::i;:::-;34892:5;:38;34884:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34997:10;35008:5;34997:17;;;;;;;;:::i;:::-;;;;;;;;;;34990:24;;34789:233;;;:::o;51402:88::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51479:3:::1;51469:7;:13;;;;;;;;;;;;:::i;:::-;;51402:88:::0;:::o;20468:239::-;20540:7;20560:13;20576:7;:16;20584:7;20576:16;;;;;;;;;;;;;;;;;;;;;20560:32;;20628:1;20611:19;;:5;:19;;;;20603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20694:5;20687:12;;;20468:239;;;:::o;50930:116::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51024:14:::1;51008:13;:30;;;;50930:116:::0;:::o;20198:208::-;20270:7;20315:1;20298:19;;:5;:19;;;;20290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20382:9;:16;20392:5;20382:16;;;;;;;;;;;;;;;;20375:23;;20198:208;;;:::o;41677:103::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41742:30:::1;41769:1;41742:18;:30::i;:::-;41677:103::o:0;51289:105::-;51347:7;51374:12;;51367:19;;51289:105;:::o;51498:117::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51591:16:::1;51575:13;;:32;;;;;;;;;;;;;;;;;;51498:117:::0;:::o;41026:87::-;41072:7;41099:6;;;;;;;;;;;41092:13;;41026:87;:::o;20943:104::-;20999:13;21032:7;21025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:104;:::o;50352:221::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50417:14:::1;50434:13;:11;:13::i;:::-;50417:30;;50463:9;50458:108;50482:13;50478:1;:17;50458:108;;;50517:37;50527:10;50552:1;50548;50539:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;50517:9;:37::i;:::-;50497:3;;;;;:::i;:::-;;;;50458:108;;;;50406:167;50352:221:::0;:::o;22626:155::-;22721:52;22740:12;:10;:12::i;:::-;22754:8;22764;22721:18;:52::i;:::-;22626:155;;:::o;23749:328::-;23924:41;23943:12;:10;:12::i;:::-;23957:7;23924:18;:41::i;:::-;23916:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24030:39;24044:4;24050:2;24054:7;24063:5;24030:13;:39::i;:::-;23749:328;;;;:::o;51169:112::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51260:13:::1;51245:12;:28;;;;51169:112:::0;:::o;49748:236::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49832:14:::1;49849:13;:11;:13::i;:::-;49832:30;;49878:9;49873:104;49897:13;49893:1;:17;49873:104;;;49932:33;49942:6;49963:1;49959;49950:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;49932:9;:33::i;:::-;49912:3;;;;;:::i;:::-;;;;49873:104;;;;49821:163;49748:236:::0;;:::o;49992:352::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50089:14:::1;50106:13;:11;:13::i;:::-;50089:30;;50135:9;50130:207;50154:7;;:14;;50150:1;:18;50130:207;;;50195:9;50190:136;50214:13;50210:1;:17;50190:136;;;50253:57;50263:7;;50271:1;50263:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50296:13;50292:1;:17;;;;:::i;:::-;50288:1;50284;50275:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;:34;;;;:::i;:::-;50253:9;:57::i;:::-;50229:3;;;;;:::i;:::-;;;;50190:136;;;;50170:3;;;;;:::i;:::-;;;;50130:207;;;;50078:266;49992:352:::0;;;:::o;51731:455::-;51804:13;51838:16;51846:7;51838;:16::i;:::-;51830:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51919:18;51940:10;:8;:10::i;:::-;51919:31;;51965:13;;;;;;;;;;;51961:112;;;52022:1;52007:4;52001:18;:22;:60;;;;;;;;;;;;;;;;;52050:4;52033:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;52001:60;51994:67;;;;;51961:112;52111:1;52096:4;52090:18;:22;:88;;;;;;;;;;;;;;;;;52139:4;52145:17;52154:7;52145:8;:17::i;:::-;52122:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52090:88;52083:95;;;51731:455;;;;:::o;22852:164::-;22949:4;22973:18;:25;22992:5;22973:25;;;;;;;;;;;;;;;:35;22999:8;22973:35;;;;;;;;;;;;;;;;;;;;;;;;;22966:42;;22852:164;;;;:::o;41935:201::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42044:1:::1;42024:22;;:8;:22;;;;42016:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42100:28;42119:8;42100:18;:28::i;:::-;41935:201:::0;:::o;19841:293::-;19943:4;19991:25;19976:40;;;:11;:40;;;;:101;;;;20044:33;20029:48;;;:11;:48;;;;19976:101;:150;;;;20090:36;20114:11;20090:23;:36::i;:::-;19976:150;19960:166;;19841:293;;;:::o;25587:127::-;25652:4;25704:1;25676:30;;:7;:16;25684:7;25676:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25669:37;;25587:127;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;29569:174::-;29671:2;29644:15;:24;29660:7;29644:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29727:7;29723:2;29689:46;;29698:23;29713:7;29698:14;:23::i;:::-;29689:46;;;;;;;;;;;;29569:174;;:::o;25881:348::-;25974:4;25999:16;26007:7;25999;:16::i;:::-;25991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26075:13;26091:23;26106:7;26091:14;:23::i;:::-;26075:39;;26144:5;26133:16;;:7;:16;;;:51;;;;26177:7;26153:31;;:20;26165:7;26153:11;:20::i;:::-;:31;;;26133:51;:87;;;;26188:32;26205:5;26212:7;26188:16;:32::i;:::-;26133:87;26125:96;;;25881:348;;;;:::o;28873:578::-;29032:4;29005:31;;:23;29020:7;29005:14;:23::i;:::-;:31;;;28997:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29115:1;29101:16;;:2;:16;;;;29093:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29171:39;29192:4;29198:2;29202:7;29171:20;:39::i;:::-;29275:29;29292:1;29296:7;29275:8;:29::i;:::-;29336:1;29317:9;:15;29327:4;29317:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29365:1;29348:9;:13;29358:2;29348:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29396:2;29377:7;:16;29385:7;29377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29435:7;29431:2;29416:27;;29425:4;29416:27;;;;;;;;;;;;28873:578;;;:::o;42296:191::-;42370:16;42389:6;;;;;;;;;;;42370:25;;42415:8;42406:6;;:17;;;;;;;;;;;;;;;;;;42470:8;42439:40;;42460:8;42439:40;;;;;;;;;;;;42359:128;42296:191;:::o;26571:110::-;26647:26;26657:2;26661:7;26647:26;;;;;;;;;;;;:9;:26::i;:::-;26571:110;;:::o;29885:315::-;30040:8;30031:17;;:5;:17;;;;30023:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30127:8;30089:18;:25;30108:5;30089:25;;;;;;;;;;;;;;;:35;30115:8;30089:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30173:8;30151:41;;30166:5;30151:41;;;30183:8;30151:41;;;;;;:::i;:::-;;;;;;;;29885:315;;;:::o;24959:::-;25116:28;25126:4;25132:2;25136:7;25116:9;:28::i;:::-;25163:48;25186:4;25192:2;25196:7;25205:5;25163:22;:48::i;:::-;25155:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24959:315;;;;:::o;51623:100::-;51675:13;51708:7;51701:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51623:100;:::o;52194:572::-;52243:27;52293:1;52287:2;:7;52283:50;;;52311:10;;;;;;;;;;;;;;;;;;;;;52283:50;52343:6;52352:2;52343:11;;52365:8;52384:69;52396:1;52391;:6;52384:69;;52414:5;;;;;:::i;:::-;;;;52439:2;52434:7;;;;;:::i;:::-;;;52384:69;;;52463:17;52493:3;52483:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52463:34;;52508:6;52517:3;52508:12;;52531:198;52544:1;52538:2;:7;52531:198;;52568:1;52566;:3;;;;:::i;:::-;52562:7;;52584:10;52624:2;52619;52614;:7;;;;:::i;:::-;:12;;;;:::i;:::-;52609:2;:17;;;;:::i;:::-;52598:2;:29;;;;:::i;:::-;52584:44;;52643:9;52662:4;52655:12;;52643:24;;52692:2;52682:4;52687:1;52682:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;52715:2;52709:8;;;;;:::i;:::-;;;52547:182;;52531:198;;;52753:4;52739:19;;;;;;52194:572;;;;:::o;18450:157::-;18535:4;18574:25;18559:40;;;:11;:40;;;;18552:47;;18450:157;;;:::o;35635:589::-;35779:45;35806:4;35812:2;35816:7;35779:26;:45::i;:::-;35857:1;35841:18;;:4;:18;;;35837:187;;;35876:40;35908:7;35876:31;:40::i;:::-;35837:187;;;35946:2;35938:10;;:4;:10;;;35934:90;;35965:47;35998:4;36004:7;35965:32;:47::i;:::-;35934:90;35837:187;36052:1;36038:16;;:2;:16;;;36034:183;;;36071:45;36108:7;36071:36;:45::i;:::-;36034:183;;;36144:4;36138:10;;:2;:10;;;36134:83;;36165:40;36193:2;36197:7;36165:27;:40::i;:::-;36134:83;36034:183;35635:589;;;:::o;26908:321::-;27038:18;27044:2;27048:7;27038:5;:18::i;:::-;27089:54;27120:1;27124:2;27128:7;27137:5;27089:22;:54::i;:::-;27067:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26908:321;;;:::o;30765:799::-;30920:4;30941:15;:2;:13;;;:15::i;:::-;30937:620;;;30993:2;30977:36;;;31014:12;:10;:12::i;:::-;31028:4;31034:7;31043:5;30977:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30973:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31236:1;31219:6;:13;:18;31215:272;;;31262:60;;;;;;;;;;:::i;:::-;;;;;;;;31215:272;31437:6;31431:13;31422:6;31418:2;31414:15;31407:38;30973:529;31110:41;;;31100:51;;;:6;:51;;;;31093:58;;;;;30937:620;31541:4;31534:11;;30765:799;;;;;;;:::o;32136:126::-;;;;:::o;36947:164::-;37051:10;:17;;;;37024:15;:24;37040:7;37024:24;;;;;;;;;;;:44;;;;37079:10;37095:7;37079:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:164;:::o;37738:988::-;38004:22;38054:1;38029:22;38046:4;38029:16;:22::i;:::-;:26;;;;:::i;:::-;38004:51;;38066:18;38087:17;:26;38105:7;38087:26;;;;;;;;;;;;38066:47;;38234:14;38220:10;:28;38216:328;;38265:19;38287:12;:18;38300:4;38287:18;;;;;;;;;;;;;;;:34;38306:14;38287:34;;;;;;;;;;;;38265:56;;38371:11;38338:12;:18;38351:4;38338:18;;;;;;;;;;;;;;;:30;38357:10;38338:30;;;;;;;;;;;:44;;;;38488:10;38455:17;:30;38473:11;38455:30;;;;;;;;;;;:43;;;;38250:294;38216:328;38640:17;:26;38658:7;38640:26;;;;;;;;;;;38633:33;;;38684:12;:18;38697:4;38684:18;;;;;;;;;;;;;;;:34;38703:14;38684:34;;;;;;;;;;;38677:41;;;37819:907;;37738:988;;:::o;39021:1079::-;39274:22;39319:1;39299:10;:17;;;;:21;;;;:::i;:::-;39274:46;;39331:18;39352:15;:24;39368:7;39352:24;;;;;;;;;;;;39331:45;;39703:19;39725:10;39736:14;39725:26;;;;;;;;:::i;:::-;;;;;;;;;;39703:48;;39789:11;39764:10;39775;39764:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39900:10;39869:15;:28;39885:11;39869:28;;;;;;;;;;;:41;;;;40041:15;:24;40057:7;40041:24;;;;;;;;;;;40034:31;;;40076:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39092:1008;;;39021:1079;:::o;36525:221::-;36610:14;36627:20;36644:2;36627:16;:20::i;:::-;36610:37;;36685:7;36658:12;:16;36671:2;36658:16;;;;;;;;;;;;;;;:24;36675:6;36658:24;;;;;;;;;;;:34;;;;36732:6;36703:17;:26;36721:7;36703:26;;;;;;;;;;;:35;;;;36599:147;36525:221;;:::o;27565:382::-;27659:1;27645:16;;:2;:16;;;;27637:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27718:16;27726:7;27718;:16::i;:::-;27717:17;27709:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27780:45;27809:1;27813:2;27817:7;27780:20;:45::i;:::-;27855:1;27838:9;:13;27848:2;27838:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27886:2;27867:7;:16;27875:7;27867:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27931:7;27927:2;27906:33;;27923:1;27906:33;;;;;;;;;;;;27565:382;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:323::-;6267:6;6316:2;6304:9;6295:7;6291:23;6287:32;6284:119;;;6322:79;;:::i;:::-;6284:119;6442:1;6467:50;6509:7;6500:6;6489:9;6485:22;6467:50;:::i;:::-;6457:60;;6413:114;6211:323;;;;:::o;6540:327::-;6598:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:119;;;6653:79;;:::i;:::-;6615:119;6773:1;6798:52;6842:7;6833:6;6822:9;6818:22;6798:52;:::i;:::-;6788:62;;6744:116;6540:327;;;;:::o;6873:349::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:119;;;6997:79;;:::i;:::-;6959:119;7117:1;7142:63;7197:7;7188:6;7177:9;7173:22;7142:63;:::i;:::-;7132:73;;7088:127;6873:349;;;;:::o;7228:509::-;7297:6;7346:2;7334:9;7325:7;7321:23;7317:32;7314:119;;;7352:79;;:::i;:::-;7314:119;7500:1;7489:9;7485:17;7472:31;7530:18;7522:6;7519:30;7516:117;;;7552:79;;:::i;:::-;7516:117;7657:63;7712:7;7703:6;7692:9;7688:22;7657:63;:::i;:::-;7647:73;;7443:287;7228:509;;;;:::o;7743:329::-;7802:6;7851:2;7839:9;7830:7;7826:23;7822:32;7819:119;;;7857:79;;:::i;:::-;7819:119;7977:1;8002:53;8047:7;8038:6;8027:9;8023:22;8002:53;:::i;:::-;7992:63;;7948:117;7743:329;;;;:::o;8078:474::-;8146:6;8154;8203:2;8191:9;8182:7;8178:23;8174:32;8171:119;;;8209:79;;:::i;:::-;8171:119;8329:1;8354:53;8399:7;8390:6;8379:9;8375:22;8354:53;:::i;:::-;8344:63;;8300:117;8456:2;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8427:118;8078:474;;;;;:::o;8558:704::-;8653:6;8661;8669;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8844:1;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8815:117;8999:2;8988:9;8984:18;8971:32;9030:18;9022:6;9019:30;9016:117;;;9052:79;;:::i;:::-;9016:117;9165:80;9237:7;9228:6;9217:9;9213:22;9165:80;:::i;:::-;9147:98;;;;8942:313;8558:704;;;;;:::o;9268:179::-;9337:10;9358:46;9400:3;9392:6;9358:46;:::i;:::-;9436:4;9431:3;9427:14;9413:28;;9268:179;;;;:::o;9453:118::-;9540:24;9558:5;9540:24;:::i;:::-;9535:3;9528:37;9453:118;;:::o;9607:732::-;9726:3;9755:54;9803:5;9755:54;:::i;:::-;9825:86;9904:6;9899:3;9825:86;:::i;:::-;9818:93;;9935:56;9985:5;9935:56;:::i;:::-;10014:7;10045:1;10030:284;10055:6;10052:1;10049:13;10030:284;;;10131:6;10125:13;10158:63;10217:3;10202:13;10158:63;:::i;:::-;10151:70;;10244:60;10297:6;10244:60;:::i;:::-;10234:70;;10090:224;10077:1;10074;10070:9;10065:14;;10030:284;;;10034:14;10330:3;10323:10;;9731:608;;;9607:732;;;;:::o;10345:109::-;10426:21;10441:5;10426:21;:::i;:::-;10421:3;10414:34;10345:109;;:::o;10460:360::-;10546:3;10574:38;10606:5;10574:38;:::i;:::-;10628:70;10691:6;10686:3;10628:70;:::i;:::-;10621:77;;10707:52;10752:6;10747:3;10740:4;10733:5;10729:16;10707:52;:::i;:::-;10784:29;10806:6;10784:29;:::i;:::-;10779:3;10775:39;10768:46;;10550:270;10460:360;;;;:::o;10826:364::-;10914:3;10942:39;10975:5;10942:39;:::i;:::-;10997:71;11061:6;11056:3;10997:71;:::i;:::-;10990:78;;11077:52;11122:6;11117:3;11110:4;11103:5;11099:16;11077:52;:::i;:::-;11154:29;11176:6;11154:29;:::i;:::-;11149:3;11145:39;11138:46;;10918:272;10826:364;;;;:::o;11196:377::-;11302:3;11330:39;11363:5;11330:39;:::i;:::-;11385:89;11467:6;11462:3;11385:89;:::i;:::-;11378:96;;11483:52;11528:6;11523:3;11516:4;11509:5;11505:16;11483:52;:::i;:::-;11560:6;11555:3;11551:16;11544:23;;11306:267;11196:377;;;;:::o;11579:366::-;11721:3;11742:67;11806:2;11801:3;11742:67;:::i;:::-;11735:74;;11818:93;11907:3;11818:93;:::i;:::-;11936:2;11931:3;11927:12;11920:19;;11579:366;;;:::o;11951:::-;12093:3;12114:67;12178:2;12173:3;12114:67;:::i;:::-;12107:74;;12190:93;12279:3;12190:93;:::i;:::-;12308:2;12303:3;12299:12;12292:19;;11951:366;;;:::o;12323:::-;12465:3;12486:67;12550:2;12545:3;12486:67;:::i;:::-;12479:74;;12562:93;12651:3;12562:93;:::i;:::-;12680:2;12675:3;12671:12;12664:19;;12323:366;;;:::o;12695:::-;12837:3;12858:67;12922:2;12917:3;12858:67;:::i;:::-;12851:74;;12934:93;13023:3;12934:93;:::i;:::-;13052:2;13047:3;13043:12;13036:19;;12695:366;;;:::o;13067:::-;13209:3;13230:67;13294:2;13289:3;13230:67;:::i;:::-;13223:74;;13306:93;13395:3;13306:93;:::i;:::-;13424:2;13419:3;13415:12;13408:19;;13067:366;;;:::o;13439:::-;13581:3;13602:67;13666:2;13661:3;13602:67;:::i;:::-;13595:74;;13678:93;13767:3;13678:93;:::i;:::-;13796:2;13791:3;13787:12;13780:19;;13439:366;;;:::o;13811:::-;13953:3;13974:67;14038:2;14033:3;13974:67;:::i;:::-;13967:74;;14050:93;14139:3;14050:93;:::i;:::-;14168:2;14163:3;14159:12;14152:19;;13811:366;;;:::o;14183:::-;14325:3;14346:67;14410:2;14405:3;14346:67;:::i;:::-;14339:74;;14422:93;14511:3;14422:93;:::i;:::-;14540:2;14535:3;14531:12;14524:19;;14183:366;;;:::o;14555:::-;14697:3;14718:67;14782:2;14777:3;14718:67;:::i;:::-;14711:74;;14794:93;14883:3;14794:93;:::i;:::-;14912:2;14907:3;14903:12;14896:19;;14555:366;;;:::o;14927:::-;15069:3;15090:67;15154:2;15149:3;15090:67;:::i;:::-;15083:74;;15166:93;15255:3;15166:93;:::i;:::-;15284:2;15279:3;15275:12;15268:19;;14927:366;;;:::o;15299:::-;15441:3;15462:67;15526:2;15521:3;15462:67;:::i;:::-;15455:74;;15538:93;15627:3;15538:93;:::i;:::-;15656:2;15651:3;15647:12;15640:19;;15299:366;;;:::o;15671:::-;15813:3;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15910:93;15999:3;15910:93;:::i;:::-;16028:2;16023:3;16019:12;16012:19;;15671:366;;;:::o;16043:400::-;16203:3;16224:84;16306:1;16301:3;16224:84;:::i;:::-;16217:91;;16317:93;16406:3;16317:93;:::i;:::-;16435:1;16430:3;16426:11;16419:18;;16043:400;;;:::o;16449:366::-;16591:3;16612:67;16676:2;16671:3;16612:67;:::i;:::-;16605:74;;16688:93;16777:3;16688:93;:::i;:::-;16806:2;16801:3;16797:12;16790:19;;16449:366;;;:::o;16821:::-;16963:3;16984:67;17048:2;17043:3;16984:67;:::i;:::-;16977:74;;17060:93;17149:3;17060:93;:::i;:::-;17178:2;17173:3;17169:12;17162:19;;16821:366;;;:::o;17193:::-;17335:3;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17432:93;17521:3;17432:93;:::i;:::-;17550:2;17545:3;17541:12;17534:19;;17193:366;;;:::o;17565:::-;17707:3;17728:67;17792:2;17787:3;17728:67;:::i;:::-;17721:74;;17804:93;17893:3;17804:93;:::i;:::-;17922:2;17917:3;17913:12;17906:19;;17565:366;;;:::o;17937:::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:::-;18451:3;18472:67;18536:2;18531:3;18472:67;:::i;:::-;18465:74;;18548:93;18637:3;18548:93;:::i;:::-;18666:2;18661:3;18657:12;18650:19;;18309:366;;;:::o;18681:108::-;18758:24;18776:5;18758:24;:::i;:::-;18753:3;18746:37;18681:108;;:::o;18795:118::-;18882:24;18900:5;18882:24;:::i;:::-;18877:3;18870:37;18795:118;;:::o;18919:275::-;19051:3;19073:95;19164:3;19155:6;19073:95;:::i;:::-;19066:102;;19185:3;19178:10;;18919:275;;;;:::o;19200:701::-;19481:3;19503:95;19594:3;19585:6;19503:95;:::i;:::-;19496:102;;19615:95;19706:3;19697:6;19615:95;:::i;:::-;19608:102;;19727:148;19871:3;19727:148;:::i;:::-;19720:155;;19892:3;19885:10;;19200:701;;;;;:::o;19907:222::-;20000:4;20038:2;20027:9;20023:18;20015:26;;20051:71;20119:1;20108:9;20104:17;20095:6;20051:71;:::i;:::-;19907:222;;;;:::o;20135:640::-;20330:4;20368:3;20357:9;20353:19;20345:27;;20382:71;20450:1;20439:9;20435:17;20426:6;20382:71;:::i;:::-;20463:72;20531:2;20520:9;20516:18;20507:6;20463:72;:::i;:::-;20545;20613:2;20602:9;20598:18;20589:6;20545:72;:::i;:::-;20664:9;20658:4;20654:20;20649:2;20638:9;20634:18;20627:48;20692:76;20763:4;20754:6;20692:76;:::i;:::-;20684:84;;20135:640;;;;;;;:::o;20781:373::-;20924:4;20962:2;20951:9;20947:18;20939:26;;21011:9;21005:4;21001:20;20997:1;20986:9;20982:17;20975:47;21039:108;21142:4;21133:6;21039:108;:::i;:::-;21031:116;;20781:373;;;;:::o;21160:210::-;21247:4;21285:2;21274:9;21270:18;21262:26;;21298:65;21360:1;21349:9;21345:17;21336:6;21298:65;:::i;:::-;21160:210;;;;:::o;21376:313::-;21489:4;21527:2;21516:9;21512:18;21504:26;;21576:9;21570:4;21566:20;21562:1;21551:9;21547:17;21540:47;21604:78;21677:4;21668:6;21604:78;:::i;:::-;21596:86;;21376:313;;;;:::o;21695:419::-;21861:4;21899:2;21888:9;21884:18;21876:26;;21948:9;21942:4;21938:20;21934:1;21923:9;21919:17;21912:47;21976:131;22102:4;21976:131;:::i;:::-;21968:139;;21695:419;;;:::o;22120:::-;22286:4;22324:2;22313:9;22309:18;22301:26;;22373:9;22367:4;22363:20;22359:1;22348:9;22344:17;22337:47;22401:131;22527:4;22401:131;:::i;:::-;22393:139;;22120:419;;;:::o;22545:::-;22711:4;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22545:419;;;:::o;22970:::-;23136:4;23174:2;23163:9;23159:18;23151:26;;23223:9;23217:4;23213:20;23209:1;23198:9;23194:17;23187:47;23251:131;23377:4;23251:131;:::i;:::-;23243:139;;22970:419;;;:::o;23395:::-;23561:4;23599:2;23588:9;23584:18;23576:26;;23648:9;23642:4;23638:20;23634:1;23623:9;23619:17;23612:47;23676:131;23802:4;23676:131;:::i;:::-;23668:139;;23395:419;;;:::o;23820:::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:131;24227:4;24101:131;:::i;:::-;24093:139;;23820:419;;;:::o;24245:::-;24411:4;24449:2;24438:9;24434:18;24426:26;;24498:9;24492:4;24488:20;24484:1;24473:9;24469:17;24462:47;24526:131;24652:4;24526:131;:::i;:::-;24518:139;;24245:419;;;:::o;24670:::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24670:419;;;:::o;25095:::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25095:419;;;:::o;25520:::-;25686:4;25724:2;25713:9;25709:18;25701:26;;25773:9;25767:4;25763:20;25759:1;25748:9;25744:17;25737:47;25801:131;25927:4;25801:131;:::i;:::-;25793:139;;25520:419;;;:::o;25945:::-;26111:4;26149:2;26138:9;26134:18;26126:26;;26198:9;26192:4;26188:20;26184:1;26173:9;26169:17;26162:47;26226:131;26352:4;26226:131;:::i;:::-;26218:139;;25945:419;;;:::o;26370:::-;26536:4;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26370:419;;;:::o;26795:::-;26961:4;26999:2;26988:9;26984:18;26976:26;;27048:9;27042:4;27038:20;27034:1;27023:9;27019:17;27012:47;27076:131;27202:4;27076:131;:::i;:::-;27068:139;;26795:419;;;:::o;27220:::-;27386:4;27424:2;27413:9;27409:18;27401:26;;27473:9;27467:4;27463:20;27459:1;27448:9;27444:17;27437:47;27501:131;27627:4;27501:131;:::i;:::-;27493:139;;27220:419;;;:::o;27645:::-;27811:4;27849:2;27838:9;27834:18;27826:26;;27898:9;27892:4;27888:20;27884:1;27873:9;27869:17;27862:47;27926:131;28052:4;27926:131;:::i;:::-;27918:139;;27645:419;;;:::o;28070:::-;28236:4;28274:2;28263:9;28259:18;28251:26;;28323:9;28317:4;28313:20;28309:1;28298:9;28294:17;28287:47;28351:131;28477:4;28351:131;:::i;:::-;28343:139;;28070:419;;;:::o;28495:::-;28661:4;28699:2;28688:9;28684:18;28676:26;;28748:9;28742:4;28738:20;28734:1;28723:9;28719:17;28712:47;28776:131;28902:4;28776:131;:::i;:::-;28768:139;;28495:419;;;:::o;28920:::-;29086:4;29124:2;29113:9;29109:18;29101:26;;29173:9;29167:4;29163:20;29159:1;29148:9;29144:17;29137:47;29201:131;29327:4;29201:131;:::i;:::-;29193:139;;28920:419;;;:::o;29345:222::-;29438:4;29476:2;29465:9;29461:18;29453:26;;29489:71;29557:1;29546:9;29542:17;29533:6;29489:71;:::i;:::-;29345:222;;;;:::o;29573:129::-;29607:6;29634:20;;:::i;:::-;29624:30;;29663:33;29691:4;29683:6;29663:33;:::i;:::-;29573:129;;;:::o;29708:75::-;29741:6;29774:2;29768:9;29758:19;;29708:75;:::o;29789:307::-;29850:4;29940:18;29932:6;29929:30;29926:56;;;29962:18;;:::i;:::-;29926:56;30000:29;30022:6;30000:29;:::i;:::-;29992:37;;30084:4;30078;30074:15;30066:23;;29789:307;;;:::o;30102:308::-;30164:4;30254:18;30246:6;30243:30;30240:56;;;30276:18;;:::i;:::-;30240:56;30314:29;30336:6;30314:29;:::i;:::-;30306:37;;30398:4;30392;30388:15;30380:23;;30102:308;;;:::o;30416:132::-;30483:4;30506:3;30498:11;;30536:4;30531:3;30527:14;30519:22;;30416:132;;;:::o;30554:114::-;30621:6;30655:5;30649:12;30639:22;;30554:114;;;:::o;30674:98::-;30725:6;30759:5;30753:12;30743:22;;30674:98;;;:::o;30778:99::-;30830:6;30864:5;30858:12;30848:22;;30778:99;;;:::o;30883:113::-;30953:4;30985;30980:3;30976:14;30968:22;;30883:113;;;:::o;31002:184::-;31101:11;31135:6;31130:3;31123:19;31175:4;31170:3;31166:14;31151:29;;31002:184;;;;:::o;31192:168::-;31275:11;31309:6;31304:3;31297:19;31349:4;31344:3;31340:14;31325:29;;31192:168;;;;:::o;31366:169::-;31450:11;31484:6;31479:3;31472:19;31524:4;31519:3;31515:14;31500:29;;31366:169;;;;:::o;31541:148::-;31643:11;31680:3;31665:18;;31541:148;;;;:::o;31695:305::-;31735:3;31754:20;31772:1;31754:20;:::i;:::-;31749:25;;31788:20;31806:1;31788:20;:::i;:::-;31783:25;;31942:1;31874:66;31870:74;31867:1;31864:81;31861:107;;;31948:18;;:::i;:::-;31861:107;31992:1;31989;31985:9;31978:16;;31695:305;;;;:::o;32006:237::-;32044:3;32063:18;32079:1;32063:18;:::i;:::-;32058:23;;32095:18;32111:1;32095:18;:::i;:::-;32090:23;;32185:1;32179:4;32175:12;32172:1;32169:19;32166:45;;;32191:18;;:::i;:::-;32166:45;32235:1;32232;32228:9;32221:16;;32006:237;;;;:::o;32249:185::-;32289:1;32306:20;32324:1;32306:20;:::i;:::-;32301:25;;32340:20;32358:1;32340:20;:::i;:::-;32335:25;;32379:1;32369:35;;32384:18;;:::i;:::-;32369:35;32426:1;32423;32419:9;32414:14;;32249:185;;;;:::o;32440:348::-;32480:7;32503:20;32521:1;32503:20;:::i;:::-;32498:25;;32537:20;32555:1;32537:20;:::i;:::-;32532:25;;32725:1;32657:66;32653:74;32650:1;32647:81;32642:1;32635:9;32628:17;32624:105;32621:131;;;32732:18;;:::i;:::-;32621:131;32780:1;32777;32773:9;32762:20;;32440:348;;;;:::o;32794:191::-;32834:4;32854:20;32872:1;32854:20;:::i;:::-;32849:25;;32888:20;32906:1;32888:20;:::i;:::-;32883:25;;32927:1;32924;32921:8;32918:34;;;32932:18;;:::i;:::-;32918:34;32977:1;32974;32970:9;32962:17;;32794:191;;;;:::o;32991:96::-;33028:7;33057:24;33075:5;33057:24;:::i;:::-;33046:35;;32991:96;;;:::o;33093:90::-;33127:7;33170:5;33163:13;33156:21;33145:32;;33093:90;;;:::o;33189:149::-;33225:7;33265:66;33258:5;33254:78;33243:89;;33189:149;;;:::o;33344:126::-;33381:7;33421:42;33414:5;33410:54;33399:65;;33344:126;;;:::o;33476:77::-;33513:7;33542:5;33531:16;;33476:77;;;:::o;33559:86::-;33594:7;33634:4;33627:5;33623:16;33612:27;;33559:86;;;:::o;33651:154::-;33735:6;33730:3;33725;33712:30;33797:1;33788:6;33783:3;33779:16;33772:27;33651:154;;;:::o;33811:307::-;33879:1;33889:113;33903:6;33900:1;33897:13;33889:113;;;33988:1;33983:3;33979:11;33973:18;33969:1;33964:3;33960:11;33953:39;33925:2;33922:1;33918:10;33913:15;;33889:113;;;34020:6;34017:1;34014:13;34011:101;;;34100:1;34091:6;34086:3;34082:16;34075:27;34011:101;33860:258;33811:307;;;:::o;34124:320::-;34168:6;34205:1;34199:4;34195:12;34185:22;;34252:1;34246:4;34242:12;34273:18;34263:81;;34329:4;34321:6;34317:17;34307:27;;34263:81;34391:2;34383:6;34380:14;34360:18;34357:38;34354:84;;;34410:18;;:::i;:::-;34354:84;34175:269;34124:320;;;:::o;34450:281::-;34533:27;34555:4;34533:27;:::i;:::-;34525:6;34521:40;34663:6;34651:10;34648:22;34627:18;34615:10;34612:34;34609:62;34606:88;;;34674:18;;:::i;:::-;34606:88;34714:10;34710:2;34703:22;34493:238;34450:281;;:::o;34737:233::-;34776:3;34799:24;34817:5;34799:24;:::i;:::-;34790:33;;34845:66;34838:5;34835:77;34832:103;;;34915:18;;:::i;:::-;34832:103;34962:1;34955:5;34951:13;34944:20;;34737:233;;;:::o;34976:180::-;35024:77;35021:1;35014:88;35121:4;35118:1;35111:15;35145:4;35142:1;35135:15;35162:180;35210:77;35207:1;35200:88;35307:4;35304:1;35297:15;35331:4;35328:1;35321:15;35348:180;35396:77;35393:1;35386:88;35493:4;35490:1;35483:15;35517:4;35514:1;35507:15;35534:180;35582:77;35579:1;35572:88;35679:4;35676:1;35669:15;35703:4;35700:1;35693:15;35720:180;35768:77;35765:1;35758:88;35865:4;35862:1;35855:15;35889:4;35886:1;35879:15;35906:180;35954:77;35951:1;35944:88;36051:4;36048:1;36041:15;36075:4;36072:1;36065:15;36092:117;36201:1;36198;36191:12;36215:117;36324:1;36321;36314:12;36338:117;36447:1;36444;36437:12;36461:117;36570:1;36567;36560:12;36584:117;36693:1;36690;36683:12;36707:117;36816:1;36813;36806:12;36830:102;36871:6;36922:2;36918:7;36913:2;36906:5;36902:14;36898:28;36888:38;;36830:102;;;:::o;36938:230::-;37078:34;37074:1;37066:6;37062:14;37055:58;37147:13;37142:2;37134:6;37130:15;37123:38;36938:230;:::o;37174:237::-;37314:34;37310:1;37302:6;37298:14;37291:58;37383:20;37378:2;37370:6;37366:15;37359:45;37174:237;:::o;37417:225::-;37557:34;37553:1;37545:6;37541:14;37534:58;37626:8;37621:2;37613:6;37609:15;37602:33;37417:225;:::o;37648:178::-;37788:30;37784:1;37776:6;37772:14;37765:54;37648:178;:::o;37832:223::-;37972:34;37968:1;37960:6;37956:14;37949:58;38041:6;38036:2;38028:6;38024:15;38017:31;37832:223;:::o;38061:175::-;38201:27;38197:1;38189:6;38185:14;38178:51;38061:175;:::o;38242:231::-;38382:34;38378:1;38370:6;38366:14;38359:58;38451:14;38446:2;38438:6;38434:15;38427:39;38242:231;:::o;38479:243::-;38619:34;38615:1;38607:6;38603:14;38596:58;38688:26;38683:2;38675:6;38671:15;38664:51;38479:243;:::o;38728:229::-;38868:34;38864:1;38856:6;38852:14;38845:58;38937:12;38932:2;38924:6;38920:15;38913:37;38728:229;:::o;38963:228::-;39103:34;39099:1;39091:6;39087:14;39080:58;39172:11;39167:2;39159:6;39155:15;39148:36;38963:228;:::o;39197:182::-;39337:34;39333:1;39325:6;39321:14;39314:58;39197:182;:::o;39385:231::-;39525:34;39521:1;39513:6;39509:14;39502:58;39594:14;39589:2;39581:6;39577:15;39570:39;39385:231;:::o;39622:155::-;39762:7;39758:1;39750:6;39746:14;39739:31;39622:155;:::o;39783:182::-;39923:34;39919:1;39911:6;39907:14;39900:58;39783:182;:::o;39971:228::-;40111:34;40107:1;40099:6;40095:14;40088:58;40180:11;40175:2;40167:6;40163:15;40156:36;39971:228;:::o;40205:234::-;40345:34;40341:1;40333:6;40329:14;40322:58;40414:17;40409:2;40401:6;40397:15;40390:42;40205:234;:::o;40445:220::-;40585:34;40581:1;40573:6;40569:14;40562:58;40654:3;40649:2;40641:6;40637:15;40630:28;40445:220;:::o;40671:236::-;40811:34;40807:1;40799:6;40795:14;40788:58;40880:19;40875:2;40867:6;40863:15;40856:44;40671:236;:::o;40913:231::-;41053:34;41049:1;41041:6;41037:14;41030:58;41122:14;41117:2;41109:6;41105:15;41098:39;40913:231;:::o;41150:122::-;41223:24;41241:5;41223:24;:::i;:::-;41216:5;41213:35;41203:63;;41262:1;41259;41252:12;41203:63;41150:122;:::o;41278:116::-;41348:21;41363:5;41348:21;:::i;:::-;41341:5;41338:32;41328:60;;41384:1;41381;41374:12;41328:60;41278:116;:::o;41400:120::-;41472:23;41489:5;41472:23;:::i;:::-;41465:5;41462:34;41452:62;;41510:1;41507;41500:12;41452:62;41400:120;:::o;41526:122::-;41599:24;41617:5;41599:24;:::i;:::-;41592:5;41589:35;41579:63;;41638:1;41635;41628:12;41579:63;41526:122;:::o
Swarm Source
ipfs://44e0211e30095a444bb9153cb00db951da7b094104bea75920ce834ff85f04f0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.