Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer Ownersh... | 12689986 | 1711 days ago | IN | 0 ETH | 0.0002902 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MiraNft
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-06-23
*/
// Sources flattened with hardhat v2.2.1 https://hardhat.org
// File @openzeppelin/contracts/utils/Context.sol@v4.1.0
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File @openzeppelin/contracts/access/Ownable.sol@v4.1.0
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), 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 {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.1.0
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File @openzeppelin/contracts/token/ERC721/IERC721.sol@v4.1.0
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
// File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol@v4.1.0
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol@v4.1.0
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File @openzeppelin/contracts/utils/Address.sol@v4.1.0
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin/contracts/utils/Strings.sol@v4.1.0
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant alphabet = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.1.0
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File @openzeppelin/contracts/token/ERC721/ERC721.sol@v4.1.0
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping (uint256 => address) private _owners;
// Mapping owner address to token count
mapping (address => uint256) private _balances;
// Mapping from token ID to approved address
mapping (uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping (address => mapping (address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC721).interfaceId
|| interfaceId == type(IERC721Metadata).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0
? string(abi.encodePacked(baseURI, tokenId.toString()))
: '';
}
/**
* @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
* in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
_mint(to, tokenId);
require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
private returns (bool)
{
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
// solhint-disable-next-line no-inline-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
// File @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol@v4.1.0
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @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 override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File @openzeppelin/contracts/security/ReentrancyGuard.sol@v4.1.0
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File contracts/MiraNft.sol
contract MiraNft is Ownable, ERC721URIStorage, ReentrancyGuard {
// Counter for token IDs
uint256 internal tokenIdCounter_;
// Token ID => Token Spender => Approval Status
mapping(uint256 => mapping(address => bool)) internal ownerApprovals_;
// Explainer for hash mechanism
string constant HASH_METHOD = "The hash at the end of the URI is the SHA256 of the data stored in the URI.";
// Emitted on mint and update
event TokenUriUpdated(
bool isMint,
uint256 indexed tokenID,
string uri,
string note
);
constructor(
string memory _name,
string memory _symbol
)
Ownable()
ERC721(_name, _symbol)
ERC721URIStorage()
{
}
/**
* @notice This function can only be called by the owner. This function
* will revert if the `_to` address is a contract that does not
* implement `ERC721Receiver`.
* @param _tokenURI Metadata for newly minted token.
* @param _to Address to receive the newly minted token.
*/
function mint(
string calldata _tokenURI,
string calldata _metaDataHash,
address _to
) external onlyOwner() nonReentrant() {
// Incrementing counter
tokenIdCounter_ += 1;
// Concatenating the URI with the metadata hash
string memory completeUri = _createUri(_tokenURI, _metaDataHash);
_safeMint(_to, tokenIdCounter_);
_setTokenURI(tokenIdCounter_, completeUri);
emit TokenUriUpdated(true, tokenIdCounter_, completeUri, HASH_METHOD);
}
/**
* @notice Allows only the contract owner to update the URI of a specific
* token.
* @param _tokenId The token to update.
* @param _newTokenURI The new URI for the specified token.
*/
function updateTokenURI(
uint256 _tokenId,
string calldata _newTokenURI,
string calldata _metaDataHash
) external onlyOwner() {
// Concatenating the URI with the metadata hash
string memory completeUri = _createUri(_newTokenURI, _metaDataHash);
// Sets URI
_setTokenURI(_tokenId, completeUri);
emit TokenUriUpdated(false, _tokenId, completeUri, HASH_METHOD);
}
/**
* @notice Allows only the owner of the contract to burn a specific token.
* @param _tokenId The specific token to be burnt.
*/
function burn(uint256 _tokenId) external onlyOwner() {
_burn(_tokenId);
emit TokenUriUpdated(false, _tokenId, "", HASH_METHOD);
}
/**
* @notice Allows only the contract owner to approve the transfer of a
* token.
* @param _from The address that the token will be moved out of.
* @param _to The address that the token will be moved to.
* @param _tokenId The identifier of the token being moved.
*/
function approveTransfer(
address _from,
address _to,
uint256 _tokenId,
bool _approved
) external onlyOwner() nonReentrant() {
require(
ownerOf(_tokenId) == _from,
"From is not token owner"
);
ownerApprovals_[_tokenId][_to] = _approved;
}
/**
* @notice This internal function is called before any token moving
* operation. This will prevent
* @param _from The address that the token will be moved out of.
* @param _to The address that the token will be moved to.
* @param _tokenId The identifier of the token being moved.
*/
function _beforeTokenTransfer(
address _from,
address _to,
uint256 _tokenId
) internal override {
// Checks that transfer has been approved.
// Does not check on mint or burn.
if(_from != address(0) && _to != address(0)) {
require(
ownerApprovals_[_tokenId][_to],
"Transfer has been not approved"
);
}
}
/**
* @param _uri The URI for the token.
* @param _metaDataHash The hash of the metadata stored at the URI
* location.
* @return string The concatenated string of the URI:metaDataHash
*/
function _createUri(
string calldata _uri,
string calldata _metaDataHash
)
internal
pure
returns(string memory)
{
return(string(
abi.encodePacked(
_uri,
":",
_metaDataHash
)
));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isMint","type":"bool"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"string","name":"note","type":"string"}],"name":"TokenUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"approveTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"string","name":"_metaDataHash","type":"string"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_newTokenURI","type":"string"},{"internalType":"string","name":"_metaDataHash","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162003eb438038062003eb4833981810160405281019062000037919062000257565b818160006200004b6200012d60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190805190602001906200010192919062000135565b5080600290805190602001906200011a92919062000135565b50505060016008819055505050620003fb565b600033905090565b828054620001439062000367565b90600052602060002090601f016020900481019282620001675760008555620001b3565b82601f106200018257805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b257825182559160200191906001019062000195565b5b509050620001c29190620001c6565b5090565b5b80821115620001e1576000816000905550600101620001c7565b5090565b6000620001fc620001f684620002fe565b620002ca565b9050828152602081018484840111156200021557600080fd5b6200022284828562000331565b509392505050565b600082601f8301126200023c57600080fd5b81516200024e848260208601620001e5565b91505092915050565b600080604083850312156200026b57600080fd5b600083015167ffffffffffffffff8111156200028657600080fd5b62000294858286016200022a565b925050602083015167ffffffffffffffff811115620002b257600080fd5b620002c0858286016200022a565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620002f457620002f3620003cc565b5b8060405250919050565b600067ffffffffffffffff8211156200031c576200031b620003cc565b5b601f19601f8301169050602081019050919050565b60005b838110156200035157808201518184015260208101905062000334565b8381111562000361576000848401525b50505050565b600060028204905060018216806200038057607f821691505b602082108114156200039757620003966200039d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613aa9806200040b6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610319578063c13a079414610335578063c87b56dd14610351578063e985e9c514610381578063f2fde38b146103b15761012c565b8063715018a61461029b5780638da5cb5b146102a5578063904c5747146102c357806395d89b41146102df578063a22cb465146102fd5761012c565b806323b872dd116100f457806323b872dd146101e757806342842e0e1461020357806342966c681461021f5780636352211e1461023b57806370a082311461026b5761012c565b806301ffc9a71461013157806306fdde031461016157806307049fb51461017f578063081812fc1461019b578063095ea7b3146101cb575b600080fd5b61014b600480360381019061014691906127d0565b6103cd565b60405161015891906132be565b60405180910390f35b6101696104af565b6040516101769190613361565b60405180910390f35b610199600480360381019061019491906128d4565b610541565b005b6101b560048036038101906101b091906128ab565b610633565b6040516101c29190613257565b60405180910390f35b6101e560048036038101906101e09190612794565b6106b8565b005b61020160048036038101906101fc919061262b565b6107d0565b005b61021d6004803603810190610218919061262b565b610830565b005b610239600480360381019061023491906128ab565b610850565b005b610255600480360381019061025091906128ab565b61092a565b6040516102629190613257565b60405180910390f35b610285600480360381019061028091906125c6565b6109dc565b6040516102929190613623565b60405180910390f35b6102a3610a94565b005b6102ad610bce565b6040516102ba9190613257565b60405180910390f35b6102dd60048036038101906102d89190612822565b610bf7565b005b6102e7610d69565b6040516102f49190613361565b60405180910390f35b61031760048036038101906103129190612758565b610dfb565b005b610333600480360381019061032e91906126dd565b610f7c565b005b61034f600480360381019061034a919061267a565b610fde565b005b61036b600480360381019061036691906128ab565b611194565b6040516103789190613361565b60405180910390f35b61039b600480360381019061039691906125ef565b6112e6565b6040516103a891906132be565b60405180910390f35b6103cb60048036038101906103c691906125c6565b61137a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104a857506104a782611523565b5b9050919050565b6060600180546104be90613853565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90613853565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b61054961158d565b73ffffffffffffffffffffffffffffffffffffffff16610567610bce565b73ffffffffffffffffffffffffffffffffffffffff16146105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490613563565b60405180910390fd5b60006105cb85858585611595565b90506105d786826115c7565b857e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd93839336000836040518060800160405280604b8152602001613a29604b9139604051610623939291906132d9565b60405180910390a2505050505050565b600061063e8261163b565b61067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490613543565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106c38261092a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b906135c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661075361158d565b73ffffffffffffffffffffffffffffffffffffffff16148061078257506107818161077c61158d565b6112e6565b5b6107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613463565b60405180910390fd5b6107cb83836116a7565b505050565b6107e16107db61158d565b82611760565b610820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610817906135e3565b60405180910390fd5b61082b83838361183e565b505050565b61084b83838360405180602001604052806000815250610f7c565b505050565b61085861158d565b73ffffffffffffffffffffffffffffffffffffffff16610876610bce565b73ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390613563565b60405180910390fd5b6108d581611a9a565b807e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd938393360006040518060800160405280604b8152602001613a29604b913960405161091f92919061331e565b60405180910390a250565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca906134c3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906134a3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9c61158d565b73ffffffffffffffffffffffffffffffffffffffff16610aba610bce565b73ffffffffffffffffffffffffffffffffffffffff1614610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790613563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610bff61158d565b73ffffffffffffffffffffffffffffffffffffffff16610c1d610bce565b73ffffffffffffffffffffffffffffffffffffffff1614610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613563565b60405180910390fd5b60026008541415610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613603565b60405180910390fd5b6002600881905550600160096000828254610cd491906136e2565b925050819055506000610ce986868686611595565b9050610cf782600954611aed565b610d03600954826115c7565b6009547e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd93839336001836040518060800160405280604b8152602001613a29604b9139604051610d51939291906132d9565b60405180910390a25060016008819055505050505050565b606060028054610d7890613853565b80601f0160208091040260200160405190810160405280929190818152602001828054610da490613853565b8015610df15780601f10610dc657610100808354040283529160200191610df1565b820191906000526020600020905b815481529060010190602001808311610dd457829003601f168201915b5050505050905090565b610e0361158d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613423565b60405180910390fd5b8060066000610e7e61158d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f2b61158d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f7091906132be565b60405180910390a35050565b610f8d610f8761158d565b83611760565b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906135e3565b60405180910390fd5b610fd884848484611b0b565b50505050565b610fe661158d565b73ffffffffffffffffffffffffffffffffffffffff16611004610bce565b73ffffffffffffffffffffffffffffffffffffffff161461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613563565b60405180910390fd5b600260085414156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613603565b60405180910390fd5b60026008819055508373ffffffffffffffffffffffffffffffffffffffff166110c88361092a565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590613383565b60405180910390fd5b80600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160088190555050505050565b606061119f8261163b565b6111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d590613523565b60405180910390fd5b60006007600084815260200190815260200160002080546111fe90613853565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90613853565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b505050505090506000611288611b67565b905060008151141561129e5781925050506112e1565b6000825111156112d35780826040516020016112bb929190613233565b604051602081830303815290604052925050506112e1565b6112dc84611b7e565b925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61138261158d565b73ffffffffffffffffffffffffffffffffffffffff166113a0610bce565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906133c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060848484846040516020016115ae9493929190613200565b6040516020818303038152906040529050949350505050565b6115d08261163b565b61160f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611606906134e3565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906116369291906123c8565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661171a8361092a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061176b8261163b565b6117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613443565b60405180910390fd5b60006117b58361092a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061182457508373ffffffffffffffffffffffffffffffffffffffff1661180c84610633565b73ffffffffffffffffffffffffffffffffffffffff16145b80611835575061183481856112e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661185e8261092a565b73ffffffffffffffffffffffffffffffffffffffff16146118b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ab90613583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90613403565b60405180910390fd5b61192f838383611c25565b61193a6000826116a7565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198a9190613769565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e191906136e2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611aa381611d37565b6000600760008381526020019081526020016000208054611ac390613853565b905014611aea57600760008281526020019081526020016000206000611ae9919061244e565b5b50565b611b07828260405180602001604052806000815250611e48565b5050565b611b1684848461183e565b611b2284848484611ea3565b611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906133a3565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060611b898261163b565b611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906135a3565b60405180910390fd5b6000611bd2611b67565b90506000815111611bf25760405180602001604052806000815250611c1d565b80611bfc8461203a565b604051602001611c0d929190613233565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c8f5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611d3257600a600082815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890613483565b60405180910390fd5b5b505050565b6000611d428261092a565b9050611d5081600084611c25565b611d5b6000836116a7565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dab9190613769565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611e5283836121e7565b611e5f6000848484611ea3565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e95906133a3565b60405180910390fd5b505050565b6000611ec48473ffffffffffffffffffffffffffffffffffffffff166123b5565b1561202d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eed61158d565b8786866040518563ffffffff1660e01b8152600401611f0f9493929190613272565b602060405180830381600087803b158015611f2957600080fd5b505af1925050508015611f5a57506040513d601f19601f82011682018060405250810190611f5791906127f9565b60015b611fdd573d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b50600081511415611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc906133a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612032565b600190505b949350505050565b60606000821415612082576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121e2565b600082905060005b600082146120b457808061209d90613885565b915050600a826120ad9190613738565b915061208a565b60008167ffffffffffffffff8111156120f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121285781602001600182028036833780820191505090505b5090505b600085146121db576001826121419190613769565b9150600a8561215091906138ce565b603061215c91906136e2565b60f81b818381518110612198577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d49190613738565b945061212c565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e90613503565b60405180910390fd5b6122608161163b565b156122a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612297906133e3565b60405180910390fd5b6122ac60008383611c25565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fc91906136e2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546123d490613853565b90600052602060002090601f0160209004810192826123f6576000855561243d565b82601f1061240f57805160ff191683800117855561243d565b8280016001018555821561243d579182015b8281111561243c578251825591602001919060010190612421565b5b50905061244a919061248e565b5090565b50805461245a90613853565b6000825580601f1061246c575061248b565b601f01602090049060005260206000209081019061248a919061248e565b5b50565b5b808211156124a757600081600090555060010161248f565b5090565b60006124be6124b98461366f565b61363e565b9050828152602081018484840111156124d657600080fd5b6124e1848285613811565b509392505050565b6000813590506124f8816139cc565b92915050565b60008135905061250d816139e3565b92915050565b600081359050612522816139fa565b92915050565b600081519050612537816139fa565b92915050565b600082601f83011261254e57600080fd5b813561255e8482602086016124ab565b91505092915050565b60008083601f84011261257957600080fd5b8235905067ffffffffffffffff81111561259257600080fd5b6020830191508360018202830111156125aa57600080fd5b9250929050565b6000813590506125c081613a11565b92915050565b6000602082840312156125d857600080fd5b60006125e6848285016124e9565b91505092915050565b6000806040838503121561260257600080fd5b6000612610858286016124e9565b9250506020612621858286016124e9565b9150509250929050565b60008060006060848603121561264057600080fd5b600061264e868287016124e9565b935050602061265f868287016124e9565b9250506040612670868287016125b1565b9150509250925092565b6000806000806080858703121561269057600080fd5b600061269e878288016124e9565b94505060206126af878288016124e9565b93505060406126c0878288016125b1565b92505060606126d1878288016124fe565b91505092959194509250565b600080600080608085870312156126f357600080fd5b6000612701878288016124e9565b9450506020612712878288016124e9565b9350506040612723878288016125b1565b925050606085013567ffffffffffffffff81111561274057600080fd5b61274c8782880161253d565b91505092959194509250565b6000806040838503121561276b57600080fd5b6000612779858286016124e9565b925050602061278a858286016124fe565b9150509250929050565b600080604083850312156127a757600080fd5b60006127b5858286016124e9565b92505060206127c6858286016125b1565b9150509250929050565b6000602082840312156127e257600080fd5b60006127f084828501612513565b91505092915050565b60006020828403121561280b57600080fd5b600061281984828501612528565b91505092915050565b60008060008060006060868803121561283a57600080fd5b600086013567ffffffffffffffff81111561285457600080fd5b61286088828901612567565b9550955050602086013567ffffffffffffffff81111561287f57600080fd5b61288b88828901612567565b9350935050604061289e888289016124e9565b9150509295509295909350565b6000602082840312156128bd57600080fd5b60006128cb848285016125b1565b91505092915050565b6000806000806000606086880312156128ec57600080fd5b60006128fa888289016125b1565b955050602086013567ffffffffffffffff81111561291757600080fd5b61292388828901612567565b9450945050604086013567ffffffffffffffff81111561294257600080fd5b61294e88828901612567565b92509250509295509295909350565b6129668161379d565b82525050565b612975816137af565b82525050565b60006129868261369f565b61299081856136b5565b93506129a0818560208601613820565b6129a9816139bb565b840191505092915050565b60006129c083856136d7565b93506129cd838584613811565b82840190509392505050565b60006129e4826136aa565b6129ee81856136c6565b93506129fe818560208601613820565b612a07816139bb565b840191505092915050565b6000612a1d826136aa565b612a2781856136d7565b9350612a37818560208601613820565b80840191505092915050565b6000612a506017836136c6565b91507f46726f6d206973206e6f7420746f6b656e206f776e65720000000000000000006000830152602082019050919050565b6000612a906032836136c6565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612af66026836136c6565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b5c601c836136c6565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612b9c6024836136c6565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c026019836136c6565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612c42602c836136c6565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612ca86038836136c6565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612d0e601e836136c6565b91507f5472616e7366657220686173206265656e206e6f7420617070726f76656400006000830152602082019050919050565b6000612d4e602a836136c6565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612db46029836136c6565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e1a602e836136c6565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000612e806020836136c6565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612ec06031836136c6565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000612f26602c836136c6565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f8c6001836136d7565b91507f3a000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000612fcc6020836136c6565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061300c6029836136c6565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613072602f836136c6565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006130d86021836136c6565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313e6000836136c6565b9150600082019050919050565b60006131586031836136c6565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006131be601f836136c6565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6131fa81613807565b82525050565b600061320d8286886129b4565b915061321882612f7f565b91506132258284866129b4565b915081905095945050505050565b600061323f8285612a12565b915061324b8284612a12565b91508190509392505050565b600060208201905061326c600083018461295d565b92915050565b6000608082019050613287600083018761295d565b613294602083018661295d565b6132a160408301856131f1565b81810360608301526132b3818461297b565b905095945050505050565b60006020820190506132d3600083018461296c565b92915050565b60006060820190506132ee600083018661296c565b818103602083015261330081856129d9565b9050818103604083015261331481846129d9565b9050949350505050565b6000606082019050613333600083018561296c565b818103602083015261334481613131565b9050818103604083015261335881846129d9565b90509392505050565b6000602082019050818103600083015261337b81846129d9565b905092915050565b6000602082019050818103600083015261339c81612a43565b9050919050565b600060208201905081810360008301526133bc81612a83565b9050919050565b600060208201905081810360008301526133dc81612ae9565b9050919050565b600060208201905081810360008301526133fc81612b4f565b9050919050565b6000602082019050818103600083015261341c81612b8f565b9050919050565b6000602082019050818103600083015261343c81612bf5565b9050919050565b6000602082019050818103600083015261345c81612c35565b9050919050565b6000602082019050818103600083015261347c81612c9b565b9050919050565b6000602082019050818103600083015261349c81612d01565b9050919050565b600060208201905081810360008301526134bc81612d41565b9050919050565b600060208201905081810360008301526134dc81612da7565b9050919050565b600060208201905081810360008301526134fc81612e0d565b9050919050565b6000602082019050818103600083015261351c81612e73565b9050919050565b6000602082019050818103600083015261353c81612eb3565b9050919050565b6000602082019050818103600083015261355c81612f19565b9050919050565b6000602082019050818103600083015261357c81612fbf565b9050919050565b6000602082019050818103600083015261359c81612fff565b9050919050565b600060208201905081810360008301526135bc81613065565b9050919050565b600060208201905081810360008301526135dc816130cb565b9050919050565b600060208201905081810360008301526135fc8161314b565b9050919050565b6000602082019050818103600083015261361c816131b1565b9050919050565b600060208201905061363860008301846131f1565b92915050565b6000604051905081810181811067ffffffffffffffff821117156136655761366461398c565b5b8060405250919050565b600067ffffffffffffffff82111561368a5761368961398c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136ed82613807565b91506136f883613807565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561372d5761372c6138ff565b5b828201905092915050565b600061374382613807565b915061374e83613807565b92508261375e5761375d61392e565b5b828204905092915050565b600061377482613807565b915061377f83613807565b925082821015613792576137916138ff565b5b828203905092915050565b60006137a8826137e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561383e578082015181840152602081019050613823565b8381111561384d576000848401525b50505050565b6000600282049050600182168061386b57607f821691505b6020821081141561387f5761387e61395d565b5b50919050565b600061389082613807565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c3576138c26138ff565b5b600182019050919050565b60006138d982613807565b91506138e483613807565b9250826138f4576138f361392e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6139d58161379d565b81146139e057600080fd5b50565b6139ec816137af565b81146139f757600080fd5b50565b613a03816137bb565b8114613a0e57600080fd5b50565b613a1a81613807565b8114613a2557600080fd5b5056fe54686520686173682061742074686520656e64206f6620746865205552492069732074686520534841323536206f662074686520646174612073746f72656420696e20746865205552492ea2646970667358221220cd9313b873d7621bd25d4e21a9f775471c3b8d9966569cf00481c60d9342449c64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000084d2074657374203200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d54657374320000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063b88d4fde11610071578063b88d4fde14610319578063c13a079414610335578063c87b56dd14610351578063e985e9c514610381578063f2fde38b146103b15761012c565b8063715018a61461029b5780638da5cb5b146102a5578063904c5747146102c357806395d89b41146102df578063a22cb465146102fd5761012c565b806323b872dd116100f457806323b872dd146101e757806342842e0e1461020357806342966c681461021f5780636352211e1461023b57806370a082311461026b5761012c565b806301ffc9a71461013157806306fdde031461016157806307049fb51461017f578063081812fc1461019b578063095ea7b3146101cb575b600080fd5b61014b600480360381019061014691906127d0565b6103cd565b60405161015891906132be565b60405180910390f35b6101696104af565b6040516101769190613361565b60405180910390f35b610199600480360381019061019491906128d4565b610541565b005b6101b560048036038101906101b091906128ab565b610633565b6040516101c29190613257565b60405180910390f35b6101e560048036038101906101e09190612794565b6106b8565b005b61020160048036038101906101fc919061262b565b6107d0565b005b61021d6004803603810190610218919061262b565b610830565b005b610239600480360381019061023491906128ab565b610850565b005b610255600480360381019061025091906128ab565b61092a565b6040516102629190613257565b60405180910390f35b610285600480360381019061028091906125c6565b6109dc565b6040516102929190613623565b60405180910390f35b6102a3610a94565b005b6102ad610bce565b6040516102ba9190613257565b60405180910390f35b6102dd60048036038101906102d89190612822565b610bf7565b005b6102e7610d69565b6040516102f49190613361565b60405180910390f35b61031760048036038101906103129190612758565b610dfb565b005b610333600480360381019061032e91906126dd565b610f7c565b005b61034f600480360381019061034a919061267a565b610fde565b005b61036b600480360381019061036691906128ab565b611194565b6040516103789190613361565b60405180910390f35b61039b600480360381019061039691906125ef565b6112e6565b6040516103a891906132be565b60405180910390f35b6103cb60048036038101906103c691906125c6565b61137a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104a857506104a782611523565b5b9050919050565b6060600180546104be90613853565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90613853565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b61054961158d565b73ffffffffffffffffffffffffffffffffffffffff16610567610bce565b73ffffffffffffffffffffffffffffffffffffffff16146105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490613563565b60405180910390fd5b60006105cb85858585611595565b90506105d786826115c7565b857e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd93839336000836040518060800160405280604b8152602001613a29604b9139604051610623939291906132d9565b60405180910390a2505050505050565b600061063e8261163b565b61067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490613543565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106c38261092a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b906135c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661075361158d565b73ffffffffffffffffffffffffffffffffffffffff16148061078257506107818161077c61158d565b6112e6565b5b6107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613463565b60405180910390fd5b6107cb83836116a7565b505050565b6107e16107db61158d565b82611760565b610820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610817906135e3565b60405180910390fd5b61082b83838361183e565b505050565b61084b83838360405180602001604052806000815250610f7c565b505050565b61085861158d565b73ffffffffffffffffffffffffffffffffffffffff16610876610bce565b73ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390613563565b60405180910390fd5b6108d581611a9a565b807e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd938393360006040518060800160405280604b8152602001613a29604b913960405161091f92919061331e565b60405180910390a250565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca906134c3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906134a3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9c61158d565b73ffffffffffffffffffffffffffffffffffffffff16610aba610bce565b73ffffffffffffffffffffffffffffffffffffffff1614610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790613563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610bff61158d565b73ffffffffffffffffffffffffffffffffffffffff16610c1d610bce565b73ffffffffffffffffffffffffffffffffffffffff1614610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613563565b60405180910390fd5b60026008541415610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613603565b60405180910390fd5b6002600881905550600160096000828254610cd491906136e2565b925050819055506000610ce986868686611595565b9050610cf782600954611aed565b610d03600954826115c7565b6009547e6cb6a12c56e94d1fc852fdd3f963c3a9b591dfae11bf2e6d209bfbd93839336001836040518060800160405280604b8152602001613a29604b9139604051610d51939291906132d9565b60405180910390a25060016008819055505050505050565b606060028054610d7890613853565b80601f0160208091040260200160405190810160405280929190818152602001828054610da490613853565b8015610df15780601f10610dc657610100808354040283529160200191610df1565b820191906000526020600020905b815481529060010190602001808311610dd457829003601f168201915b5050505050905090565b610e0361158d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613423565b60405180910390fd5b8060066000610e7e61158d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f2b61158d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f7091906132be565b60405180910390a35050565b610f8d610f8761158d565b83611760565b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906135e3565b60405180910390fd5b610fd884848484611b0b565b50505050565b610fe661158d565b73ffffffffffffffffffffffffffffffffffffffff16611004610bce565b73ffffffffffffffffffffffffffffffffffffffff161461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613563565b60405180910390fd5b600260085414156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613603565b60405180910390fd5b60026008819055508373ffffffffffffffffffffffffffffffffffffffff166110c88361092a565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590613383565b60405180910390fd5b80600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160088190555050505050565b606061119f8261163b565b6111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d590613523565b60405180910390fd5b60006007600084815260200190815260200160002080546111fe90613853565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90613853565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b505050505090506000611288611b67565b905060008151141561129e5781925050506112e1565b6000825111156112d35780826040516020016112bb929190613233565b604051602081830303815290604052925050506112e1565b6112dc84611b7e565b925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61138261158d565b73ffffffffffffffffffffffffffffffffffffffff166113a0610bce565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613563565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906133c3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060848484846040516020016115ae9493929190613200565b6040516020818303038152906040529050949350505050565b6115d08261163b565b61160f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611606906134e3565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906116369291906123c8565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661171a8361092a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061176b8261163b565b6117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613443565b60405180910390fd5b60006117b58361092a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061182457508373ffffffffffffffffffffffffffffffffffffffff1661180c84610633565b73ffffffffffffffffffffffffffffffffffffffff16145b80611835575061183481856112e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661185e8261092a565b73ffffffffffffffffffffffffffffffffffffffff16146118b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ab90613583565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90613403565b60405180910390fd5b61192f838383611c25565b61193a6000826116a7565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198a9190613769565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e191906136e2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611aa381611d37565b6000600760008381526020019081526020016000208054611ac390613853565b905014611aea57600760008281526020019081526020016000206000611ae9919061244e565b5b50565b611b07828260405180602001604052806000815250611e48565b5050565b611b1684848461183e565b611b2284848484611ea3565b611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906133a3565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060611b898261163b565b611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906135a3565b60405180910390fd5b6000611bd2611b67565b90506000815111611bf25760405180602001604052806000815250611c1d565b80611bfc8461203a565b604051602001611c0d929190613233565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c8f5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611d3257600a600082815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890613483565b60405180910390fd5b5b505050565b6000611d428261092a565b9050611d5081600084611c25565b611d5b6000836116a7565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dab9190613769565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611e5283836121e7565b611e5f6000848484611ea3565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e95906133a3565b60405180910390fd5b505050565b6000611ec48473ffffffffffffffffffffffffffffffffffffffff166123b5565b1561202d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eed61158d565b8786866040518563ffffffff1660e01b8152600401611f0f9493929190613272565b602060405180830381600087803b158015611f2957600080fd5b505af1925050508015611f5a57506040513d601f19601f82011682018060405250810190611f5791906127f9565b60015b611fdd573d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b50600081511415611fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcc906133a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612032565b600190505b949350505050565b60606000821415612082576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121e2565b600082905060005b600082146120b457808061209d90613885565b915050600a826120ad9190613738565b915061208a565b60008167ffffffffffffffff8111156120f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121285781602001600182028036833780820191505090505b5090505b600085146121db576001826121419190613769565b9150600a8561215091906138ce565b603061215c91906136e2565b60f81b818381518110612198577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121d49190613738565b945061212c565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e90613503565b60405180910390fd5b6122608161163b565b156122a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612297906133e3565b60405180910390fd5b6122ac60008383611c25565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fc91906136e2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546123d490613853565b90600052602060002090601f0160209004810192826123f6576000855561243d565b82601f1061240f57805160ff191683800117855561243d565b8280016001018555821561243d579182015b8281111561243c578251825591602001919060010190612421565b5b50905061244a919061248e565b5090565b50805461245a90613853565b6000825580601f1061246c575061248b565b601f01602090049060005260206000209081019061248a919061248e565b5b50565b5b808211156124a757600081600090555060010161248f565b5090565b60006124be6124b98461366f565b61363e565b9050828152602081018484840111156124d657600080fd5b6124e1848285613811565b509392505050565b6000813590506124f8816139cc565b92915050565b60008135905061250d816139e3565b92915050565b600081359050612522816139fa565b92915050565b600081519050612537816139fa565b92915050565b600082601f83011261254e57600080fd5b813561255e8482602086016124ab565b91505092915050565b60008083601f84011261257957600080fd5b8235905067ffffffffffffffff81111561259257600080fd5b6020830191508360018202830111156125aa57600080fd5b9250929050565b6000813590506125c081613a11565b92915050565b6000602082840312156125d857600080fd5b60006125e6848285016124e9565b91505092915050565b6000806040838503121561260257600080fd5b6000612610858286016124e9565b9250506020612621858286016124e9565b9150509250929050565b60008060006060848603121561264057600080fd5b600061264e868287016124e9565b935050602061265f868287016124e9565b9250506040612670868287016125b1565b9150509250925092565b6000806000806080858703121561269057600080fd5b600061269e878288016124e9565b94505060206126af878288016124e9565b93505060406126c0878288016125b1565b92505060606126d1878288016124fe565b91505092959194509250565b600080600080608085870312156126f357600080fd5b6000612701878288016124e9565b9450506020612712878288016124e9565b9350506040612723878288016125b1565b925050606085013567ffffffffffffffff81111561274057600080fd5b61274c8782880161253d565b91505092959194509250565b6000806040838503121561276b57600080fd5b6000612779858286016124e9565b925050602061278a858286016124fe565b9150509250929050565b600080604083850312156127a757600080fd5b60006127b5858286016124e9565b92505060206127c6858286016125b1565b9150509250929050565b6000602082840312156127e257600080fd5b60006127f084828501612513565b91505092915050565b60006020828403121561280b57600080fd5b600061281984828501612528565b91505092915050565b60008060008060006060868803121561283a57600080fd5b600086013567ffffffffffffffff81111561285457600080fd5b61286088828901612567565b9550955050602086013567ffffffffffffffff81111561287f57600080fd5b61288b88828901612567565b9350935050604061289e888289016124e9565b9150509295509295909350565b6000602082840312156128bd57600080fd5b60006128cb848285016125b1565b91505092915050565b6000806000806000606086880312156128ec57600080fd5b60006128fa888289016125b1565b955050602086013567ffffffffffffffff81111561291757600080fd5b61292388828901612567565b9450945050604086013567ffffffffffffffff81111561294257600080fd5b61294e88828901612567565b92509250509295509295909350565b6129668161379d565b82525050565b612975816137af565b82525050565b60006129868261369f565b61299081856136b5565b93506129a0818560208601613820565b6129a9816139bb565b840191505092915050565b60006129c083856136d7565b93506129cd838584613811565b82840190509392505050565b60006129e4826136aa565b6129ee81856136c6565b93506129fe818560208601613820565b612a07816139bb565b840191505092915050565b6000612a1d826136aa565b612a2781856136d7565b9350612a37818560208601613820565b80840191505092915050565b6000612a506017836136c6565b91507f46726f6d206973206e6f7420746f6b656e206f776e65720000000000000000006000830152602082019050919050565b6000612a906032836136c6565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612af66026836136c6565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b5c601c836136c6565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612b9c6024836136c6565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c026019836136c6565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612c42602c836136c6565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612ca86038836136c6565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612d0e601e836136c6565b91507f5472616e7366657220686173206265656e206e6f7420617070726f76656400006000830152602082019050919050565b6000612d4e602a836136c6565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612db46029836136c6565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e1a602e836136c6565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000612e806020836136c6565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612ec06031836136c6565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000612f26602c836136c6565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f8c6001836136d7565b91507f3a000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000612fcc6020836136c6565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061300c6029836136c6565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613072602f836136c6565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006130d86021836136c6565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313e6000836136c6565b9150600082019050919050565b60006131586031836136c6565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006131be601f836136c6565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6131fa81613807565b82525050565b600061320d8286886129b4565b915061321882612f7f565b91506132258284866129b4565b915081905095945050505050565b600061323f8285612a12565b915061324b8284612a12565b91508190509392505050565b600060208201905061326c600083018461295d565b92915050565b6000608082019050613287600083018761295d565b613294602083018661295d565b6132a160408301856131f1565b81810360608301526132b3818461297b565b905095945050505050565b60006020820190506132d3600083018461296c565b92915050565b60006060820190506132ee600083018661296c565b818103602083015261330081856129d9565b9050818103604083015261331481846129d9565b9050949350505050565b6000606082019050613333600083018561296c565b818103602083015261334481613131565b9050818103604083015261335881846129d9565b90509392505050565b6000602082019050818103600083015261337b81846129d9565b905092915050565b6000602082019050818103600083015261339c81612a43565b9050919050565b600060208201905081810360008301526133bc81612a83565b9050919050565b600060208201905081810360008301526133dc81612ae9565b9050919050565b600060208201905081810360008301526133fc81612b4f565b9050919050565b6000602082019050818103600083015261341c81612b8f565b9050919050565b6000602082019050818103600083015261343c81612bf5565b9050919050565b6000602082019050818103600083015261345c81612c35565b9050919050565b6000602082019050818103600083015261347c81612c9b565b9050919050565b6000602082019050818103600083015261349c81612d01565b9050919050565b600060208201905081810360008301526134bc81612d41565b9050919050565b600060208201905081810360008301526134dc81612da7565b9050919050565b600060208201905081810360008301526134fc81612e0d565b9050919050565b6000602082019050818103600083015261351c81612e73565b9050919050565b6000602082019050818103600083015261353c81612eb3565b9050919050565b6000602082019050818103600083015261355c81612f19565b9050919050565b6000602082019050818103600083015261357c81612fbf565b9050919050565b6000602082019050818103600083015261359c81612fff565b9050919050565b600060208201905081810360008301526135bc81613065565b9050919050565b600060208201905081810360008301526135dc816130cb565b9050919050565b600060208201905081810360008301526135fc8161314b565b9050919050565b6000602082019050818103600083015261361c816131b1565b9050919050565b600060208201905061363860008301846131f1565b92915050565b6000604051905081810181811067ffffffffffffffff821117156136655761366461398c565b5b8060405250919050565b600067ffffffffffffffff82111561368a5761368961398c565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136ed82613807565b91506136f883613807565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561372d5761372c6138ff565b5b828201905092915050565b600061374382613807565b915061374e83613807565b92508261375e5761375d61392e565b5b828204905092915050565b600061377482613807565b915061377f83613807565b925082821015613792576137916138ff565b5b828203905092915050565b60006137a8826137e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561383e578082015181840152602081019050613823565b8381111561384d576000848401525b50505050565b6000600282049050600182168061386b57607f821691505b6020821081141561387f5761387e61395d565b5b50919050565b600061389082613807565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c3576138c26138ff565b5b600182019050919050565b60006138d982613807565b91506138e483613807565b9250826138f4576138f361392e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6139d58161379d565b81146139e057600080fd5b50565b6139ec816137af565b81146139f757600080fd5b50565b613a03816137bb565b8114613a0e57600080fd5b50565b613a1a81613807565b8114613a2557600080fd5b5056fe54686520686173682061742074686520656e64206f6620746865205552492069732074686520534841323536206f662074686520646174612073746f72656420696e20746865205552492ea2646970667358221220cd9313b873d7621bd25d4e21a9f775471c3b8d9966569cf00481c60d9342449c64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000084d2074657374203200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d54657374320000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): M test 2
Arg [1] : _symbol (string): MTest2
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 4d20746573742032000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4d54657374320000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
39124:4733:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22721:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23653:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41038:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25113:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24650:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26003:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26379:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41649:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23347:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23077:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2793:148;;;:::i;:::-;;2142:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40255:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23822:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25406:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26601:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42136:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34929:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25772:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3096:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22721:292;22823:4;22862:25;22847:40;;;:11;:40;;;;:105;;;;22919:33;22904:48;;;:11;:48;;;;22847:105;:158;;;;22969:36;22993:11;22969:23;:36::i;:::-;22847:158;22840:165;;22721:292;;;:::o;23653:100::-;23707:13;23740:5;23733:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23653:100;:::o;41038:445::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41265:25:::1;41293:39;41304:12;;41318:13;;41293:10;:39::i;:::-;41265:67;;41364:35;41377:8;41387:11;41364:12;:35::i;:::-;41440:8;41417:58;41433:5;41450:11;41463;;;;;;;;;;;;;;;;;41417:58;;;;;;;;:::i;:::-;;;;;;;;2433:1;41038:445:::0;;;;;:::o;25113:221::-;25189:7;25217:16;25225:7;25217;:16::i;:::-;25209:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25302:15;:24;25318:7;25302:24;;;;;;;;;;;;;;;;;;;;;25295:31;;25113:221;;;:::o;24650:397::-;24731:13;24747:23;24762:7;24747:14;:23::i;:::-;24731:39;;24795:5;24789:11;;:2;:11;;;;24781:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24875:5;24859:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24884:37;24901:5;24908:12;:10;:12::i;:::-;24884:16;:37::i;:::-;24859:62;24851:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25018:21;25027:2;25031:7;25018:8;:21::i;:::-;24650:397;;;:::o;26003:305::-;26164:41;26183:12;:10;:12::i;:::-;26197:7;26164:18;:41::i;:::-;26156:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26272:28;26282:4;26288:2;26292:7;26272:9;:28::i;:::-;26003:305;;;:::o;26379:151::-;26483:39;26500:4;26506:2;26510:7;26483:39;;;;;;;;;;;;:16;:39::i;:::-;26379:151;;;:::o;41649:154::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41713:15:::1;41719:8;41713:5;:15::i;:::-;41769:8;41746:49;41762:5;41783:11;;;;;;;;;;;;;;;;;41746:49;;;;;;;:::i;:::-;;;;;;;;41649:154:::0;:::o;23347:239::-;23419:7;23439:13;23455:7;:16;23463:7;23455:16;;;;;;;;;;;;;;;;;;;;;23439:32;;23507:1;23490:19;;:5;:19;;;;23482:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23573:5;23566:12;;;23347:239;;;:::o;23077:208::-;23149:7;23194:1;23177:19;;:5;:19;;;;23169:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23261:9;:16;23271:5;23261:16;;;;;;;;;;;;;;;;23254:23;;23077:208;;;:::o;2793:148::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2900:1:::1;2863:40;;2884:6;::::0;::::1;;;;;;;;2863:40;;;;;;;;;;;;2931:1;2914:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2793:148::o:0;2142:87::-;2188:7;2215:6;;;;;;;;;;;2208:13;;2142:87;:::o;40255:538::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38145:1:::1;38742:7;;:19;;38734:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38145:1;38875:7;:18;;;;40473:1:::2;40454:15;;:20;;;;;;;:::i;:::-;;;;;;;;40542:25;40570:36;40581:9;;40592:13;;40570:10;:36::i;:::-;40542:64;;40619:31;40629:3;40634:15;;40619:9;:31::i;:::-;40661:42;40674:15;;40691:11;40661:12;:42::i;:::-;40743:15;;40721:64;40737:4;40760:11;40773;;;;;;;;;;;;;;;;;40721:64;;;;;;;;:::i;:::-;;;;;;;;38906:1;38101::::1;39054:7;:22;;;;40255:538:::0;;;;;:::o;23822:104::-;23878:13;23911:7;23904:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23822:104;:::o;25406:295::-;25521:12;:10;:12::i;:::-;25509:24;;:8;:24;;;;25501:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25621:8;25576:18;:32;25595:12;:10;:12::i;:::-;25576:32;;;;;;;;;;;;;;;:42;25609:8;25576:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25674:8;25645:48;;25660:12;:10;:12::i;:::-;25645:48;;;25684:8;25645:48;;;;;;:::i;:::-;;;;;;;;25406:295;;:::o;26601:285::-;26733:41;26752:12;:10;:12::i;:::-;26766:7;26733:18;:41::i;:::-;26725:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26839:39;26853:4;26859:2;26863:7;26872:5;26839:13;:39::i;:::-;26601:285;;;;:::o;42136:339::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38145:1:::1;38742:7;;:19;;38734:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38145:1;38875:7;:18;;;;42358:5:::2;42337:26;;:17;42345:8;42337:7;:17::i;:::-;:26;;;42315:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42458:9;42425:15;:25;42441:8;42425:25;;;;;;;;;;;:30;42451:3;42425:30;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;38101:1:::1;39054:7;:22;;;;42136:339:::0;;;;:::o;34929:679::-;35002:13;35036:16;35044:7;35036;:16::i;:::-;35028:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;35119:23;35145:10;:19;35156:7;35145:19;;;;;;;;;;;35119:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35175:18;35196:10;:8;:10::i;:::-;35175:31;;35304:1;35288:4;35282:18;:23;35278:72;;;35329:9;35322:16;;;;;;35278:72;35480:1;35460:9;35454:23;:27;35450:108;;;35529:4;35535:9;35512:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35498:48;;;;;;35450:108;35577:23;35592:7;35577:14;:23::i;:::-;35570:30;;;;34929:679;;;;:::o;25772:164::-;25869:4;25893:18;:25;25912:5;25893:25;;;;;;;;;;;;;;;:35;25919:8;25893:35;;;;;;;;;;;;;;;;;;;;;;;;;25886:42;;25772:164;;;;:::o;3096:244::-;2373:12;:10;:12::i;:::-;2362:23;;:7;:5;:7::i;:::-;:23;;;2354:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3205:1:::1;3185:22;;:8;:22;;;;3177:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3295:8;3266:38;;3287:6;::::0;::::1;;;;;;;;3266:38;;;;;;;;;;;;3324:8;3315:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3096:244:::0;:::o;21258:157::-;21343:4;21382:25;21367:40;;;:11;:40;;;;21360:47;;21258:157;;;:::o;725:98::-;778:7;805:10;798:17;;725:98;:::o;43514:340::-;43664:13;43759:4;;43806:13;;43724:110;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43696:150;;43514:340;;;;;;:::o;35764:217::-;35864:16;35872:7;35864;:16::i;:::-;35856:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35964:9;35942:10;:19;35953:7;35942:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;35764:217;;:::o;28353:127::-;28418:4;28470:1;28442:30;;:7;:16;28450:7;28442:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28435:37;;28353:127;;;:::o;32230:174::-;32332:2;32305:15;:24;32321:7;32305:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32388:7;32384:2;32350:46;;32359:23;32374:7;32359:14;:23::i;:::-;32350:46;;;;;;;;;;;;32230:174;;:::o;28647:348::-;28740:4;28765:16;28773:7;28765;:16::i;:::-;28757:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28841:13;28857:23;28872:7;28857:14;:23::i;:::-;28841:39;;28910:5;28899:16;;:7;:16;;;:51;;;;28943:7;28919:31;;:20;28931:7;28919:11;:20::i;:::-;:31;;;28899:51;:87;;;;28954:32;28971:5;28978:7;28954:16;:32::i;:::-;28899:87;28891:96;;;28647:348;;;;:::o;31568:544::-;31693:4;31666:31;;:23;31681:7;31666:14;:23::i;:::-;:31;;;31658:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31776:1;31762:16;;:2;:16;;;;31754:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31832:39;31853:4;31859:2;31863:7;31832:20;:39::i;:::-;31936:29;31953:1;31957:7;31936:8;:29::i;:::-;31997:1;31978:9;:15;31988:4;31978:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32026:1;32009:9;:13;32019:2;32009:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32057:2;32038:7;:16;32046:7;32038:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32096:7;32092:2;32077:27;;32086:4;32077:27;;;;;;;;;;;;31568:544;;;:::o;36210:206::-;36279:20;36291:7;36279:11;:20::i;:::-;36353:1;36322:10;:19;36333:7;36322:19;;;;;;;;;;;36316:33;;;;;:::i;:::-;;;:38;36312:97;;36378:10;:19;36389:7;36378:19;;;;;;;;;;;;36371:26;;;;:::i;:::-;36312:97;36210:206;:::o;29337:110::-;29413:26;29423:2;29427:7;29413:26;;;;;;;;;;;;:9;:26::i;:::-;29337:110;;:::o;27768:272::-;27882:28;27892:4;27898:2;27902:7;27882:9;:28::i;:::-;27929:48;27952:4;27958:2;27962:7;27971:5;27929:22;:48::i;:::-;27921:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27768:272;;;;:::o;24494:94::-;24545:13;24571:9;;;;;;;;;;;;;;24494:94;:::o;23997:360::-;24070:13;24104:16;24112:7;24104;:16::i;:::-;24096:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24185:21;24209:10;:8;:10::i;:::-;24185:34;;24261:1;24243:7;24237:21;:25;:112;;;;;;;;;;;;;;;;;24302:7;24311:18;:7;:16;:18::i;:::-;24285:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24237:112;24230:119;;;23997:360;;;:::o;42828:438::-;43085:1;43068:19;;:5;:19;;;;:40;;;;;43106:1;43091:17;;:3;:17;;;;43068:40;43065:194;;;43151:15;:25;43167:8;43151:25;;;;;;;;;;;:30;43177:3;43151:30;;;;;;;;;;;;;;;;;;;;;;;;;43125:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;43065:194;42828:438;;;:::o;30871:360::-;30931:13;30947:23;30962:7;30947:14;:23::i;:::-;30931:39;;30983:48;31004:5;31019:1;31023:7;30983:20;:48::i;:::-;31072:29;31089:1;31093:7;31072:8;:29::i;:::-;31134:1;31114:9;:16;31124:5;31114:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31153:7;:16;31161:7;31153:16;;;;;;;;;;;;31146:23;;;;;;;;;;;31215:7;31211:1;31187:36;;31196:5;31187:36;;;;;;;;;;;;30871:360;;:::o;29674:250::-;29770:18;29776:2;29780:7;29770:5;:18::i;:::-;29807:54;29838:1;29842:2;29846:7;29855:5;29807:22;:54::i;:::-;29799:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;29674:250;;;:::o;32969:843::-;33090:4;33116:15;:2;:13;;;:15::i;:::-;33112:693;;;33168:2;33152:36;;;33189:12;:10;:12::i;:::-;33203:4;33209:7;33218:5;33152:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33148:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33415:1;33398:6;:13;:18;33394:341;;;33441:60;;;;;;;;;;:::i;:::-;;;;;;;;33394:341;33685:6;33679:13;33670:6;33666:2;33662:15;33655:38;33148:602;33285:45;;;33275:55;;;:6;:55;;;;33268:62;;;;;33112:693;33789:4;33782:11;;32969:843;;;;;;;:::o;18730:723::-;18786:13;19016:1;19007:5;:10;19003:53;;;19034:10;;;;;;;;;;;;;;;;;;;;;19003:53;19066:12;19081:5;19066:20;;19097:14;19122:78;19137:1;19129:4;:9;19122:78;;19155:8;;;;;:::i;:::-;;;;19186:2;19178:10;;;;;:::i;:::-;;;19122:78;;;19210:19;19242:6;19232:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19210:39;;19260:154;19276:1;19267:5;:10;19260:154;;19304:1;19294:11;;;;;:::i;:::-;;;19371:2;19363:5;:10;;;;:::i;:::-;19350:2;:24;;;;:::i;:::-;19337:39;;19320:6;19327;19320:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;19400:2;19391:11;;;;;:::i;:::-;;;19260:154;;;19438:6;19424:21;;;;;18730:723;;;;:::o;30260:382::-;30354:1;30340:16;;:2;:16;;;;30332:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30413:16;30421:7;30413;:16::i;:::-;30412:17;30404:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30475:45;30504:1;30508:2;30512:7;30475:20;:45::i;:::-;30550:1;30533:9;:13;30543:2;30533:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30581:2;30562:7;:16;30570:7;30562:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30626:7;30622:2;30601:33;;30618:1;30601:33;;;;;;;;;;;;30260:382;;:::o;11189:422::-;11249:4;11457:12;11568:7;11556:20;11548:28;;11602:1;11595:4;:8;11588:15;;;11189:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1233:352::-;;;1351:3;1344:4;1336:6;1332:17;1328:27;1318:2;;1369:1;1366;1359:12;1318:2;1405:6;1392:20;1382:30;;1435:18;1427:6;1424:30;1421:2;;;1467:1;1464;1457:12;1421:2;1504:4;1496:6;1492:17;1480:29;;1558:3;1550:4;1542:6;1538:17;1528:8;1524:32;1521:41;1518:2;;;1575:1;1572;1565:12;1518:2;1308:277;;;;;:::o;1591:139::-;;1675:6;1662:20;1653:29;;1691:33;1718:5;1691:33;:::i;:::-;1643:87;;;;:::o;1736:262::-;;1844:2;1832:9;1823:7;1819:23;1815:32;1812:2;;;1860:1;1857;1850:12;1812:2;1903:1;1928:53;1973:7;1964:6;1953:9;1949:22;1928:53;:::i;:::-;1918:63;;1874:117;1802:196;;;;:::o;2004:407::-;;;2129:2;2117:9;2108:7;2104:23;2100:32;2097:2;;;2145:1;2142;2135:12;2097:2;2188:1;2213:53;2258:7;2249:6;2238:9;2234:22;2213:53;:::i;:::-;2203:63;;2159:117;2315:2;2341:53;2386:7;2377:6;2366:9;2362:22;2341:53;:::i;:::-;2331:63;;2286:118;2087:324;;;;;:::o;2417:552::-;;;;2559:2;2547:9;2538:7;2534:23;2530:32;2527:2;;;2575:1;2572;2565:12;2527:2;2618:1;2643:53;2688:7;2679:6;2668:9;2664:22;2643:53;:::i;:::-;2633:63;;2589:117;2745:2;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;:::i;:::-;2761:63;;2716:118;2873:2;2899:53;2944:7;2935:6;2924:9;2920:22;2899:53;:::i;:::-;2889:63;;2844:118;2517:452;;;;;:::o;2975:692::-;;;;;3131:3;3119:9;3110:7;3106:23;3102:33;3099:2;;;3148:1;3145;3138:12;3099:2;3191:1;3216:53;3261:7;3252:6;3241:9;3237:22;3216:53;:::i;:::-;3206:63;;3162:117;3318:2;3344:53;3389:7;3380:6;3369:9;3365:22;3344:53;:::i;:::-;3334:63;;3289:118;3446:2;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3417:118;3574:2;3600:50;3642:7;3633:6;3622:9;3618:22;3600:50;:::i;:::-;3590:60;;3545:115;3089:578;;;;;;;:::o;3673:809::-;;;;;3841:3;3829:9;3820:7;3816:23;3812:33;3809:2;;;3858:1;3855;3848:12;3809:2;3901:1;3926:53;3971:7;3962:6;3951:9;3947:22;3926:53;:::i;:::-;3916:63;;3872:117;4028:2;4054:53;4099:7;4090:6;4079:9;4075:22;4054:53;:::i;:::-;4044:63;;3999:118;4156:2;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4127:118;4312:2;4301:9;4297:18;4284:32;4343:18;4335:6;4332:30;4329:2;;;4375:1;4372;4365:12;4329:2;4403:62;4457:7;4448:6;4437:9;4433:22;4403:62;:::i;:::-;4393:72;;4255:220;3799:683;;;;;;;:::o;4488:401::-;;;4610:2;4598:9;4589:7;4585:23;4581:32;4578:2;;;4626:1;4623;4616:12;4578:2;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:50;4864:7;4855:6;4844:9;4840:22;4822:50;:::i;:::-;4812:60;;4767:115;4568:321;;;;;:::o;4895:407::-;;;5020:2;5008:9;4999:7;4995:23;4991:32;4988:2;;;5036:1;5033;5026:12;4988:2;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;5206:2;5232:53;5277:7;5268:6;5257:9;5253:22;5232:53;:::i;:::-;5222:63;;5177:118;4978:324;;;;;:::o;5308:260::-;;5415:2;5403:9;5394:7;5390:23;5386:32;5383:2;;;5431:1;5428;5421:12;5383:2;5474:1;5499:52;5543:7;5534:6;5523:9;5519:22;5499:52;:::i;:::-;5489:62;;5445:116;5373:195;;;;:::o;5574:282::-;;5692:2;5680:9;5671:7;5667:23;5663:32;5660:2;;;5708:1;5705;5698:12;5660:2;5751:1;5776:63;5831:7;5822:6;5811:9;5807:22;5776:63;:::i;:::-;5766:73;;5722:127;5650:206;;;;:::o;5862:818::-;;;;;;6044:2;6032:9;6023:7;6019:23;6015:32;6012:2;;;6060:1;6057;6050:12;6012:2;6131:1;6120:9;6116:17;6103:31;6161:18;6153:6;6150:30;6147:2;;;6193:1;6190;6183:12;6147:2;6229:65;6286:7;6277:6;6266:9;6262:22;6229:65;:::i;:::-;6211:83;;;;6074:230;6371:2;6360:9;6356:18;6343:32;6402:18;6394:6;6391:30;6388:2;;;6434:1;6431;6424:12;6388:2;6470:65;6527:7;6518:6;6507:9;6503:22;6470:65;:::i;:::-;6452:83;;;;6314:231;6584:2;6610:53;6655:7;6646:6;6635:9;6631:22;6610:53;:::i;:::-;6600:63;;6555:118;6002:678;;;;;;;;:::o;6686:262::-;;6794:2;6782:9;6773:7;6769:23;6765:32;6762:2;;;6810:1;6807;6800:12;6762:2;6853:1;6878:53;6923:7;6914:6;6903:9;6899:22;6878:53;:::i;:::-;6868:63;;6824:117;6752:196;;;;:::o;6954:818::-;;;;;;7136:2;7124:9;7115:7;7111:23;7107:32;7104:2;;;7152:1;7149;7142:12;7104:2;7195:1;7220:53;7265:7;7256:6;7245:9;7241:22;7220:53;:::i;:::-;7210:63;;7166:117;7350:2;7339:9;7335:18;7322:32;7381:18;7373:6;7370:30;7367:2;;;7413:1;7410;7403:12;7367:2;7449:65;7506:7;7497:6;7486:9;7482:22;7449:65;:::i;:::-;7431:83;;;;7293:231;7591:2;7580:9;7576:18;7563:32;7622:18;7614:6;7611:30;7608:2;;;7654:1;7651;7644:12;7608:2;7690:65;7747:7;7738:6;7727:9;7723:22;7690:65;:::i;:::-;7672:83;;;;7534:231;7094:678;;;;;;;;:::o;7778:118::-;7865:24;7883:5;7865:24;:::i;:::-;7860:3;7853:37;7843:53;;:::o;7902:109::-;7983:21;7998:5;7983:21;:::i;:::-;7978:3;7971:34;7961:50;;:::o;8017:360::-;;8131:38;8163:5;8131:38;:::i;:::-;8185:70;8248:6;8243:3;8185:70;:::i;:::-;8178:77;;8264:52;8309:6;8304:3;8297:4;8290:5;8286:16;8264:52;:::i;:::-;8341:29;8363:6;8341:29;:::i;:::-;8336:3;8332:39;8325:46;;8107:270;;;;;:::o;8407:317::-;;8544:89;8626:6;8621:3;8544:89;:::i;:::-;8537:96;;8643:43;8679:6;8674:3;8667:5;8643:43;:::i;:::-;8711:6;8706:3;8702:16;8695:23;;8527:197;;;;;:::o;8730:364::-;;8846:39;8879:5;8846:39;:::i;:::-;8901:71;8965:6;8960:3;8901:71;:::i;:::-;8894:78;;8981:52;9026:6;9021:3;9014:4;9007:5;9003:16;8981:52;:::i;:::-;9058:29;9080:6;9058:29;:::i;:::-;9053:3;9049:39;9042:46;;8822:272;;;;;:::o;9100:377::-;;9234:39;9267:5;9234:39;:::i;:::-;9289:89;9371:6;9366:3;9289:89;:::i;:::-;9282:96;;9387:52;9432:6;9427:3;9420:4;9413:5;9409:16;9387:52;:::i;:::-;9464:6;9459:3;9455:16;9448:23;;9210:267;;;;;:::o;9483:321::-;;9646:67;9710:2;9705:3;9646:67;:::i;:::-;9639:74;;9743:25;9739:1;9734:3;9730:11;9723:46;9795:2;9790:3;9786:12;9779:19;;9629:175;;;:::o;9810:382::-;;9973:67;10037:2;10032:3;9973:67;:::i;:::-;9966:74;;10070:34;10066:1;10061:3;10057:11;10050:55;10136:20;10131:2;10126:3;10122:12;10115:42;10183:2;10178:3;10174:12;10167:19;;9956:236;;;:::o;10198:370::-;;10361:67;10425:2;10420:3;10361:67;:::i;:::-;10354:74;;10458:34;10454:1;10449:3;10445:11;10438:55;10524:8;10519:2;10514:3;10510:12;10503:30;10559:2;10554:3;10550:12;10543:19;;10344:224;;;:::o;10574:326::-;;10737:67;10801:2;10796:3;10737:67;:::i;:::-;10730:74;;10834:30;10830:1;10825:3;10821:11;10814:51;10891:2;10886:3;10882:12;10875:19;;10720:180;;;:::o;10906:368::-;;11069:67;11133:2;11128:3;11069:67;:::i;:::-;11062:74;;11166:34;11162:1;11157:3;11153:11;11146:55;11232:6;11227:2;11222:3;11218:12;11211:28;11265:2;11260:3;11256:12;11249:19;;11052:222;;;:::o;11280:323::-;;11443:67;11507:2;11502:3;11443:67;:::i;:::-;11436:74;;11540:27;11536:1;11531:3;11527:11;11520:48;11594:2;11589:3;11585:12;11578:19;;11426:177;;;:::o;11609:376::-;;11772:67;11836:2;11831:3;11772:67;:::i;:::-;11765:74;;11869:34;11865:1;11860:3;11856:11;11849:55;11935:14;11930:2;11925:3;11921:12;11914:36;11976:2;11971:3;11967:12;11960:19;;11755:230;;;:::o;11991:388::-;;12154:67;12218:2;12213:3;12154:67;:::i;:::-;12147:74;;12251:34;12247:1;12242:3;12238:11;12231:55;12317:26;12312:2;12307:3;12303:12;12296:48;12370:2;12365:3;12361:12;12354:19;;12137:242;;;:::o;12385:328::-;;12548:67;12612:2;12607:3;12548:67;:::i;:::-;12541:74;;12645:32;12641:1;12636:3;12632:11;12625:53;12704:2;12699:3;12695:12;12688:19;;12531:182;;;:::o;12719:374::-;;12882:67;12946:2;12941:3;12882:67;:::i;:::-;12875:74;;12979:34;12975:1;12970:3;12966:11;12959:55;13045:12;13040:2;13035:3;13031:12;13024:34;13084:2;13079:3;13075:12;13068:19;;12865:228;;;:::o;13099:373::-;;13262:67;13326:2;13321:3;13262:67;:::i;:::-;13255:74;;13359:34;13355:1;13350:3;13346:11;13339:55;13425:11;13420:2;13415:3;13411:12;13404:33;13463:2;13458:3;13454:12;13447:19;;13245:227;;;:::o;13478:378::-;;13641:67;13705:2;13700:3;13641:67;:::i;:::-;13634:74;;13738:34;13734:1;13729:3;13725:11;13718:55;13804:16;13799:2;13794:3;13790:12;13783:38;13847:2;13842:3;13838:12;13831:19;;13624:232;;;:::o;13862:330::-;;14025:67;14089:2;14084:3;14025:67;:::i;:::-;14018:74;;14122:34;14118:1;14113:3;14109:11;14102:55;14183:2;14178:3;14174:12;14167:19;;14008:184;;;:::o;14198:381::-;;14361:67;14425:2;14420:3;14361:67;:::i;:::-;14354:74;;14458:34;14454:1;14449:3;14445:11;14438:55;14524:19;14519:2;14514:3;14510:12;14503:41;14570:2;14565:3;14561:12;14554:19;;14344:235;;;:::o;14585:376::-;;14748:67;14812:2;14807:3;14748:67;:::i;:::-;14741:74;;14845:34;14841:1;14836:3;14832:11;14825:55;14911:14;14906:2;14901:3;14897:12;14890:36;14952:2;14947:3;14943:12;14936:19;;14731:230;;;:::o;14967:333::-;;15148:84;15230:1;15225:3;15148:84;:::i;:::-;15141:91;;15262:3;15258:1;15253:3;15249:11;15242:24;15292:1;15287:3;15283:11;15276:18;;15131:169;;;:::o;15306:330::-;;15469:67;15533:2;15528:3;15469:67;:::i;:::-;15462:74;;15566:34;15562:1;15557:3;15553:11;15546:55;15627:2;15622:3;15618:12;15611:19;;15452:184;;;:::o;15642:373::-;;15805:67;15869:2;15864:3;15805:67;:::i;:::-;15798:74;;15902:34;15898:1;15893:3;15889:11;15882:55;15968:11;15963:2;15958:3;15954:12;15947:33;16006:2;16001:3;15997:12;15990:19;;15788:227;;;:::o;16021:379::-;;16184:67;16248:2;16243:3;16184:67;:::i;:::-;16177:74;;16281:34;16277:1;16272:3;16268:11;16261:55;16347:17;16342:2;16337:3;16333:12;16326:39;16391:2;16386:3;16382:12;16375:19;;16167:233;;;:::o;16406:365::-;;16569:67;16633:2;16628:3;16569:67;:::i;:::-;16562:74;;16666:34;16662:1;16657:3;16653:11;16646:55;16732:3;16727:2;16722:3;16718:12;16711:25;16762:2;16757:3;16753:12;16746:19;;16552:219;;;:::o;16777:263::-;;16940:66;17004:1;16999:3;16940:66;:::i;:::-;16933:73;;17032:1;17027:3;17023:11;17016:18;;16923:117;;;:::o;17046:381::-;;17209:67;17273:2;17268:3;17209:67;:::i;:::-;17202:74;;17306:34;17302:1;17297:3;17293:11;17286:55;17372:19;17367:2;17362:3;17358:12;17351:41;17418:2;17413:3;17409:12;17402:19;;17192:235;;;:::o;17433:329::-;;17596:67;17660:2;17655:3;17596:67;:::i;:::-;17589:74;;17693:33;17689:1;17684:3;17680:11;17673:54;17753:2;17748:3;17744:12;17737:19;;17579:183;;;:::o;17768:118::-;17855:24;17873:5;17855:24;:::i;:::-;17850:3;17843:37;17833:53;;:::o;17892:741::-;;18215:105;18316:3;18307:6;18299;18215:105;:::i;:::-;18208:112;;18337:148;18481:3;18337:148;:::i;:::-;18330:155;;18502:105;18603:3;18594:6;18586;18502:105;:::i;:::-;18495:112;;18624:3;18617:10;;18197:436;;;;;;;:::o;18639:435::-;;18841:95;18932:3;18923:6;18841:95;:::i;:::-;18834:102;;18953:95;19044:3;19035:6;18953:95;:::i;:::-;18946:102;;19065:3;19058:10;;18823:251;;;;;:::o;19080:222::-;;19211:2;19200:9;19196:18;19188:26;;19224:71;19292:1;19281:9;19277:17;19268:6;19224:71;:::i;:::-;19178:124;;;;:::o;19308:640::-;;19541:3;19530:9;19526:19;19518:27;;19555:71;19623:1;19612:9;19608:17;19599:6;19555:71;:::i;:::-;19636:72;19704:2;19693:9;19689:18;19680:6;19636:72;:::i;:::-;19718;19786:2;19775:9;19771:18;19762:6;19718:72;:::i;:::-;19837:9;19831:4;19827:20;19822:2;19811:9;19807:18;19800:48;19865:76;19936:4;19927:6;19865:76;:::i;:::-;19857:84;;19508:440;;;;;;;:::o;19954:210::-;;20079:2;20068:9;20064:18;20056:26;;20092:65;20154:1;20143:9;20139:17;20130:6;20092:65;:::i;:::-;20046:118;;;;:::o;20170:612::-;;20391:2;20380:9;20376:18;20368:26;;20404:65;20466:1;20455:9;20451:17;20442:6;20404:65;:::i;:::-;20516:9;20510:4;20506:20;20501:2;20490:9;20486:18;20479:48;20544:78;20617:4;20608:6;20544:78;:::i;:::-;20536:86;;20669:9;20663:4;20659:20;20654:2;20643:9;20639:18;20632:48;20697:78;20770:4;20761:6;20697:78;:::i;:::-;20689:86;;20358:424;;;;;;:::o;20788:718::-;;21062:2;21051:9;21047:18;21039:26;;21075:65;21137:1;21126:9;21122:17;21113:6;21075:65;:::i;:::-;21187:9;21181:4;21177:20;21172:2;21161:9;21157:18;21150:48;21215:131;21341:4;21215:131;:::i;:::-;21207:139;;21393:9;21387:4;21383:20;21378:2;21367:9;21363:18;21356:48;21421:78;21494:4;21485:6;21421:78;:::i;:::-;21413:86;;21029:477;;;;;:::o;21512:313::-;;21663:2;21652:9;21648:18;21640:26;;21712:9;21706:4;21702:20;21698:1;21687:9;21683:17;21676:47;21740:78;21813:4;21804:6;21740:78;:::i;:::-;21732:86;;21630:195;;;;:::o;21831:419::-;;22035:2;22024:9;22020:18;22012:26;;22084:9;22078:4;22074:20;22070:1;22059:9;22055:17;22048:47;22112:131;22238:4;22112:131;:::i;:::-;22104:139;;22002:248;;;:::o;22256:419::-;;22460:2;22449:9;22445:18;22437:26;;22509:9;22503:4;22499:20;22495:1;22484:9;22480:17;22473:47;22537:131;22663:4;22537:131;:::i;:::-;22529:139;;22427:248;;;:::o;22681:419::-;;22885:2;22874:9;22870:18;22862:26;;22934:9;22928:4;22924:20;22920:1;22909:9;22905:17;22898:47;22962:131;23088:4;22962:131;:::i;:::-;22954:139;;22852:248;;;:::o;23106:419::-;;23310:2;23299:9;23295:18;23287:26;;23359:9;23353:4;23349:20;23345:1;23334:9;23330:17;23323:47;23387:131;23513:4;23387:131;:::i;:::-;23379:139;;23277:248;;;:::o;23531:419::-;;23735:2;23724:9;23720:18;23712:26;;23784:9;23778:4;23774:20;23770:1;23759:9;23755:17;23748:47;23812:131;23938:4;23812:131;:::i;:::-;23804:139;;23702:248;;;:::o;23956:419::-;;24160:2;24149:9;24145:18;24137:26;;24209:9;24203:4;24199:20;24195:1;24184:9;24180:17;24173:47;24237:131;24363:4;24237:131;:::i;:::-;24229:139;;24127:248;;;:::o;24381:419::-;;24585:2;24574:9;24570:18;24562:26;;24634:9;24628:4;24624:20;24620:1;24609:9;24605:17;24598:47;24662:131;24788:4;24662:131;:::i;:::-;24654:139;;24552:248;;;:::o;24806:419::-;;25010:2;24999:9;24995:18;24987:26;;25059:9;25053:4;25049:20;25045:1;25034:9;25030:17;25023:47;25087:131;25213:4;25087:131;:::i;:::-;25079:139;;24977:248;;;:::o;25231:419::-;;25435:2;25424:9;25420:18;25412:26;;25484:9;25478:4;25474:20;25470:1;25459:9;25455:17;25448:47;25512:131;25638:4;25512:131;:::i;:::-;25504:139;;25402:248;;;:::o;25656:419::-;;25860:2;25849:9;25845:18;25837:26;;25909:9;25903:4;25899:20;25895:1;25884:9;25880:17;25873:47;25937:131;26063:4;25937:131;:::i;:::-;25929:139;;25827:248;;;:::o;26081:419::-;;26285:2;26274:9;26270:18;26262:26;;26334:9;26328:4;26324:20;26320:1;26309:9;26305:17;26298:47;26362:131;26488:4;26362:131;:::i;:::-;26354:139;;26252:248;;;:::o;26506:419::-;;26710:2;26699:9;26695:18;26687:26;;26759:9;26753:4;26749:20;26745:1;26734:9;26730:17;26723:47;26787:131;26913:4;26787:131;:::i;:::-;26779:139;;26677:248;;;:::o;26931:419::-;;27135:2;27124:9;27120:18;27112:26;;27184:9;27178:4;27174:20;27170:1;27159:9;27155:17;27148:47;27212:131;27338:4;27212:131;:::i;:::-;27204:139;;27102:248;;;:::o;27356:419::-;;27560:2;27549:9;27545:18;27537:26;;27609:9;27603:4;27599:20;27595:1;27584:9;27580:17;27573:47;27637:131;27763:4;27637:131;:::i;:::-;27629:139;;27527:248;;;:::o;27781:419::-;;27985:2;27974:9;27970:18;27962:26;;28034:9;28028:4;28024:20;28020:1;28009:9;28005:17;27998:47;28062:131;28188:4;28062:131;:::i;:::-;28054:139;;27952:248;;;:::o;28206:419::-;;28410:2;28399:9;28395:18;28387:26;;28459:9;28453:4;28449:20;28445:1;28434:9;28430:17;28423:47;28487:131;28613:4;28487:131;:::i;:::-;28479:139;;28377:248;;;:::o;28631:419::-;;28835:2;28824:9;28820:18;28812:26;;28884:9;28878:4;28874:20;28870:1;28859:9;28855:17;28848:47;28912:131;29038:4;28912:131;:::i;:::-;28904:139;;28802:248;;;:::o;29056:419::-;;29260:2;29249:9;29245:18;29237:26;;29309:9;29303:4;29299:20;29295:1;29284:9;29280:17;29273:47;29337:131;29463:4;29337:131;:::i;:::-;29329:139;;29227:248;;;:::o;29481:419::-;;29685:2;29674:9;29670:18;29662:26;;29734:9;29728:4;29724:20;29720:1;29709:9;29705:17;29698:47;29762:131;29888:4;29762:131;:::i;:::-;29754:139;;29652:248;;;:::o;29906:419::-;;30110:2;30099:9;30095:18;30087:26;;30159:9;30153:4;30149:20;30145:1;30134:9;30130:17;30123:47;30187:131;30313:4;30187:131;:::i;:::-;30179:139;;30077:248;;;:::o;30331:419::-;;30535:2;30524:9;30520:18;30512:26;;30584:9;30578:4;30574:20;30570:1;30559:9;30555:17;30548:47;30612:131;30738:4;30612:131;:::i;:::-;30604:139;;30502:248;;;:::o;30756:222::-;;30887:2;30876:9;30872:18;30864:26;;30900:71;30968:1;30957:9;30953:17;30944:6;30900:71;:::i;:::-;30854:124;;;;:::o;30984:283::-;;31050:2;31044:9;31034:19;;31092:4;31084:6;31080:17;31199:6;31187:10;31184:22;31163:18;31151:10;31148:34;31145:62;31142:2;;;31210:18;;:::i;:::-;31142:2;31250:10;31246:2;31239:22;31024:243;;;;:::o;31273:331::-;;31424:18;31416:6;31413:30;31410:2;;;31446:18;;:::i;:::-;31410:2;31531:4;31527:9;31520:4;31512:6;31508:17;31504:33;31496:41;;31592:4;31586;31582:15;31574:23;;31339:265;;;:::o;31610:98::-;;31695:5;31689:12;31679:22;;31668:40;;;:::o;31714:99::-;;31800:5;31794:12;31784:22;;31773:40;;;:::o;31819:168::-;;31936:6;31931:3;31924:19;31976:4;31971:3;31967:14;31952:29;;31914:73;;;;:::o;31993:169::-;;32111:6;32106:3;32099:19;32151:4;32146:3;32142:14;32127:29;;32089:73;;;;:::o;32168:148::-;;32307:3;32292:18;;32282:34;;;;:::o;32322:305::-;;32381:20;32399:1;32381:20;:::i;:::-;32376:25;;32415:20;32433:1;32415:20;:::i;:::-;32410:25;;32569:1;32501:66;32497:74;32494:1;32491:81;32488:2;;;32575:18;;:::i;:::-;32488:2;32619:1;32616;32612:9;32605:16;;32366:261;;;;:::o;32633:185::-;;32690:20;32708:1;32690:20;:::i;:::-;32685:25;;32724:20;32742:1;32724:20;:::i;:::-;32719:25;;32763:1;32753:2;;32768:18;;:::i;:::-;32753:2;32810:1;32807;32803:9;32798:14;;32675:143;;;;:::o;32824:191::-;;32884:20;32902:1;32884:20;:::i;:::-;32879:25;;32918:20;32936:1;32918:20;:::i;:::-;32913:25;;32957:1;32954;32951:8;32948:2;;;32962:18;;:::i;:::-;32948:2;33007:1;33004;33000:9;32992:17;;32869:146;;;;:::o;33021:96::-;;33087:24;33105:5;33087:24;:::i;:::-;33076:35;;33066:51;;;:::o;33123:90::-;;33200:5;33193:13;33186:21;33175:32;;33165:48;;;:::o;33219:149::-;;33295:66;33288:5;33284:78;33273:89;;33263:105;;;:::o;33374:126::-;;33451:42;33444:5;33440:54;33429:65;;33419:81;;;:::o;33506:77::-;;33572:5;33561:16;;33551:32;;;:::o;33589:154::-;33673:6;33668:3;33663;33650:30;33735:1;33726:6;33721:3;33717:16;33710:27;33640:103;;;:::o;33749:307::-;33817:1;33827:113;33841:6;33838:1;33835:13;33827:113;;;33926:1;33921:3;33917:11;33911:18;33907:1;33902:3;33898:11;33891:39;33863:2;33860:1;33856:10;33851:15;;33827:113;;;33958:6;33955:1;33952:13;33949:2;;;34038:1;34029:6;34024:3;34020:16;34013:27;33949:2;33798:258;;;;:::o;34062:320::-;;34143:1;34137:4;34133:12;34123:22;;34190:1;34184:4;34180:12;34211:18;34201:2;;34267:4;34259:6;34255:17;34245:27;;34201:2;34329;34321:6;34318:14;34298:18;34295:38;34292:2;;;34348:18;;:::i;:::-;34292:2;34113:269;;;;:::o;34388:233::-;;34450:24;34468:5;34450:24;:::i;:::-;34441:33;;34496:66;34489:5;34486:77;34483:2;;;34566:18;;:::i;:::-;34483:2;34613:1;34606:5;34602:13;34595:20;;34431:190;;;:::o;34627:176::-;;34676:20;34694:1;34676:20;:::i;:::-;34671:25;;34710:20;34728:1;34710:20;:::i;:::-;34705:25;;34749:1;34739:2;;34754:18;;:::i;:::-;34739:2;34795:1;34792;34788:9;34783:14;;34661:142;;;;:::o;34809:180::-;34857:77;34854:1;34847:88;34954:4;34951:1;34944:15;34978:4;34975:1;34968:15;34995:180;35043:77;35040:1;35033:88;35140:4;35137:1;35130:15;35164:4;35161:1;35154:15;35181:180;35229:77;35226:1;35219:88;35326:4;35323:1;35316:15;35350:4;35347:1;35340:15;35367:180;35415:77;35412:1;35405:88;35512:4;35509:1;35502:15;35536:4;35533:1;35526:15;35553:102;;35645:2;35641:7;35636:2;35629:5;35625:14;35621:28;35611:38;;35601:54;;;:::o;35661:122::-;35734:24;35752:5;35734:24;:::i;:::-;35727:5;35724:35;35714:2;;35773:1;35770;35763:12;35714:2;35704:79;:::o;35789:116::-;35859:21;35874:5;35859:21;:::i;:::-;35852:5;35849:32;35839:2;;35895:1;35892;35885:12;35839:2;35829:76;:::o;35911:120::-;35983:23;36000:5;35983:23;:::i;:::-;35976:5;35973:34;35963:2;;36021:1;36018;36011:12;35963:2;35953:78;:::o;36037:122::-;36110:24;36128:5;36110:24;:::i;:::-;36103:5;36100:35;36090:2;;36149:1;36146;36139:12;36090:2;36080:79;:::o
Swarm Source
ipfs://cd9313b873d7621bd25d4e21a9f775471c3b8d9966569cf00481c60d9342449c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.