Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 1221888 | 22 days ago | IN | 0 S | 0.00014627 | ||||
Set Paused | 1221887 | 22 days ago | IN | 0 S | 0.00002663 | ||||
Set Paused | 1221856 | 22 days ago | IN | 0 S | 0.00005073 | ||||
Mint | 1221732 | 22 days ago | IN | 0 S | 0.00014627 | ||||
Set Paused | 1221730 | 22 days ago | IN | 0 S | 0.00002663 | ||||
Set Paused | 1221585 | 22 days ago | IN | 0 S | 0.00005073 | ||||
Mint | 1221178 | 22 days ago | IN | 0 S | 0.00034747 | ||||
Set Cost | 1220641 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220637 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220637 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220631 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220629 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220625 | 22 days ago | IN | 0 S | 0.00002903 | ||||
Set Cost | 1220622 | 22 days ago | IN | 0 S | 0.00002652 | ||||
Set Paused | 1220593 | 22 days ago | IN | 0 S | 0.00002914 | ||||
Set Paused | 1220592 | 22 days ago | IN | 0 S | 0.00002914 | ||||
Set Paused | 1220590 | 22 days ago | IN | 0 S | 0.00002914 | ||||
Set Paused | 1220586 | 22 days ago | IN | 0 S | 0.00002914 | ||||
Set Paused | 1220582 | 22 days ago | IN | 0 S | 0.00002914 | ||||
Mint | 1220427 | 22 days ago | IN | 0 S | 0.00027353 | ||||
Set Paused | 1220206 | 22 days ago | IN | 0 S | 0.00002663 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RoboMonkeys
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-22 */ // SPDX-License-Identifier: MIT // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @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: contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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 { _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 { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: contracts/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/RoboMonkeys.sol pragma solidity >=0.8.9 <0.9.0; contract RoboMonkeys is ERC721A, Ownable, ReentrancyGuard, OperatorFilterer { using Strings for uint256; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; uint256 public cost = 0.003 ether; uint256 public maxNFTs = 5000; uint256 public freeMintAmount = 1; uint256 public txnMax = 11; uint256 public maxMintAmount = 33; bool public paused = true; bool public revealed = false; constructor( string memory _tokenName, string memory _tokenSymbol ) ERC721A(_tokenName, _tokenSymbol) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), false) {} modifier mintCompliance(uint256 _mintAmount) { require(!paused, "Minting has not started."); require(_mintAmount > 0 && _mintAmount <= txnMax, "Maximum of 10 NFTs per txn!"); require(totalSupply() + _mintAmount <= maxNFTs, "No NFTs lefts!"); require(tx.origin == msg.sender, "No smart contract minting."); require( _mintAmount > 0 && numberMinted(msg.sender) + _mintAmount <= maxMintAmount, "You have minted max number of NFTs!" ); _; } modifier mintPriceCompliance(uint256 _mintAmount) { uint256 realCost = 0; if (numberMinted(msg.sender) < freeMintAmount) { uint256 freeMintsLeft = freeMintAmount - numberMinted(msg.sender); realCost = cost * freeMintsLeft; } require(msg.value >= cost * _mintAmount - realCost, "Insufficient/incorrect funds."); _; } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxNFTs, "Max supply exceeded!"); _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner { maxMintAmount = _maxMintAmount; } function withdraw() public onlyOwner nonReentrant { (bool withdrawFunds, ) = payable(owner()).call{value: address(this).balance}(""); require(withdrawFunds); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txnMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052805f815250600a90816100219190610641565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90816100669190610641565b50660aa87bee538000600d55611388600e556001600f55600b6010556021601155600160125f6101000a81548160ff0219169083151502179055505f601260016101000a81548160ff0219169083151502179055503480156100c6575f80fd5b5060405161481e38038061481e83398181016040528101906100e89190610830565b733cc6cdda760b79bafa08df41ecfa224f810dceb65f8383816002908161010f9190610641565b50806003908161011f9190610641565b5061012e61033560201b60201c565b5f81905550505061015161014661033d60201b60201c565b61034460201b60201c565b60016009819055505f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561032c578015610207576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016101d59291906108e5565b5f604051808303815f87803b1580156101ec575f80fd5b505af11580156101fe573d5f803e3d5ffd5b5050505061032b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146102b5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016102839291906108e5565b5f604051808303815f87803b15801561029a575f80fd5b505af11580156102ac573d5f803e3d5ffd5b5050505061032a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016102fc919061090c565b5f604051808303815f87803b158015610313575f80fd5b505af1158015610325573d5f803e3d5ffd5b505050505b5b5b50505050610925565b5f6001905090565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061048257607f821691505b6020821081036104955761049461043e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104bc565b61050186836104bc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61054561054061053b84610519565b610522565b610519565b9050919050565b5f819050919050565b61055e8361052b565b61057261056a8261054c565b8484546104c8565b825550505050565b5f90565b61058661057a565b610591818484610555565b505050565b5b818110156105b4576105a95f8261057e565b600181019050610597565b5050565b601f8211156105f9576105ca8161049b565b6105d3846104ad565b810160208510156105e2578190505b6105f66105ee856104ad565b830182610596565b50505b505050565b5f82821c905092915050565b5f6106195f19846008026105fe565b1980831691505092915050565b5f610631838361060a565b9150826002028217905092915050565b61064a82610407565b67ffffffffffffffff81111561066357610662610411565b5b61066d825461046b565b6106788282856105b8565b5f60209050601f8311600181146106a9575f8415610697578287015190505b6106a18582610626565b865550610708565b601f1984166106b78661049b565b5f5b828110156106de578489015182556001820191506020850194506020810190506106b9565b868310156106fb57848901516106f7601f89168261060a565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b61074282610729565b810181811067ffffffffffffffff8211171561076157610760610411565b5b80604052505050565b5f610773610710565b905061077f8282610739565b919050565b5f67ffffffffffffffff82111561079e5761079d610411565b5b6107a782610729565b9050602081019050919050565b8281835e5f83830152505050565b5f6107d46107cf84610784565b61076a565b9050828152602081018484840111156107f0576107ef610725565b5b6107fb8482856107b4565b509392505050565b5f82601f83011261081757610816610721565b5b81516108278482602086016107c2565b91505092915050565b5f806040838503121561084657610845610719565b5b5f83015167ffffffffffffffff8111156108635761086261071d565b5b61086f85828601610803565b925050602083015167ffffffffffffffff8111156108905761088f61071d565b5b61089c85828601610803565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108cf826108a6565b9050919050565b6108df816108c5565b82525050565b5f6040820190506108f85f8301856108d6565b61090560208301846108d6565b9392505050565b5f60208201905061091f5f8301846108d6565b92915050565b613eec806109325f395ff3fe60806040526004361061022f575f3560e01c80635503a0e81161012d578063a22cb465116100aa578063e0a808531161006e578063e0a80853146107e7578063e985e9c51461080f578063efbd73f41461084b578063f2fde38b14610873578063f9308cc51461089b5761022f565b8063a22cb465146106f5578063a45ba8e71461071d578063b88d4fde14610747578063c87b56dd1461076f578063dc33e681146107ab5761022f565b8063715018a6116100f1578063715018a6146106475780637ec4a6591461065d5780638da5cb5b1461068557806395d89b41146106af578063a0712d68146106d95761022f565b80635503a0e8146105515780635c975abb1461057b57806362b99ad4146105a55780636352211e146105cf57806370a082311461060b5761022f565b8063239c70ae116101bb57806342842e0e1161017f57806342842e0e1461048557806344a0d68a146104ad5780634e9e1ec6146104d55780634fdd43cb146104ff57806351830227146105275761022f565b8063239c70ae146103c957806323b872dd146103f35780633a467e3d1461041b5780633ccfd60b1461044557806341f434341461045b5761022f565b8063095ea7b311610202578063095ea7b3146102fd57806313faede61461032557806316ba10e01461034f57806316c38b3c1461037757806318160ddd1461039f5761022f565b806301ffc9a71461023357806306fdde031461026f578063081812fc14610299578063088a4ed0146102d5575b5f80fd5b34801561023e575f80fd5b5061025960048036038101906102549190612c08565b6108c5565b6040516102669190612c4d565b60405180910390f35b34801561027a575f80fd5b50610283610956565b6040516102909190612cd6565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba9190612d29565b6109e6565b6040516102cc9190612d93565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f69190612d29565b610a5e565b005b348015610308575f80fd5b50610323600480360381019061031e9190612dd6565b610ae4565b005b348015610330575f80fd5b50610339610afd565b6040516103469190612e23565b60405180910390f35b34801561035a575f80fd5b5061037560048036038101906103709190612f68565b610b03565b005b348015610382575f80fd5b5061039d60048036038101906103989190612fd9565b610b92565b005b3480156103aa575f80fd5b506103b3610c2a565b6040516103c09190612e23565b60405180910390f35b3480156103d4575f80fd5b506103dd610c3f565b6040516103ea9190612e23565b60405180910390f35b3480156103fe575f80fd5b5061041960048036038101906104149190613004565b610c45565b005b348015610426575f80fd5b5061042f610c94565b60405161043c9190612e23565b60405180910390f35b348015610450575f80fd5b50610459610c9a565b005b348015610466575f80fd5b5061046f610de6565b60405161047c91906130af565b60405180910390f35b348015610490575f80fd5b506104ab60048036038101906104a69190613004565b610df8565b005b3480156104b8575f80fd5b506104d360048036038101906104ce9190612d29565b610e47565b005b3480156104e0575f80fd5b506104e9610ecd565b6040516104f69190612e23565b60405180910390f35b34801561050a575f80fd5b5061052560048036038101906105209190612f68565b610ed3565b005b348015610532575f80fd5b5061053b610f62565b6040516105489190612c4d565b60405180910390f35b34801561055c575f80fd5b50610565610f75565b6040516105729190612cd6565b60405180910390f35b348015610586575f80fd5b5061058f611001565b60405161059c9190612c4d565b60405180910390f35b3480156105b0575f80fd5b506105b9611013565b6040516105c69190612cd6565b60405180910390f35b3480156105da575f80fd5b506105f560048036038101906105f09190612d29565b61109f565b6040516106029190612d93565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c91906130c8565b6110b0565b60405161063e9190612e23565b60405180910390f35b348015610652575f80fd5b5061065b611165565b005b348015610668575f80fd5b50610683600480360381019061067e9190612f68565b6111ec565b005b348015610690575f80fd5b5061069961127b565b6040516106a69190612d93565b60405180910390f35b3480156106ba575f80fd5b506106c36112a3565b6040516106d09190612cd6565b60405180910390f35b6106f360048036038101906106ee9190612d29565b611333565b005b348015610700575f80fd5b5061071b600480360381019061071691906130f3565b6115ac565b005b348015610728575f80fd5b506107316115c5565b60405161073e9190612cd6565b60405180910390f35b348015610752575f80fd5b5061076d600480360381019061076891906131cf565b611651565b005b34801561077a575f80fd5b5061079560048036038101906107909190612d29565b6116a2565b6040516107a29190612cd6565b60405180910390f35b3480156107b6575f80fd5b506107d160048036038101906107cc91906130c8565b6117f4565b6040516107de9190612e23565b60405180910390f35b3480156107f2575f80fd5b5061080d60048036038101906108089190612fd9565b611805565b005b34801561081a575f80fd5b506108356004803603810190610830919061324f565b61189e565b6040516108429190612c4d565b60405180910390f35b348015610856575f80fd5b50610871600480360381019061086c919061328d565b61192c565b005b34801561087e575f80fd5b50610899600480360381019061089491906130c8565b611a0d565b005b3480156108a6575f80fd5b506108af611b03565b6040516108bc9190612e23565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610965906132f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610991906132f8565b80156109dc5780601f106109b3576101008083540402835291602001916109dc565b820191905f5260205f20905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b5f6109f082611b09565b610a26576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a66611b63565b73ffffffffffffffffffffffffffffffffffffffff16610a8461127b565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613372565b60405180910390fd5b8060118190555050565b81610aee81611b6a565b610af88383611c64565b505050565b600d5481565b610b0b611b63565b73ffffffffffffffffffffffffffffffffffffffff16610b2961127b565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7690613372565b60405180910390fd5b80600b9081610b8e9190613524565b5050565b610b9a611b63565b73ffffffffffffffffffffffffffffffffffffffff16610bb861127b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590613372565b60405180910390fd5b8060125f6101000a81548160ff02191690831515021790555050565b5f610c33611e06565b6001545f540303905090565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8357610c8233611b6a565b5b610c8e848484611e0e565b50505050565b600f5481565b610ca2611b63565b73ffffffffffffffffffffffffffffffffffffffff16610cc061127b565b73ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613372565b60405180910390fd5b600260095403610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d529061363d565b60405180910390fd5b60026009819055505f610d6c61127b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d8f90613688565b5f6040518083038185875af1925050503d805f8114610dc9576040519150601f19603f3d011682016040523d82523d5f602084013e610dce565b606091505b5050905080610ddb575f80fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3657610e3533611b6a565b5b610e41848484611e1e565b50505050565b610e4f611b63565b73ffffffffffffffffffffffffffffffffffffffff16610e6d61127b565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613372565b60405180910390fd5b80600d8190555050565b600e5481565b610edb611b63565b73ffffffffffffffffffffffffffffffffffffffff16610ef961127b565b73ffffffffffffffffffffffffffffffffffffffff1614610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690613372565b60405180910390fd5b80600c9081610f5e9190613524565b5050565b601260019054906101000a900460ff1681565b600b8054610f82906132f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fae906132f8565b8015610ff95780601f10610fd057610100808354040283529160200191610ff9565b820191905f5260205f20905b815481529060010190602001808311610fdc57829003601f168201915b505050505081565b60125f9054906101000a900460ff1681565b600a8054611020906132f8565b80601f016020809104026020016040519081016040528092919081815260200182805461104c906132f8565b80156110975780601f1061106e57610100808354040283529160200191611097565b820191905f5260205f20905b81548152906001019060200180831161107a57829003601f168201915b505050505081565b5f6110a982611e3d565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611116576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b61116d611b63565b73ffffffffffffffffffffffffffffffffffffffff1661118b61127b565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613372565b60405180910390fd5b6111ea5f611f00565b565b6111f4611b63565b73ffffffffffffffffffffffffffffffffffffffff1661121261127b565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613372565b60405180910390fd5b80600a90816112779190613524565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112b2906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546112de906132f8565b80156113295780601f1061130057610100808354040283529160200191611329565b820191905f5260205f20905b81548152906001019060200180831161130c57829003601f168201915b5050505050905090565b8060125f9054906101000a900460ff1615611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a906136e6565b60405180910390fd5b5f8111801561139457506010548111155b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca9061374e565b60405180910390fd5b600e54816113df610c2a565b6113e99190613799565b111561142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190613816565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061387e565b60405180910390fd5b5f811180156114bc5750601154816114af336117f4565b6114b99190613799565b11155b6114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f29061390c565b60405180910390fd5b815f600f54611509336117f4565b101561153a575f611519336117f4565b600f54611526919061392a565b905080600d54611536919061395d565b9150505b8082600d54611549919061395d565b611553919061392a565b341015611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906139e8565b60405180910390fd5b6115a66115a0611b63565b85611fc3565b50505050565b816115b681611b6a565b6115c08383611fe0565b505050565b600c80546115d2906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546115fe906132f8565b80156116495780601f1061162057610100808354040283529160200191611649565b820191905f5260205f20905b81548152906001019060200180831161162c57829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168f5761168e33611b6a565b5b61169b85858585612152565b5050505050565b60606116ad82611b09565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613a76565b60405180910390fd5b5f1515601260019054906101000a900460ff1615150361179657600c8054611713906132f8565b80601f016020809104026020016040519081016040528092919081815260200182805461173f906132f8565b801561178a5780601f106117615761010080835404028352916020019161178a565b820191905f5260205f20905b81548152906001019060200180831161176d57829003601f168201915b505050505090506117ef565b5f61179f6121c4565b90505f8151116117bd5760405180602001604052805f8152506117eb565b806117c784612254565b600b6040516020016117db93929190613b4e565b6040516020818303038152906040525b9150505b919050565b5f6117fe826123ad565b9050919050565b61180d611b63565b73ffffffffffffffffffffffffffffffffffffffff1661182b61127b565b73ffffffffffffffffffffffffffffffffffffffff1614611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613372565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611934611b63565b73ffffffffffffffffffffffffffffffffffffffff1661195261127b565b73ffffffffffffffffffffffffffffffffffffffff16146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90613372565b60405180910390fd5b600e54826119b4610c2a565b6119be9190613799565b11156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613bc8565b60405180910390fd5b611a098183611fc3565b5050565b611a15611b63565b73ffffffffffffffffffffffffffffffffffffffff16611a3361127b565b73ffffffffffffffffffffffffffffffffffffffff1614611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613372565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613c56565b60405180910390fd5b611b0081611f00565b50565b60105481565b5f81611b13611e06565b11158015611b2157505f5482105b8015611b5c57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c61576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611be0929190613c74565b602060405180830381865afa158015611bfb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1f9190613caf565b611c6057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c579190612d93565b60405180910390fd5b5b50565b5f611c6e82611e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cd5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611cf4612401565b73ffffffffffffffffffffffffffffffffffffffff1614611d5757611d2081611d1b612401565b61189e565b611d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b611e19838383612408565b505050565b611e3883838360405180602001604052805f815250611651565b505050565b5f8082905080611e4b611e06565b11611ec9575f54811015611ec8575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603611ec6575b5f8103611ebc5760045f836001900393508381526020019081526020015f20549050611e95565b8092505050611efb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdc828260405180602001604052805f815250612799565b5050565b611fe8612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f612058612401565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612101612401565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121469190612c4d565b60405180910390a35050565b61215d848484612408565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146121be5761218784848484612a39565b6121bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121d3906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546121ff906132f8565b801561224a5780601f106122215761010080835404028352916020019161224a565b820191905f5260205f20905b81548152906001019060200180831161222d57829003601f168201915b5050505050905090565b60605f820361229a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123a8565b5f8290505f5b5f82146122c95780806122b290613cda565b915050600a826122c29190613d4e565b91506122a0565b5f8167ffffffffffffffff8111156122e4576122e3612e44565b5b6040519080825280601f01601f1916602001820160405280156123165781602001600182028036833780820191505090505b5090505b5f85146123a15760018261232e919061392a565b9150600a8561233d9190613d7e565b60306123499190613799565b60f81b81838151811061235f5761235e613dae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561239a9190613d4e565b945061231a565b8093505050505b919050565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f33905090565b5f61241282611e3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612479576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff16612499612401565b73ffffffffffffffffffffffffffffffffffffffff1614806124c857506124c7856124c2612401565b61189e565b5b8061250d57506124d6612401565b73ffffffffffffffffffffffffffffffffffffffff166124f5846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612546576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125ab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b88585856001612b84565b60065f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126ac86612b8a565b171760045f8581526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000083160361272a575f6001840190505f60045f8381526020019081526020015f205403612728575f548114612727578260045f8381526020019081526020015f20819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127928585856001612b93565b5050505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612803576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f830361283c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128485f858386612b84565b600160406001901b17830260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e16128aa60018514612b99565b901b60a042901b6128ba86612b8a565b171760045f8381526020019081526020015f20819055505f8190505f84820190505f8673ffffffffffffffffffffffffffffffffffffffff163b146129b5575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129675f878480600101955087612a39565b61299d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128fa57825f54146129b0575f80fd5b612a1f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129b6575b815f819055505050612a335f858386612b93565b50505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a5e612401565b8786866040518563ffffffff1660e01b8152600401612a809493929190613e2d565b6020604051808303815f875af1925050508015612abb57506040513d601f19601f82011682018060405250810190612ab89190613e8b565b60015b612b31573d805f8114612ae9576040519150601f19603f3d011682016040523d82523d5f602084013e612aee565b606091505b505f815103612b29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b5f819050919050565b50505050565b5f819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612be781612bb3565b8114612bf1575f80fd5b50565b5f81359050612c0281612bde565b92915050565b5f60208284031215612c1d57612c1c612bab565b5b5f612c2a84828501612bf4565b91505092915050565b5f8115159050919050565b612c4781612c33565b82525050565b5f602082019050612c605f830184612c3e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612ca882612c66565b612cb28185612c70565b9350612cc2818560208601612c80565b612ccb81612c8e565b840191505092915050565b5f6020820190508181035f830152612cee8184612c9e565b905092915050565b5f819050919050565b612d0881612cf6565b8114612d12575f80fd5b50565b5f81359050612d2381612cff565b92915050565b5f60208284031215612d3e57612d3d612bab565b5b5f612d4b84828501612d15565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d7d82612d54565b9050919050565b612d8d81612d73565b82525050565b5f602082019050612da65f830184612d84565b92915050565b612db581612d73565b8114612dbf575f80fd5b50565b5f81359050612dd081612dac565b92915050565b5f8060408385031215612dec57612deb612bab565b5b5f612df985828601612dc2565b9250506020612e0a85828601612d15565b9150509250929050565b612e1d81612cf6565b82525050565b5f602082019050612e365f830184612e14565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e7a82612c8e565b810181811067ffffffffffffffff82111715612e9957612e98612e44565b5b80604052505050565b5f612eab612ba2565b9050612eb78282612e71565b919050565b5f67ffffffffffffffff821115612ed657612ed5612e44565b5b612edf82612c8e565b9050602081019050919050565b828183375f83830152505050565b5f612f0c612f0784612ebc565b612ea2565b905082815260208101848484011115612f2857612f27612e40565b5b612f33848285612eec565b509392505050565b5f82601f830112612f4f57612f4e612e3c565b5b8135612f5f848260208601612efa565b91505092915050565b5f60208284031215612f7d57612f7c612bab565b5b5f82013567ffffffffffffffff811115612f9a57612f99612baf565b5b612fa684828501612f3b565b91505092915050565b612fb881612c33565b8114612fc2575f80fd5b50565b5f81359050612fd381612faf565b92915050565b5f60208284031215612fee57612fed612bab565b5b5f612ffb84828501612fc5565b91505092915050565b5f805f6060848603121561301b5761301a612bab565b5b5f61302886828701612dc2565b935050602061303986828701612dc2565b925050604061304a86828701612d15565b9150509250925092565b5f819050919050565b5f61307761307261306d84612d54565b613054565b612d54565b9050919050565b5f6130888261305d565b9050919050565b5f6130998261307e565b9050919050565b6130a98161308f565b82525050565b5f6020820190506130c25f8301846130a0565b92915050565b5f602082840312156130dd576130dc612bab565b5b5f6130ea84828501612dc2565b91505092915050565b5f806040838503121561310957613108612bab565b5b5f61311685828601612dc2565b925050602061312785828601612fc5565b9150509250929050565b5f67ffffffffffffffff82111561314b5761314a612e44565b5b61315482612c8e565b9050602081019050919050565b5f61317361316e84613131565b612ea2565b90508281526020810184848401111561318f5761318e612e40565b5b61319a848285612eec565b509392505050565b5f82601f8301126131b6576131b5612e3c565b5b81356131c6848260208601613161565b91505092915050565b5f805f80608085870312156131e7576131e6612bab565b5b5f6131f487828801612dc2565b945050602061320587828801612dc2565b935050604061321687828801612d15565b925050606085013567ffffffffffffffff81111561323757613236612baf565b5b613243878288016131a2565b91505092959194509250565b5f806040838503121561326557613264612bab565b5b5f61327285828601612dc2565b925050602061328385828601612dc2565b9150509250929050565b5f80604083850312156132a3576132a2612bab565b5b5f6132b085828601612d15565b92505060206132c185828601612dc2565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061330f57607f821691505b602082108103613322576133216132cb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61335c602083612c70565b915061336782613328565b602082019050919050565b5f6020820190508181035f83015261338981613350565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026133ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133b1565b6133f686836133b1565b95508019841693508086168417925050509392505050565b5f61342861342361341e84612cf6565b613054565b612cf6565b9050919050565b5f819050919050565b6134418361340e565b61345561344d8261342f565b8484546133bd565b825550505050565b5f90565b61346961345d565b613474818484613438565b505050565b5b818110156134975761348c5f82613461565b60018101905061347a565b5050565b601f8211156134dc576134ad81613390565b6134b6846133a2565b810160208510156134c5578190505b6134d96134d1856133a2565b830182613479565b50505b505050565b5f82821c905092915050565b5f6134fc5f19846008026134e1565b1980831691505092915050565b5f61351483836134ed565b9150826002028217905092915050565b61352d82612c66565b67ffffffffffffffff81111561354657613545612e44565b5b61355082546132f8565b61355b82828561349b565b5f60209050601f83116001811461358c575f841561357a578287015190505b6135848582613509565b8655506135eb565b601f19841661359a86613390565b5f5b828110156135c15784890151825560018201915060208501945060208101905061359c565b868310156135de57848901516135da601f8916826134ed565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613627601f83612c70565b9150613632826135f3565b602082019050919050565b5f6020820190508181035f8301526136548161361b565b9050919050565b5f81905092915050565b50565b5f6136735f8361365b565b915061367e82613665565b5f82019050919050565b5f61369282613668565b9150819050919050565b7f4d696e74696e6720686173206e6f7420737461727465642e00000000000000005f82015250565b5f6136d0601883612c70565b91506136db8261369c565b602082019050919050565b5f6020820190508181035f8301526136fd816136c4565b9050919050565b7f4d6178696d756d206f66203130204e465473207065722074786e2100000000005f82015250565b5f613738601b83612c70565b915061374382613704565b602082019050919050565b5f6020820190508181035f8301526137658161372c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137a382612cf6565b91506137ae83612cf6565b92508282019050808211156137c6576137c561376c565b5b92915050565b7f4e6f204e465473206c65667473210000000000000000000000000000000000005f82015250565b5f613800600e83612c70565b915061380b826137cc565b602082019050919050565b5f6020820190508181035f83015261382d816137f4565b9050919050565b7f4e6f20736d61727420636f6e7472616374206d696e74696e672e0000000000005f82015250565b5f613868601a83612c70565b915061387382613834565b602082019050919050565b5f6020820190508181035f8301526138958161385c565b9050919050565b7f596f752068617665206d696e746564206d6178206e756d626572206f66204e465f8201527f5473210000000000000000000000000000000000000000000000000000000000602082015250565b5f6138f6602383612c70565b91506139018261389c565b604082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b5f61393482612cf6565b915061393f83612cf6565b92508282039050818111156139575761395661376c565b5b92915050565b5f61396782612cf6565b915061397283612cf6565b925082820261398081612cf6565b915082820484148315176139975761399661376c565b5b5092915050565b7f496e73756666696369656e742f696e636f72726563742066756e64732e0000005f82015250565b5f6139d2601d83612c70565b91506139dd8261399e565b602082019050919050565b5f6020820190508181035f8301526139ff816139c6565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613a60602f83612c70565b9150613a6b82613a06565b604082019050919050565b5f6020820190508181035f830152613a8d81613a54565b9050919050565b5f81905092915050565b5f613aa882612c66565b613ab28185613a94565b9350613ac2818560208601612c80565b80840191505092915050565b5f8154613ada816132f8565b613ae48186613a94565b9450600182165f8114613afe5760018114613b1357613b45565b60ff1983168652811515820286019350613b45565b613b1c85613390565b5f5b83811015613b3d57815481890152600182019150602081019050613b1e565b838801955050505b50505092915050565b5f613b598286613a9e565b9150613b658285613a9e565b9150613b718284613ace565b9150819050949350505050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f613bb2601483612c70565b9150613bbd82613b7e565b602082019050919050565b5f6020820190508181035f830152613bdf81613ba6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613c40602683612c70565b9150613c4b82613be6565b604082019050919050565b5f6020820190508181035f830152613c6d81613c34565b9050919050565b5f604082019050613c875f830185612d84565b613c946020830184612d84565b9392505050565b5f81519050613ca981612faf565b92915050565b5f60208284031215613cc457613cc3612bab565b5b5f613cd184828501613c9b565b91505092915050565b5f613ce482612cf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d1657613d1561376c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d5882612cf6565b9150613d6383612cf6565b925082613d7357613d72613d21565b5b828204905092915050565b5f613d8882612cf6565b9150613d9383612cf6565b925082613da357613da2613d21565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f613dff82613ddb565b613e098185613de5565b9350613e19818560208601612c80565b613e2281612c8e565b840191505092915050565b5f608082019050613e405f830187612d84565b613e4d6020830186612d84565b613e5a6040830185612e14565b8181036060830152613e6c8184613df5565b905095945050505050565b5f81519050613e8581612bde565b92915050565b5f60208284031215613ea057613e9f612bab565b5b5f613ead84828501613e77565b9150509291505056fea2646970667358221220923db56aa4d4974b71cbc3f2f52e1d56382d36f840ea13aae54c03f9737e71cf64736f6c634300081a0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004726f626f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004726f626f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061022f575f3560e01c80635503a0e81161012d578063a22cb465116100aa578063e0a808531161006e578063e0a80853146107e7578063e985e9c51461080f578063efbd73f41461084b578063f2fde38b14610873578063f9308cc51461089b5761022f565b8063a22cb465146106f5578063a45ba8e71461071d578063b88d4fde14610747578063c87b56dd1461076f578063dc33e681146107ab5761022f565b8063715018a6116100f1578063715018a6146106475780637ec4a6591461065d5780638da5cb5b1461068557806395d89b41146106af578063a0712d68146106d95761022f565b80635503a0e8146105515780635c975abb1461057b57806362b99ad4146105a55780636352211e146105cf57806370a082311461060b5761022f565b8063239c70ae116101bb57806342842e0e1161017f57806342842e0e1461048557806344a0d68a146104ad5780634e9e1ec6146104d55780634fdd43cb146104ff57806351830227146105275761022f565b8063239c70ae146103c957806323b872dd146103f35780633a467e3d1461041b5780633ccfd60b1461044557806341f434341461045b5761022f565b8063095ea7b311610202578063095ea7b3146102fd57806313faede61461032557806316ba10e01461034f57806316c38b3c1461037757806318160ddd1461039f5761022f565b806301ffc9a71461023357806306fdde031461026f578063081812fc14610299578063088a4ed0146102d5575b5f80fd5b34801561023e575f80fd5b5061025960048036038101906102549190612c08565b6108c5565b6040516102669190612c4d565b60405180910390f35b34801561027a575f80fd5b50610283610956565b6040516102909190612cd6565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba9190612d29565b6109e6565b6040516102cc9190612d93565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f69190612d29565b610a5e565b005b348015610308575f80fd5b50610323600480360381019061031e9190612dd6565b610ae4565b005b348015610330575f80fd5b50610339610afd565b6040516103469190612e23565b60405180910390f35b34801561035a575f80fd5b5061037560048036038101906103709190612f68565b610b03565b005b348015610382575f80fd5b5061039d60048036038101906103989190612fd9565b610b92565b005b3480156103aa575f80fd5b506103b3610c2a565b6040516103c09190612e23565b60405180910390f35b3480156103d4575f80fd5b506103dd610c3f565b6040516103ea9190612e23565b60405180910390f35b3480156103fe575f80fd5b5061041960048036038101906104149190613004565b610c45565b005b348015610426575f80fd5b5061042f610c94565b60405161043c9190612e23565b60405180910390f35b348015610450575f80fd5b50610459610c9a565b005b348015610466575f80fd5b5061046f610de6565b60405161047c91906130af565b60405180910390f35b348015610490575f80fd5b506104ab60048036038101906104a69190613004565b610df8565b005b3480156104b8575f80fd5b506104d360048036038101906104ce9190612d29565b610e47565b005b3480156104e0575f80fd5b506104e9610ecd565b6040516104f69190612e23565b60405180910390f35b34801561050a575f80fd5b5061052560048036038101906105209190612f68565b610ed3565b005b348015610532575f80fd5b5061053b610f62565b6040516105489190612c4d565b60405180910390f35b34801561055c575f80fd5b50610565610f75565b6040516105729190612cd6565b60405180910390f35b348015610586575f80fd5b5061058f611001565b60405161059c9190612c4d565b60405180910390f35b3480156105b0575f80fd5b506105b9611013565b6040516105c69190612cd6565b60405180910390f35b3480156105da575f80fd5b506105f560048036038101906105f09190612d29565b61109f565b6040516106029190612d93565b60405180910390f35b348015610616575f80fd5b50610631600480360381019061062c91906130c8565b6110b0565b60405161063e9190612e23565b60405180910390f35b348015610652575f80fd5b5061065b611165565b005b348015610668575f80fd5b50610683600480360381019061067e9190612f68565b6111ec565b005b348015610690575f80fd5b5061069961127b565b6040516106a69190612d93565b60405180910390f35b3480156106ba575f80fd5b506106c36112a3565b6040516106d09190612cd6565b60405180910390f35b6106f360048036038101906106ee9190612d29565b611333565b005b348015610700575f80fd5b5061071b600480360381019061071691906130f3565b6115ac565b005b348015610728575f80fd5b506107316115c5565b60405161073e9190612cd6565b60405180910390f35b348015610752575f80fd5b5061076d600480360381019061076891906131cf565b611651565b005b34801561077a575f80fd5b5061079560048036038101906107909190612d29565b6116a2565b6040516107a29190612cd6565b60405180910390f35b3480156107b6575f80fd5b506107d160048036038101906107cc91906130c8565b6117f4565b6040516107de9190612e23565b60405180910390f35b3480156107f2575f80fd5b5061080d60048036038101906108089190612fd9565b611805565b005b34801561081a575f80fd5b506108356004803603810190610830919061324f565b61189e565b6040516108429190612c4d565b60405180910390f35b348015610856575f80fd5b50610871600480360381019061086c919061328d565b61192c565b005b34801561087e575f80fd5b50610899600480360381019061089491906130c8565b611a0d565b005b3480156108a6575f80fd5b506108af611b03565b6040516108bc9190612e23565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610965906132f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610991906132f8565b80156109dc5780601f106109b3576101008083540402835291602001916109dc565b820191905f5260205f20905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b5f6109f082611b09565b610a26576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a66611b63565b73ffffffffffffffffffffffffffffffffffffffff16610a8461127b565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613372565b60405180910390fd5b8060118190555050565b81610aee81611b6a565b610af88383611c64565b505050565b600d5481565b610b0b611b63565b73ffffffffffffffffffffffffffffffffffffffff16610b2961127b565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7690613372565b60405180910390fd5b80600b9081610b8e9190613524565b5050565b610b9a611b63565b73ffffffffffffffffffffffffffffffffffffffff16610bb861127b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590613372565b60405180910390fd5b8060125f6101000a81548160ff02191690831515021790555050565b5f610c33611e06565b6001545f540303905090565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8357610c8233611b6a565b5b610c8e848484611e0e565b50505050565b600f5481565b610ca2611b63565b73ffffffffffffffffffffffffffffffffffffffff16610cc061127b565b73ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613372565b60405180910390fd5b600260095403610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d529061363d565b60405180910390fd5b60026009819055505f610d6c61127b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d8f90613688565b5f6040518083038185875af1925050503d805f8114610dc9576040519150601f19603f3d011682016040523d82523d5f602084013e610dce565b606091505b5050905080610ddb575f80fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3657610e3533611b6a565b5b610e41848484611e1e565b50505050565b610e4f611b63565b73ffffffffffffffffffffffffffffffffffffffff16610e6d61127b565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613372565b60405180910390fd5b80600d8190555050565b600e5481565b610edb611b63565b73ffffffffffffffffffffffffffffffffffffffff16610ef961127b565b73ffffffffffffffffffffffffffffffffffffffff1614610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690613372565b60405180910390fd5b80600c9081610f5e9190613524565b5050565b601260019054906101000a900460ff1681565b600b8054610f82906132f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fae906132f8565b8015610ff95780601f10610fd057610100808354040283529160200191610ff9565b820191905f5260205f20905b815481529060010190602001808311610fdc57829003601f168201915b505050505081565b60125f9054906101000a900460ff1681565b600a8054611020906132f8565b80601f016020809104026020016040519081016040528092919081815260200182805461104c906132f8565b80156110975780601f1061106e57610100808354040283529160200191611097565b820191905f5260205f20905b81548152906001019060200180831161107a57829003601f168201915b505050505081565b5f6110a982611e3d565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611116576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b61116d611b63565b73ffffffffffffffffffffffffffffffffffffffff1661118b61127b565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613372565b60405180910390fd5b6111ea5f611f00565b565b6111f4611b63565b73ffffffffffffffffffffffffffffffffffffffff1661121261127b565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613372565b60405180910390fd5b80600a90816112779190613524565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112b2906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546112de906132f8565b80156113295780601f1061130057610100808354040283529160200191611329565b820191905f5260205f20905b81548152906001019060200180831161130c57829003601f168201915b5050505050905090565b8060125f9054906101000a900460ff1615611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a906136e6565b60405180910390fd5b5f8111801561139457506010548111155b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca9061374e565b60405180910390fd5b600e54816113df610c2a565b6113e99190613799565b111561142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190613816565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061387e565b60405180910390fd5b5f811180156114bc5750601154816114af336117f4565b6114b99190613799565b11155b6114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f29061390c565b60405180910390fd5b815f600f54611509336117f4565b101561153a575f611519336117f4565b600f54611526919061392a565b905080600d54611536919061395d565b9150505b8082600d54611549919061395d565b611553919061392a565b341015611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906139e8565b60405180910390fd5b6115a66115a0611b63565b85611fc3565b50505050565b816115b681611b6a565b6115c08383611fe0565b505050565b600c80546115d2906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546115fe906132f8565b80156116495780601f1061162057610100808354040283529160200191611649565b820191905f5260205f20905b81548152906001019060200180831161162c57829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168f5761168e33611b6a565b5b61169b85858585612152565b5050505050565b60606116ad82611b09565b6116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390613a76565b60405180910390fd5b5f1515601260019054906101000a900460ff1615150361179657600c8054611713906132f8565b80601f016020809104026020016040519081016040528092919081815260200182805461173f906132f8565b801561178a5780601f106117615761010080835404028352916020019161178a565b820191905f5260205f20905b81548152906001019060200180831161176d57829003601f168201915b505050505090506117ef565b5f61179f6121c4565b90505f8151116117bd5760405180602001604052805f8152506117eb565b806117c784612254565b600b6040516020016117db93929190613b4e565b6040516020818303038152906040525b9150505b919050565b5f6117fe826123ad565b9050919050565b61180d611b63565b73ffffffffffffffffffffffffffffffffffffffff1661182b61127b565b73ffffffffffffffffffffffffffffffffffffffff1614611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613372565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611934611b63565b73ffffffffffffffffffffffffffffffffffffffff1661195261127b565b73ffffffffffffffffffffffffffffffffffffffff16146119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90613372565b60405180910390fd5b600e54826119b4610c2a565b6119be9190613799565b11156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613bc8565b60405180910390fd5b611a098183611fc3565b5050565b611a15611b63565b73ffffffffffffffffffffffffffffffffffffffff16611a3361127b565b73ffffffffffffffffffffffffffffffffffffffff1614611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613372565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90613c56565b60405180910390fd5b611b0081611f00565b50565b60105481565b5f81611b13611e06565b11158015611b2157505f5482105b8015611b5c57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c61576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611be0929190613c74565b602060405180830381865afa158015611bfb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1f9190613caf565b611c6057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c579190612d93565b60405180910390fd5b5b50565b5f611c6e82611e3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cd5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611cf4612401565b73ffffffffffffffffffffffffffffffffffffffff1614611d5757611d2081611d1b612401565b61189e565b611d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b611e19838383612408565b505050565b611e3883838360405180602001604052805f815250611651565b505050565b5f8082905080611e4b611e06565b11611ec9575f54811015611ec8575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603611ec6575b5f8103611ebc5760045f836001900393508381526020019081526020015f20549050611e95565b8092505050611efb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdc828260405180602001604052805f815250612799565b5050565b611fe8612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f612058612401565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612101612401565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121469190612c4d565b60405180910390a35050565b61215d848484612408565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146121be5761218784848484612a39565b6121bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121d3906132f8565b80601f01602080910402602001604051908101604052809291908181526020018280546121ff906132f8565b801561224a5780601f106122215761010080835404028352916020019161224a565b820191905f5260205f20905b81548152906001019060200180831161222d57829003601f168201915b5050505050905090565b60605f820361229a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123a8565b5f8290505f5b5f82146122c95780806122b290613cda565b915050600a826122c29190613d4e565b91506122a0565b5f8167ffffffffffffffff8111156122e4576122e3612e44565b5b6040519080825280601f01601f1916602001820160405280156123165781602001600182028036833780820191505090505b5090505b5f85146123a15760018261232e919061392a565b9150600a8561233d9190613d7e565b60306123499190613799565b60f81b81838151811061235f5761235e613dae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561239a9190613d4e565b945061231a565b8093505050505b919050565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f33905090565b5f61241282611e3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612479576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff16612499612401565b73ffffffffffffffffffffffffffffffffffffffff1614806124c857506124c7856124c2612401565b61189e565b5b8061250d57506124d6612401565b73ffffffffffffffffffffffffffffffffffffffff166124f5846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612546576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125ab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b88585856001612b84565b60065f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126ac86612b8a565b171760045f8581526020019081526020015f20819055505f7c020000000000000000000000000000000000000000000000000000000083160361272a575f6001840190505f60045f8381526020019081526020015f205403612728575f548114612727578260045f8381526020019081526020015f20819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127928585856001612b93565b5050505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612803576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f830361283c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128485f858386612b84565b600160406001901b17830260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e16128aa60018514612b99565b901b60a042901b6128ba86612b8a565b171760045f8381526020019081526020015f20819055505f8190505f84820190505f8673ffffffffffffffffffffffffffffffffffffffff163b146129b5575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129675f878480600101955087612a39565b61299d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128fa57825f54146129b0575f80fd5b612a1f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129b6575b815f819055505050612a335f858386612b93565b50505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a5e612401565b8786866040518563ffffffff1660e01b8152600401612a809493929190613e2d565b6020604051808303815f875af1925050508015612abb57506040513d601f19601f82011682018060405250810190612ab89190613e8b565b60015b612b31573d805f8114612ae9576040519150601f19603f3d011682016040523d82523d5f602084013e612aee565b606091505b505f815103612b29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b5f819050919050565b50505050565b5f819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612be781612bb3565b8114612bf1575f80fd5b50565b5f81359050612c0281612bde565b92915050565b5f60208284031215612c1d57612c1c612bab565b5b5f612c2a84828501612bf4565b91505092915050565b5f8115159050919050565b612c4781612c33565b82525050565b5f602082019050612c605f830184612c3e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612ca882612c66565b612cb28185612c70565b9350612cc2818560208601612c80565b612ccb81612c8e565b840191505092915050565b5f6020820190508181035f830152612cee8184612c9e565b905092915050565b5f819050919050565b612d0881612cf6565b8114612d12575f80fd5b50565b5f81359050612d2381612cff565b92915050565b5f60208284031215612d3e57612d3d612bab565b5b5f612d4b84828501612d15565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d7d82612d54565b9050919050565b612d8d81612d73565b82525050565b5f602082019050612da65f830184612d84565b92915050565b612db581612d73565b8114612dbf575f80fd5b50565b5f81359050612dd081612dac565b92915050565b5f8060408385031215612dec57612deb612bab565b5b5f612df985828601612dc2565b9250506020612e0a85828601612d15565b9150509250929050565b612e1d81612cf6565b82525050565b5f602082019050612e365f830184612e14565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e7a82612c8e565b810181811067ffffffffffffffff82111715612e9957612e98612e44565b5b80604052505050565b5f612eab612ba2565b9050612eb78282612e71565b919050565b5f67ffffffffffffffff821115612ed657612ed5612e44565b5b612edf82612c8e565b9050602081019050919050565b828183375f83830152505050565b5f612f0c612f0784612ebc565b612ea2565b905082815260208101848484011115612f2857612f27612e40565b5b612f33848285612eec565b509392505050565b5f82601f830112612f4f57612f4e612e3c565b5b8135612f5f848260208601612efa565b91505092915050565b5f60208284031215612f7d57612f7c612bab565b5b5f82013567ffffffffffffffff811115612f9a57612f99612baf565b5b612fa684828501612f3b565b91505092915050565b612fb881612c33565b8114612fc2575f80fd5b50565b5f81359050612fd381612faf565b92915050565b5f60208284031215612fee57612fed612bab565b5b5f612ffb84828501612fc5565b91505092915050565b5f805f6060848603121561301b5761301a612bab565b5b5f61302886828701612dc2565b935050602061303986828701612dc2565b925050604061304a86828701612d15565b9150509250925092565b5f819050919050565b5f61307761307261306d84612d54565b613054565b612d54565b9050919050565b5f6130888261305d565b9050919050565b5f6130998261307e565b9050919050565b6130a98161308f565b82525050565b5f6020820190506130c25f8301846130a0565b92915050565b5f602082840312156130dd576130dc612bab565b5b5f6130ea84828501612dc2565b91505092915050565b5f806040838503121561310957613108612bab565b5b5f61311685828601612dc2565b925050602061312785828601612fc5565b9150509250929050565b5f67ffffffffffffffff82111561314b5761314a612e44565b5b61315482612c8e565b9050602081019050919050565b5f61317361316e84613131565b612ea2565b90508281526020810184848401111561318f5761318e612e40565b5b61319a848285612eec565b509392505050565b5f82601f8301126131b6576131b5612e3c565b5b81356131c6848260208601613161565b91505092915050565b5f805f80608085870312156131e7576131e6612bab565b5b5f6131f487828801612dc2565b945050602061320587828801612dc2565b935050604061321687828801612d15565b925050606085013567ffffffffffffffff81111561323757613236612baf565b5b613243878288016131a2565b91505092959194509250565b5f806040838503121561326557613264612bab565b5b5f61327285828601612dc2565b925050602061328385828601612dc2565b9150509250929050565b5f80604083850312156132a3576132a2612bab565b5b5f6132b085828601612d15565b92505060206132c185828601612dc2565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061330f57607f821691505b602082108103613322576133216132cb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61335c602083612c70565b915061336782613328565b602082019050919050565b5f6020820190508181035f83015261338981613350565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026133ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133b1565b6133f686836133b1565b95508019841693508086168417925050509392505050565b5f61342861342361341e84612cf6565b613054565b612cf6565b9050919050565b5f819050919050565b6134418361340e565b61345561344d8261342f565b8484546133bd565b825550505050565b5f90565b61346961345d565b613474818484613438565b505050565b5b818110156134975761348c5f82613461565b60018101905061347a565b5050565b601f8211156134dc576134ad81613390565b6134b6846133a2565b810160208510156134c5578190505b6134d96134d1856133a2565b830182613479565b50505b505050565b5f82821c905092915050565b5f6134fc5f19846008026134e1565b1980831691505092915050565b5f61351483836134ed565b9150826002028217905092915050565b61352d82612c66565b67ffffffffffffffff81111561354657613545612e44565b5b61355082546132f8565b61355b82828561349b565b5f60209050601f83116001811461358c575f841561357a578287015190505b6135848582613509565b8655506135eb565b601f19841661359a86613390565b5f5b828110156135c15784890151825560018201915060208501945060208101905061359c565b868310156135de57848901516135da601f8916826134ed565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613627601f83612c70565b9150613632826135f3565b602082019050919050565b5f6020820190508181035f8301526136548161361b565b9050919050565b5f81905092915050565b50565b5f6136735f8361365b565b915061367e82613665565b5f82019050919050565b5f61369282613668565b9150819050919050565b7f4d696e74696e6720686173206e6f7420737461727465642e00000000000000005f82015250565b5f6136d0601883612c70565b91506136db8261369c565b602082019050919050565b5f6020820190508181035f8301526136fd816136c4565b9050919050565b7f4d6178696d756d206f66203130204e465473207065722074786e2100000000005f82015250565b5f613738601b83612c70565b915061374382613704565b602082019050919050565b5f6020820190508181035f8301526137658161372c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137a382612cf6565b91506137ae83612cf6565b92508282019050808211156137c6576137c561376c565b5b92915050565b7f4e6f204e465473206c65667473210000000000000000000000000000000000005f82015250565b5f613800600e83612c70565b915061380b826137cc565b602082019050919050565b5f6020820190508181035f83015261382d816137f4565b9050919050565b7f4e6f20736d61727420636f6e7472616374206d696e74696e672e0000000000005f82015250565b5f613868601a83612c70565b915061387382613834565b602082019050919050565b5f6020820190508181035f8301526138958161385c565b9050919050565b7f596f752068617665206d696e746564206d6178206e756d626572206f66204e465f8201527f5473210000000000000000000000000000000000000000000000000000000000602082015250565b5f6138f6602383612c70565b91506139018261389c565b604082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b5f61393482612cf6565b915061393f83612cf6565b92508282039050818111156139575761395661376c565b5b92915050565b5f61396782612cf6565b915061397283612cf6565b925082820261398081612cf6565b915082820484148315176139975761399661376c565b5b5092915050565b7f496e73756666696369656e742f696e636f72726563742066756e64732e0000005f82015250565b5f6139d2601d83612c70565b91506139dd8261399e565b602082019050919050565b5f6020820190508181035f8301526139ff816139c6565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613a60602f83612c70565b9150613a6b82613a06565b604082019050919050565b5f6020820190508181035f830152613a8d81613a54565b9050919050565b5f81905092915050565b5f613aa882612c66565b613ab28185613a94565b9350613ac2818560208601612c80565b80840191505092915050565b5f8154613ada816132f8565b613ae48186613a94565b9450600182165f8114613afe5760018114613b1357613b45565b60ff1983168652811515820286019350613b45565b613b1c85613390565b5f5b83811015613b3d57815481890152600182019150602081019050613b1e565b838801955050505b50505092915050565b5f613b598286613a9e565b9150613b658285613a9e565b9150613b718284613ace565b9150819050949350505050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f613bb2601483612c70565b9150613bbd82613b7e565b602082019050919050565b5f6020820190508181035f830152613bdf81613ba6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613c40602683612c70565b9150613c4b82613be6565b604082019050919050565b5f6020820190508181035f830152613c6d81613c34565b9050919050565b5f604082019050613c875f830185612d84565b613c946020830184612d84565b9392505050565b5f81519050613ca981612faf565b92915050565b5f60208284031215613cc457613cc3612bab565b5b5f613cd184828501613c9b565b91505092915050565b5f613ce482612cf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d1657613d1561376c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613d5882612cf6565b9150613d6383612cf6565b925082613d7357613d72613d21565b5b828204905092915050565b5f613d8882612cf6565b9150613d9383612cf6565b925082613da357613da2613d21565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f613dff82613ddb565b613e098185613de5565b9350613e19818560208601612c80565b613e2281612c8e565b840191505092915050565b5f608082019050613e405f830187612d84565b613e4d6020830186612d84565b613e5a6040830185612e14565b8181036060830152613e6c8184613df5565b905095945050505050565b5f81519050613e8581612bde565b92915050565b5f60208284031215613ea057613e9f612bab565b5b5f613ead84828501613e77565b9150509291505056fea2646970667358221220923db56aa4d4974b71cbc3f2f52e1d56382d36f840ea13aae54c03f9737e71cf64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004726f626f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004726f626f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): robo
Arg [1] : _tokenSymbol (string): robo
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 726f626f00000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 726f626f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
51689:4498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18108:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23121:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25197:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54758:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55455:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51911:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54569:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54675:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17162:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52052:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55616:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51983:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54874:172;;;;;;;;;;;;;:::i;:::-;;3048:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55783:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54157:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51949:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54325:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52122:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51835:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52092:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51802:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22910:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18787:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50787:103;;;;;;;;;;;;;:::i;:::-;;54463:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50136:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23290:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53226:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55275:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51873:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55958:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53706:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55052:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54237:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25852:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53394:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51045:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52021:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18108:615;18193:4;18508:10;18493:25;;:11;:25;;;;:102;;;;18585:10;18570:25;;:11;:25;;;;18493:102;:179;;;;18662:10;18647:25;;:11;:25;;;;18493:179;18473:199;;18108:615;;;:::o;23121:100::-;23175:13;23208:5;23201:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23121:100;:::o;25197:204::-;25265:7;25290:16;25298:7;25290;:16::i;:::-;25285:64;;25315:34;;;;;;;;;;;;;;25285:64;25369:15;:24;25385:7;25369:24;;;;;;;;;;;;;;;;;;;;;25362:31;;25197:204;;;:::o;54758:110::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54848:14:::1;54832:13;:30;;;;54758:110:::0;:::o;55455:155::-;55551:8;4569:30;4590:8;4569:20;:30::i;:::-;55572:32:::1;55586:8;55596:7;55572:13;:32::i;:::-;55455:155:::0;;;:::o;51911:33::-;;;;:::o;54569:100::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54653:10:::1;54641:9;:22;;;;;;:::i;:::-;;54569:100:::0;:::o;54675:77::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54740:6:::1;54731;;:15;;;;;;;;;;;;;;;;;;54675:77:::0;:::o;17162:315::-;17215:7;17443:15;:13;:15::i;:::-;17428:12;;17412:13;;:28;:46;17405:53;;17162:315;:::o;52052:33::-;;;;:::o;55616:161::-;55717:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;55734:37:::1;55753:4;55759:2;55763:7;55734:18;:37::i;:::-;55616:161:::0;;;;:::o;51983:33::-;;;;:::o;54874:172::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47279:1:::1;47877:7;;:19:::0;47869:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47279:1;48010:7;:18;;;;54932::::2;54964:7;:5;:7::i;:::-;54956:21;;54985;54956:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54931:80;;;55026:13;55018:22;;;::::0;::::2;;54924:122;47235:1:::1;48189:7;:22;;;;54874:172::o:0;3048:143::-;3148:42;3048:143;:::o;55783:169::-;55888:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;55905:41:::1;55928:4;55934:2;55938:7;55905:22;:41::i;:::-;55783:169:::0;;;;:::o;54157:74::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54220:5:::1;54213:4;:12;;;;54157:74:::0;:::o;51949:29::-;;;;:::o;54325:132::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54433:18:::1;54413:17;:38;;;;;;:::i;:::-;;54325:132:::0;:::o;52122:28::-;;;;;;;;;;;;;:::o;51835:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52092:25::-;;;;;;;;;;;;;:::o;51802:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22910:144::-;22974:7;23017:27;23036:7;23017:18;:27::i;:::-;22994:52;;22910:144;;;:::o;18787:224::-;18851:7;18892:1;18875:19;;:5;:19;;;18871:60;;18903:28;;;;;;;;;;;;;;18871:60;14126:13;18949:18;:25;18968:5;18949:25;;;;;;;;;;;;;;;;:54;18942:61;;18787:224;;;:::o;50787:103::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50852:30:::1;50879:1;50852:18;:30::i;:::-;50787:103::o:0;54463:100::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54547:10:::1;54535:9;:22;;;;;;:::i;:::-;;54463:100:::0;:::o;50136:87::-;50182:7;50209:6;;;;;;;;;;;50202:13;;50136:87;:::o;23290:104::-;23346:13;23379:7;23372:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23290:104;:::o;53226:160::-;53291:11;52418:6;;;;;;;;;;;52417:7;52409:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52482:1;52468:11;:15;:40;;;;;52502:6;;52487:11;:21;;52468:40;52460:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52586:7;;52571:11;52555:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52547:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52640:10;52627:23;;:9;:23;;;52619:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52718:1;52704:11;:15;:74;;;;;52765:13;;52750:11;52723:24;52736:10;52723:12;:24::i;:::-;:38;;;;:::i;:::-;:55;;52704:74;52688:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:11:::1;52909:16;52973:14;;52946:24;52959:10;52946:12;:24::i;:::-;:41;52942:169;;;52998:21;53039:24;53052:10;53039:12;:24::i;:::-;53022:14;;:41;;;;:::i;:::-;52998:65;;53090:13;53083:4;;:20;;;;:::i;:::-;53072:31;;52989:122;52942:169;53164:8;53150:11;53143:4;;:18;;;;:::i;:::-;:29;;;;:::i;:::-;53130:9;:42;;53122:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53344:36:::2;53354:12;:10;:12::i;:::-;53368:11;53344:9;:36::i;:::-;52902:318:::1;52839:1;53226:160:::0;;:::o;55275:174::-;55379:8;4569:30;4590:8;4569:20;:30::i;:::-;55400:43:::1;55424:8;55434;55400:23;:43::i;:::-;55275:174:::0;;;:::o;51873:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55958:224::-;56109:4;4397:10;4389:18;;:4;:18;;;4385:83;;4424:32;4445:10;4424:20;:32::i;:::-;4385:83;56129:47:::1;56152:4;56158:2;56162:7;56171:4;56129:22;:47::i;:::-;55958:224:::0;;;;;:::o;53706:445::-;53780:13;53810:17;53818:8;53810:7;:17::i;:::-;53802:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53904:5;53892:17;;:8;;;;;;;;;;;:17;;;53888:64;;53927:17;53920:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53888:64;53960:28;53991:10;:8;:10::i;:::-;53960:41;;54046:1;54021:14;54015:28;:32;:130;;;;;;;;;;;;;;;;;54083:14;54099:19;:8;:17;:19::i;:::-;54120:9;54066:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54015:130;54008:137;;;53706:445;;;;:::o;55052:107::-;55110:7;55133:20;55147:5;55133:13;:20::i;:::-;55126:27;;55052:107;;;:::o;54237:81::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54306:6:::1;54295:8;;:17;;;;;;;;;;;;;;;;;;54237:81:::0;:::o;25852:164::-;25949:4;25973:18;:25;25992:5;25973:25;;;;;;;;;;;;;;;:35;25999:8;25973:35;;;;;;;;;;;;;;;;;;;;;;;;;25966:42;;25852:164;;;;:::o;53394:205::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53521:7:::1;;53506:11;53490:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;53482:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53560:33;53570:9;53581:11;53560:9;:33::i;:::-;53394:205:::0;;:::o;51045:201::-;50367:12;:10;:12::i;:::-;50356:23;;:7;:5;:7::i;:::-;:23;;;50348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51154:1:::1;51134:22;;:8;:22;;::::0;51126:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;51210:28;51229:8;51210:18;:28::i;:::-;51045:201:::0;:::o;52021:26::-;;;;:::o;27231:273::-;27288:4;27344:7;27325:15;:13;:15::i;:::-;:26;;:66;;;;;27378:13;;27368:7;:23;27325:66;:152;;;;;27476:1;14896:8;27429:17;:26;27447:7;27429:26;;;;;;;;;;;;:43;:48;27325:152;27305:172;;27231:273;;;:::o;48883:98::-;48936:7;48963:10;48956:17;;48883:98;:::o;4627:419::-;4866:1;3148:42;4818:45;;;:49;4814:225;;;3148:42;4889;;;4940:4;4947:8;4889:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4884:144;;5003:8;4984:28;;;;;;;;;;;:::i;:::-;;;;;;;;4884:144;4814:225;4627:419;:::o;24649:482::-;24730:13;24762:27;24781:7;24762:18;:27::i;:::-;24730:61;;24812:5;24806:11;;:2;:11;;;24802:48;;24826:24;;;;;;;;;;;;;;24802:48;24890:5;24867:28;;:19;:17;:19::i;:::-;:28;;;24863:175;;24915:44;24932:5;24939:19;:17;:19::i;:::-;24915:16;:44::i;:::-;24910:128;;24987:35;;;;;;;;;;;;;;24910:128;24863:175;25077:2;25050:15;:24;25066:7;25050:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25115:7;25111:2;25095:28;;25104:5;25095:28;;;;;;;;;;;;24719:412;24649:482;;:::o;53605:95::-;53670:7;53693:1;53686:8;;53605:95;:::o;26083:170::-;26217:28;26227:4;26233:2;26237:7;26217:9;:28::i;:::-;26083:170;;;:::o;26324:185::-;26462:39;26479:4;26485:2;26489:7;26462:39;;;;;;;;;;;;:16;:39::i;:::-;26324:185;;;:::o;20425:1129::-;20492:7;20512:12;20527:7;20512:22;;20595:4;20576:15;:13;:15::i;:::-;:23;20572:915;;20629:13;;20622:4;:20;20618:869;;;20667:14;20684:17;:23;20702:4;20684:23;;;;;;;;;;;;20667:40;;20800:1;14896:8;20773:6;:23;:28;20769:699;;21292:113;21309:1;21299:6;:11;21292:113;;21352:17;:25;21370:6;;;;;;;21352:25;;;;;;;;;;;;21343:34;;21292:113;;;21438:6;21431:13;;;;;;20769:699;20644:843;20618:869;20572:915;21515:31;;;;;;;;;;;;;;20425:1129;;;;:::o;51406:191::-;51480:16;51499:6;;;;;;;;;;;51480:25;;51525:8;51516:6;;:17;;;;;;;;;;;;;;;;;;51580:8;51549:40;;51570:8;51549:40;;;;;;;;;;;;51469:128;51406:191;:::o;27588:104::-;27657:27;27667:2;27671:8;27657:27;;;;;;;;;;;;:9;:27::i;:::-;27588:104;;:::o;25473:308::-;25584:19;:17;:19::i;:::-;25572:31;;:8;:31;;;25568:61;;25612:17;;;;;;;;;;;;;;25568:61;25694:8;25642:18;:39;25661:19;:17;:19::i;:::-;25642:39;;;;;;;;;;;;;;;:49;25682:8;25642:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25754:8;25718:55;;25733:19;:17;:19::i;:::-;25718:55;;;25764:8;25718:55;;;;;;:::i;:::-;;;;;;;;25473:308;;:::o;26580:396::-;26747:28;26757:4;26763:2;26767:7;26747:9;:28::i;:::-;26808:1;26790:2;:14;;;:19;26786:183;;26829:56;26860:4;26866:2;26870:7;26879:5;26829:30;:56::i;:::-;26824:145;;26913:40;;;;;;;;;;;;;;26824:145;26786:183;26580:396;;;;:::o;55165:104::-;55225:13;55254:9;55247:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55165:104;:::o;43733:723::-;43789:13;44019:1;44010:5;:10;44006:53;;44037:10;;;;;;;;;;;;;;;;;;;;;44006:53;44069:12;44084:5;44069:20;;44100:14;44125:78;44140:1;44132:4;:9;44125:78;;44158:8;;;;;:::i;:::-;;;;44189:2;44181:10;;;;;:::i;:::-;;;44125:78;;;44213:19;44245:6;44235:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44213:39;;44263:154;44279:1;44270:5;:10;44263:154;;44307:1;44297:11;;;;;:::i;:::-;;;44374:2;44366:5;:10;;;;:::i;:::-;44353:2;:24;;;;:::i;:::-;44340:39;;44323:6;44330;44323:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44403:2;44394:11;;;;;:::i;:::-;;;44263:154;;;44441:6;44427:21;;;;;43733:723;;;;:::o;19093:176::-;19154:7;14126:13;14263:2;19182:18;:25;19201:5;19182:25;;;;;;;;;;;;;;;;:49;;19181:80;19174:87;;19093:176;;;:::o;41213:105::-;41273:7;41300:10;41293:17;;41213:105;:::o;32470:2515::-;32585:27;32615;32634:7;32615:18;:27::i;:::-;32585:57;;32700:4;32659:45;;32675:19;32659:45;;;32655:86;;32713:28;;;;;;;;;;;;;;32655:86;32754:22;32803:4;32780:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32824:43;32841:4;32847:19;:17;:19::i;:::-;32824:16;:43::i;:::-;32780:87;:147;;;;32908:19;:17;:19::i;:::-;32884:43;;:20;32896:7;32884:11;:20::i;:::-;:43;;;32780:147;32754:174;;32946:17;32941:66;;32972:35;;;;;;;;;;;;;;32941:66;33036:1;33022:16;;:2;:16;;;33018:52;;33047:23;;;;;;;;;;;;;;33018:52;33083:43;33105:4;33111:2;33115:7;33124:1;33083:21;:43::i;:::-;33199:15;:24;33215:7;33199:24;;;;;;;;;;;;33192:31;;;;;;;;;;;33591:18;:24;33610:4;33591:24;;;;;;;;;;;;;;;;33589:26;;;;;;;;;;;;33660:18;:22;33679:2;33660:22;;;;;;;;;;;;;;;;33658:24;;;;;;;;;;;15178:8;14780:3;34041:15;:41;;33999:21;34017:2;33999:17;:21::i;:::-;:84;:128;33953:17;:26;33971:7;33953:26;;;;;;;;;;;:174;;;;34297:1;15178:8;34247:19;:46;:51;34243:626;;34319:19;34351:1;34341:7;:11;34319:33;;34508:1;34474:17;:30;34492:11;34474:30;;;;;;;;;;;;:35;34470:384;;34612:13;;34597:11;:28;34593:242;;34792:19;34759:17;:30;34777:11;34759:30;;;;;;;;;;;:52;;;;34593:242;34470:384;34300:569;34243:626;34916:7;34912:2;34897:27;;34906:4;34897:27;;;;;;;;;;;;34935:42;34956:4;34962:2;34966:7;34975:1;34935:20;:42::i;:::-;32574:2411;;32470:2515;;;:::o;28065:2236::-;28188:20;28211:13;;28188:36;;28253:1;28239:16;;:2;:16;;;28235:48;;28264:19;;;;;;;;;;;;;;28235:48;28310:1;28298:8;:13;28294:44;;28320:18;;;;;;;;;;;;;;28294:44;28351:61;28381:1;28385:2;28389:12;28403:8;28351:21;:61::i;:::-;28955:1;14263:2;28926:1;:25;;28925:31;28913:8;:44;28887:18;:22;28906:2;28887:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15043:3;29356:29;29383:1;29371:8;:13;29356:14;:29::i;:::-;:56;;14780:3;29293:15;:41;;29251:21;29269:2;29251:17;:21::i;:::-;:84;:162;29200:17;:31;29218:12;29200:31;;;;;;;;;;;:213;;;;29430:20;29453:12;29430:35;;29480:11;29509:8;29494:12;:23;29480:37;;29556:1;29538:2;:14;;;:19;29534:635;;29578:313;29634:12;29630:2;29609:38;;29626:1;29609:38;;;;;;;;;;;;29675:69;29714:1;29718:2;29722:14;;;;;;29738:5;29675:30;:69::i;:::-;29670:174;;29780:40;;;;;;;;;;;;;;29670:174;29886:3;29871:12;:18;29578:313;;29972:12;29955:13;;:29;29951:43;;29986:8;;;29951:43;29534:635;;;30035:119;30091:14;;;;;;30087:2;30066:40;;30083:1;30066:40;;;;;;;;;;;;30149:3;30134:12;:18;30035:119;;29534:635;30199:12;30183:13;:28;;;;28664:1559;;30233:60;30262:1;30266:2;30270:12;30284:8;30233:20;:60::i;:::-;28177:2124;28065:2236;;;:::o;38682:716::-;38845:4;38891:2;38866:45;;;38912:19;:17;:19::i;:::-;38933:4;38939:7;38948:5;38866:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38862:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39166:1;39149:6;:13;:18;39145:235;;39195:40;;;;;;;;;;;;;;39145:235;39338:6;39332:13;39323:6;39319:2;39315:15;39308:38;38862:529;39035:54;;;39025:64;;;:6;:64;;;;39018:71;;;38682:716;;;;;;:::o;40046:159::-;;;;;:::o;24210:148::-;24274:14;24335:5;24325:15;;24210:148;;;:::o;40864:158::-;;;;;:::o;24445:142::-;24503:14;24564:5;24554:15;;24445:142;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:117::-;5244:1;5241;5234:12;5258:117;5367:1;5364;5357:12;5381:180;5429:77;5426:1;5419:88;5526:4;5523:1;5516:15;5550:4;5547:1;5540:15;5567:281;5650:27;5672:4;5650:27;:::i;:::-;5642:6;5638:40;5780:6;5768:10;5765:22;5744:18;5732:10;5729:34;5726:62;5723:88;;;5791:18;;:::i;:::-;5723:88;5831:10;5827:2;5820:22;5610:238;5567:281;;:::o;5854:129::-;5888:6;5915:20;;:::i;:::-;5905:30;;5944:33;5972:4;5964:6;5944:33;:::i;:::-;5854:129;;;:::o;5989:308::-;6051:4;6141:18;6133:6;6130:30;6127:56;;;6163:18;;:::i;:::-;6127:56;6201:29;6223:6;6201:29;:::i;:::-;6193:37;;6285:4;6279;6275:15;6267:23;;5989:308;;;:::o;6303:148::-;6401:6;6396:3;6391;6378:30;6442:1;6433:6;6428:3;6424:16;6417:27;6303:148;;;:::o;6457:425::-;6535:5;6560:66;6576:49;6618:6;6576:49;:::i;:::-;6560:66;:::i;:::-;6551:75;;6649:6;6642:5;6635:21;6687:4;6680:5;6676:16;6725:3;6716:6;6711:3;6707:16;6704:25;6701:112;;;6732:79;;:::i;:::-;6701:112;6822:54;6869:6;6864:3;6859;6822:54;:::i;:::-;6541:341;6457:425;;;;;:::o;6902:340::-;6958:5;7007:3;7000:4;6992:6;6988:17;6984:27;6974:122;;7015:79;;:::i;:::-;6974:122;7132:6;7119:20;7157:79;7232:3;7224:6;7217:4;7209:6;7205:17;7157:79;:::i;:::-;7148:88;;6964:278;6902:340;;;;:::o;7248:509::-;7317:6;7366:2;7354:9;7345:7;7341:23;7337:32;7334:119;;;7372:79;;:::i;:::-;7334:119;7520:1;7509:9;7505:17;7492:31;7550:18;7542:6;7539:30;7536:117;;;7572:79;;:::i;:::-;7536:117;7677:63;7732:7;7723:6;7712:9;7708:22;7677:63;:::i;:::-;7667:73;;7463:287;7248:509;;;;:::o;7763:116::-;7833:21;7848:5;7833:21;:::i;:::-;7826:5;7823:32;7813:60;;7869:1;7866;7859:12;7813:60;7763:116;:::o;7885:133::-;7928:5;7966:6;7953:20;7944:29;;7982:30;8006:5;7982:30;:::i;:::-;7885:133;;;;:::o;8024:323::-;8080:6;8129:2;8117:9;8108:7;8104:23;8100:32;8097:119;;;8135:79;;:::i;:::-;8097:119;8255:1;8280:50;8322:7;8313:6;8302:9;8298:22;8280:50;:::i;:::-;8270:60;;8226:114;8024:323;;;;:::o;8353:619::-;8430:6;8438;8446;8495:2;8483:9;8474:7;8470:23;8466:32;8463:119;;;8501:79;;:::i;:::-;8463:119;8621:1;8646:53;8691:7;8682:6;8671:9;8667:22;8646:53;:::i;:::-;8636:63;;8592:117;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8353:619;;;;;:::o;8978:60::-;9006:3;9027:5;9020:12;;8978:60;;;:::o;9044:142::-;9094:9;9127:53;9145:34;9154:24;9172:5;9154:24;:::i;:::-;9145:34;:::i;:::-;9127:53;:::i;:::-;9114:66;;9044:142;;;:::o;9192:126::-;9242:9;9275:37;9306:5;9275:37;:::i;:::-;9262:50;;9192:126;;;:::o;9324:157::-;9405:9;9438:37;9469:5;9438:37;:::i;:::-;9425:50;;9324:157;;;:::o;9487:193::-;9605:68;9667:5;9605:68;:::i;:::-;9600:3;9593:81;9487:193;;:::o;9686:284::-;9810:4;9848:2;9837:9;9833:18;9825:26;;9861:102;9960:1;9949:9;9945:17;9936:6;9861:102;:::i;:::-;9686:284;;;;:::o;9976:329::-;10035:6;10084:2;10072:9;10063:7;10059:23;10055:32;10052:119;;;10090:79;;:::i;:::-;10052:119;10210:1;10235:53;10280:7;10271:6;10260:9;10256:22;10235:53;:::i;:::-;10225:63;;10181:117;9976:329;;;;:::o;10311:468::-;10376:6;10384;10433:2;10421:9;10412:7;10408:23;10404:32;10401:119;;;10439:79;;:::i;:::-;10401:119;10559:1;10584:53;10629:7;10620:6;10609:9;10605:22;10584:53;:::i;:::-;10574:63;;10530:117;10686:2;10712:50;10754:7;10745:6;10734:9;10730:22;10712:50;:::i;:::-;10702:60;;10657:115;10311:468;;;;;:::o;10785:307::-;10846:4;10936:18;10928:6;10925:30;10922:56;;;10958:18;;:::i;:::-;10922:56;10996:29;11018:6;10996:29;:::i;:::-;10988:37;;11080:4;11074;11070:15;11062:23;;10785:307;;;:::o;11098:423::-;11175:5;11200:65;11216:48;11257:6;11216:48;:::i;:::-;11200:65;:::i;:::-;11191:74;;11288:6;11281:5;11274:21;11326:4;11319:5;11315:16;11364:3;11355:6;11350:3;11346:16;11343:25;11340:112;;;11371:79;;:::i;:::-;11340:112;11461:54;11508:6;11503:3;11498;11461:54;:::i;:::-;11181:340;11098:423;;;;;:::o;11540:338::-;11595:5;11644:3;11637:4;11629:6;11625:17;11621:27;11611:122;;11652:79;;:::i;:::-;11611:122;11769:6;11756:20;11794:78;11868:3;11860:6;11853:4;11845:6;11841:17;11794:78;:::i;:::-;11785:87;;11601:277;11540:338;;;;:::o;11884:943::-;11979:6;11987;11995;12003;12052:3;12040:9;12031:7;12027:23;12023:33;12020:120;;;12059:79;;:::i;:::-;12020:120;12179:1;12204:53;12249:7;12240:6;12229:9;12225:22;12204:53;:::i;:::-;12194:63;;12150:117;12306:2;12332:53;12377:7;12368:6;12357:9;12353:22;12332:53;:::i;:::-;12322:63;;12277:118;12434:2;12460:53;12505:7;12496:6;12485:9;12481:22;12460:53;:::i;:::-;12450:63;;12405:118;12590:2;12579:9;12575:18;12562:32;12621:18;12613:6;12610:30;12607:117;;;12643:79;;:::i;:::-;12607:117;12748:62;12802:7;12793:6;12782:9;12778:22;12748:62;:::i;:::-;12738:72;;12533:287;11884:943;;;;;;;:::o;12833:474::-;12901:6;12909;12958:2;12946:9;12937:7;12933:23;12929:32;12926:119;;;12964:79;;:::i;:::-;12926:119;13084:1;13109:53;13154:7;13145:6;13134:9;13130:22;13109:53;:::i;:::-;13099:63;;13055:117;13211:2;13237:53;13282:7;13273:6;13262:9;13258:22;13237:53;:::i;:::-;13227:63;;13182:118;12833:474;;;;;:::o;13313:::-;13381:6;13389;13438:2;13426:9;13417:7;13413:23;13409:32;13406:119;;;13444:79;;:::i;:::-;13406:119;13564:1;13589:53;13634:7;13625:6;13614:9;13610:22;13589:53;:::i;:::-;13579:63;;13535:117;13691:2;13717:53;13762:7;13753:6;13742:9;13738:22;13717:53;:::i;:::-;13707:63;;13662:118;13313:474;;;;;:::o;13793:180::-;13841:77;13838:1;13831:88;13938:4;13935:1;13928:15;13962:4;13959:1;13952:15;13979:320;14023:6;14060:1;14054:4;14050:12;14040:22;;14107:1;14101:4;14097:12;14128:18;14118:81;;14184:4;14176:6;14172:17;14162:27;;14118:81;14246:2;14238:6;14235:14;14215:18;14212:38;14209:84;;14265:18;;:::i;:::-;14209:84;14030:269;13979:320;;;:::o;14305:182::-;14445:34;14441:1;14433:6;14429:14;14422:58;14305:182;:::o;14493:366::-;14635:3;14656:67;14720:2;14715:3;14656:67;:::i;:::-;14649:74;;14732:93;14821:3;14732:93;:::i;:::-;14850:2;14845:3;14841:12;14834:19;;14493:366;;;:::o;14865:419::-;15031:4;15069:2;15058:9;15054:18;15046:26;;15118:9;15112:4;15108:20;15104:1;15093:9;15089:17;15082:47;15146:131;15272:4;15146:131;:::i;:::-;15138:139;;14865:419;;;:::o;15290:141::-;15339:4;15362:3;15354:11;;15385:3;15382:1;15375:14;15419:4;15416:1;15406:18;15398:26;;15290:141;;;:::o;15437:93::-;15474:6;15521:2;15516;15509:5;15505:14;15501:23;15491:33;;15437:93;;;:::o;15536:107::-;15580:8;15630:5;15624:4;15620:16;15599:37;;15536:107;;;;:::o;15649:393::-;15718:6;15768:1;15756:10;15752:18;15791:97;15821:66;15810:9;15791:97;:::i;:::-;15909:39;15939:8;15928:9;15909:39;:::i;:::-;15897:51;;15981:4;15977:9;15970:5;15966:21;15957:30;;16030:4;16020:8;16016:19;16009:5;16006:30;15996:40;;15725:317;;15649:393;;;;;:::o;16048:142::-;16098:9;16131:53;16149:34;16158:24;16176:5;16158:24;:::i;:::-;16149:34;:::i;:::-;16131:53;:::i;:::-;16118:66;;16048:142;;;:::o;16196:75::-;16239:3;16260:5;16253:12;;16196:75;;;:::o;16277:269::-;16387:39;16418:7;16387:39;:::i;:::-;16448:91;16497:41;16521:16;16497:41;:::i;:::-;16489:6;16482:4;16476:11;16448:91;:::i;:::-;16442:4;16435:105;16353:193;16277:269;;;:::o;16552:73::-;16597:3;16552:73;:::o;16631:189::-;16708:32;;:::i;:::-;16749:65;16807:6;16799;16793:4;16749:65;:::i;:::-;16684:136;16631:189;;:::o;16826:186::-;16886:120;16903:3;16896:5;16893:14;16886:120;;;16957:39;16994:1;16987:5;16957:39;:::i;:::-;16930:1;16923:5;16919:13;16910:22;;16886:120;;;16826:186;;:::o;17018:543::-;17119:2;17114:3;17111:11;17108:446;;;17153:38;17185:5;17153:38;:::i;:::-;17237:29;17255:10;17237:29;:::i;:::-;17227:8;17223:44;17420:2;17408:10;17405:18;17402:49;;;17441:8;17426:23;;17402:49;17464:80;17520:22;17538:3;17520:22;:::i;:::-;17510:8;17506:37;17493:11;17464:80;:::i;:::-;17123:431;;17108:446;17018:543;;;:::o;17567:117::-;17621:8;17671:5;17665:4;17661:16;17640:37;;17567:117;;;;:::o;17690:169::-;17734:6;17767:51;17815:1;17811:6;17803:5;17800:1;17796:13;17767:51;:::i;:::-;17763:56;17848:4;17842;17838:15;17828:25;;17741:118;17690:169;;;;:::o;17864:295::-;17940:4;18086:29;18111:3;18105:4;18086:29;:::i;:::-;18078:37;;18148:3;18145:1;18141:11;18135:4;18132:21;18124:29;;17864:295;;;;:::o;18164:1395::-;18281:37;18314:3;18281:37;:::i;:::-;18383:18;18375:6;18372:30;18369:56;;;18405:18;;:::i;:::-;18369:56;18449:38;18481:4;18475:11;18449:38;:::i;:::-;18534:67;18594:6;18586;18580:4;18534:67;:::i;:::-;18628:1;18652:4;18639:17;;18684:2;18676:6;18673:14;18701:1;18696:618;;;;19358:1;19375:6;19372:77;;;19424:9;19419:3;19415:19;19409:26;19400:35;;19372:77;19475:67;19535:6;19528:5;19475:67;:::i;:::-;19469:4;19462:81;19331:222;18666:887;;18696:618;18748:4;18744:9;18736:6;18732:22;18782:37;18814:4;18782:37;:::i;:::-;18841:1;18855:208;18869:7;18866:1;18863:14;18855:208;;;18948:9;18943:3;18939:19;18933:26;18925:6;18918:42;18999:1;18991:6;18987:14;18977:24;;19046:2;19035:9;19031:18;19018:31;;18892:4;18889:1;18885:12;18880:17;;18855:208;;;19091:6;19082:7;19079:19;19076:179;;;19149:9;19144:3;19140:19;19134:26;19192:48;19234:4;19226:6;19222:17;19211:9;19192:48;:::i;:::-;19184:6;19177:64;19099:156;19076:179;19301:1;19297;19289:6;19285:14;19281:22;19275:4;19268:36;18703:611;;;18666:887;;18256:1303;;;18164:1395;;:::o;19565:181::-;19705:33;19701:1;19693:6;19689:14;19682:57;19565:181;:::o;19752:366::-;19894:3;19915:67;19979:2;19974:3;19915:67;:::i;:::-;19908:74;;19991:93;20080:3;19991:93;:::i;:::-;20109:2;20104:3;20100:12;20093:19;;19752:366;;;:::o;20124:419::-;20290:4;20328:2;20317:9;20313:18;20305:26;;20377:9;20371:4;20367:20;20363:1;20352:9;20348:17;20341:47;20405:131;20531:4;20405:131;:::i;:::-;20397:139;;20124:419;;;:::o;20549:147::-;20650:11;20687:3;20672:18;;20549:147;;;;:::o;20702:114::-;;:::o;20822:398::-;20981:3;21002:83;21083:1;21078:3;21002:83;:::i;:::-;20995:90;;21094:93;21183:3;21094:93;:::i;:::-;21212:1;21207:3;21203:11;21196:18;;20822:398;;;:::o;21226:379::-;21410:3;21432:147;21575:3;21432:147;:::i;:::-;21425:154;;21596:3;21589:10;;21226:379;;;:::o;21611:174::-;21751:26;21747:1;21739:6;21735:14;21728:50;21611:174;:::o;21791:366::-;21933:3;21954:67;22018:2;22013:3;21954:67;:::i;:::-;21947:74;;22030:93;22119:3;22030:93;:::i;:::-;22148:2;22143:3;22139:12;22132:19;;21791:366;;;:::o;22163:419::-;22329:4;22367:2;22356:9;22352:18;22344:26;;22416:9;22410:4;22406:20;22402:1;22391:9;22387:17;22380:47;22444:131;22570:4;22444:131;:::i;:::-;22436:139;;22163:419;;;:::o;22588:177::-;22728:29;22724:1;22716:6;22712:14;22705:53;22588:177;:::o;22771:366::-;22913:3;22934:67;22998:2;22993:3;22934:67;:::i;:::-;22927:74;;23010:93;23099:3;23010:93;:::i;:::-;23128:2;23123:3;23119:12;23112:19;;22771:366;;;:::o;23143:419::-;23309:4;23347:2;23336:9;23332:18;23324:26;;23396:9;23390:4;23386:20;23382:1;23371:9;23367:17;23360:47;23424:131;23550:4;23424:131;:::i;:::-;23416:139;;23143:419;;;:::o;23568:180::-;23616:77;23613:1;23606:88;23713:4;23710:1;23703:15;23737:4;23734:1;23727:15;23754:191;23794:3;23813:20;23831:1;23813:20;:::i;:::-;23808:25;;23847:20;23865:1;23847:20;:::i;:::-;23842:25;;23890:1;23887;23883:9;23876:16;;23911:3;23908:1;23905:10;23902:36;;;23918:18;;:::i;:::-;23902:36;23754:191;;;;:::o;23951:164::-;24091:16;24087:1;24079:6;24075:14;24068:40;23951:164;:::o;24121:366::-;24263:3;24284:67;24348:2;24343:3;24284:67;:::i;:::-;24277:74;;24360:93;24449:3;24360:93;:::i;:::-;24478:2;24473:3;24469:12;24462:19;;24121:366;;;:::o;24493:419::-;24659:4;24697:2;24686:9;24682:18;24674:26;;24746:9;24740:4;24736:20;24732:1;24721:9;24717:17;24710:47;24774:131;24900:4;24774:131;:::i;:::-;24766:139;;24493:419;;;:::o;24918:176::-;25058:28;25054:1;25046:6;25042:14;25035:52;24918:176;:::o;25100:366::-;25242:3;25263:67;25327:2;25322:3;25263:67;:::i;:::-;25256:74;;25339:93;25428:3;25339:93;:::i;:::-;25457:2;25452:3;25448:12;25441:19;;25100:366;;;:::o;25472:419::-;25638:4;25676:2;25665:9;25661:18;25653:26;;25725:9;25719:4;25715:20;25711:1;25700:9;25696:17;25689:47;25753:131;25879:4;25753:131;:::i;:::-;25745:139;;25472:419;;;:::o;25897:222::-;26037:34;26033:1;26025:6;26021:14;26014:58;26106:5;26101:2;26093:6;26089:15;26082:30;25897:222;:::o;26125:366::-;26267:3;26288:67;26352:2;26347:3;26288:67;:::i;:::-;26281:74;;26364:93;26453:3;26364:93;:::i;:::-;26482:2;26477:3;26473:12;26466:19;;26125:366;;;:::o;26497:419::-;26663:4;26701:2;26690:9;26686:18;26678:26;;26750:9;26744:4;26740:20;26736:1;26725:9;26721:17;26714:47;26778:131;26904:4;26778:131;:::i;:::-;26770:139;;26497:419;;;:::o;26922:194::-;26962:4;26982:20;27000:1;26982:20;:::i;:::-;26977:25;;27016:20;27034:1;27016:20;:::i;:::-;27011:25;;27060:1;27057;27053:9;27045:17;;27084:1;27078:4;27075:11;27072:37;;;27089:18;;:::i;:::-;27072:37;26922:194;;;;:::o;27122:410::-;27162:7;27185:20;27203:1;27185:20;:::i;:::-;27180:25;;27219:20;27237:1;27219:20;:::i;:::-;27214:25;;27274:1;27271;27267:9;27296:30;27314:11;27296:30;:::i;:::-;27285:41;;27475:1;27466:7;27462:15;27459:1;27456:22;27436:1;27429:9;27409:83;27386:139;;27505:18;;:::i;:::-;27386:139;27170:362;27122:410;;;;:::o;27538:179::-;27678:31;27674:1;27666:6;27662:14;27655:55;27538:179;:::o;27723:366::-;27865:3;27886:67;27950:2;27945:3;27886:67;:::i;:::-;27879:74;;27962:93;28051:3;27962:93;:::i;:::-;28080:2;28075:3;28071:12;28064:19;;27723:366;;;:::o;28095:419::-;28261:4;28299:2;28288:9;28284:18;28276:26;;28348:9;28342:4;28338:20;28334:1;28323:9;28319:17;28312:47;28376:131;28502:4;28376:131;:::i;:::-;28368:139;;28095:419;;;:::o;28520:234::-;28660:34;28656:1;28648:6;28644:14;28637:58;28729:17;28724:2;28716:6;28712:15;28705:42;28520:234;:::o;28760:366::-;28902:3;28923:67;28987:2;28982:3;28923:67;:::i;:::-;28916:74;;28999:93;29088:3;28999:93;:::i;:::-;29117:2;29112:3;29108:12;29101:19;;28760:366;;;:::o;29132:419::-;29298:4;29336:2;29325:9;29321:18;29313:26;;29385:9;29379:4;29375:20;29371:1;29360:9;29356:17;29349:47;29413:131;29539:4;29413:131;:::i;:::-;29405:139;;29132:419;;;:::o;29557:148::-;29659:11;29696:3;29681:18;;29557:148;;;;:::o;29711:390::-;29817:3;29845:39;29878:5;29845:39;:::i;:::-;29900:89;29982:6;29977:3;29900:89;:::i;:::-;29893:96;;29998:65;30056:6;30051:3;30044:4;30037:5;30033:16;29998:65;:::i;:::-;30088:6;30083:3;30079:16;30072:23;;29821:280;29711:390;;;;:::o;30131:874::-;30234:3;30271:5;30265:12;30300:36;30326:9;30300:36;:::i;:::-;30352:89;30434:6;30429:3;30352:89;:::i;:::-;30345:96;;30472:1;30461:9;30457:17;30488:1;30483:166;;;;30663:1;30658:341;;;;30450:549;;30483:166;30567:4;30563:9;30552;30548:25;30543:3;30536:38;30629:6;30622:14;30615:22;30607:6;30603:35;30598:3;30594:45;30587:52;;30483:166;;30658:341;30725:38;30757:5;30725:38;:::i;:::-;30785:1;30799:154;30813:6;30810:1;30807:13;30799:154;;;30887:7;30881:14;30877:1;30872:3;30868:11;30861:35;30937:1;30928:7;30924:15;30913:26;;30835:4;30832:1;30828:12;30823:17;;30799:154;;;30982:6;30977:3;30973:16;30966:23;;30665:334;;30450:549;;30238:767;;30131:874;;;;:::o;31011:589::-;31236:3;31258:95;31349:3;31340:6;31258:95;:::i;:::-;31251:102;;31370:95;31461:3;31452:6;31370:95;:::i;:::-;31363:102;;31482:92;31570:3;31561:6;31482:92;:::i;:::-;31475:99;;31591:3;31584:10;;31011:589;;;;;;:::o;31606:170::-;31746:22;31742:1;31734:6;31730:14;31723:46;31606:170;:::o;31782:366::-;31924:3;31945:67;32009:2;32004:3;31945:67;:::i;:::-;31938:74;;32021:93;32110:3;32021:93;:::i;:::-;32139:2;32134:3;32130:12;32123:19;;31782:366;;;:::o;32154:419::-;32320:4;32358:2;32347:9;32343:18;32335:26;;32407:9;32401:4;32397:20;32393:1;32382:9;32378:17;32371:47;32435:131;32561:4;32435:131;:::i;:::-;32427:139;;32154:419;;;:::o;32579:225::-;32719:34;32715:1;32707:6;32703:14;32696:58;32788:8;32783:2;32775:6;32771:15;32764:33;32579:225;:::o;32810:366::-;32952:3;32973:67;33037:2;33032:3;32973:67;:::i;:::-;32966:74;;33049:93;33138:3;33049:93;:::i;:::-;33167:2;33162:3;33158:12;33151:19;;32810:366;;;:::o;33182:419::-;33348:4;33386:2;33375:9;33371:18;33363:26;;33435:9;33429:4;33425:20;33421:1;33410:9;33406:17;33399:47;33463:131;33589:4;33463:131;:::i;:::-;33455:139;;33182:419;;;:::o;33607:332::-;33728:4;33766:2;33755:9;33751:18;33743:26;;33779:71;33847:1;33836:9;33832:17;33823:6;33779:71;:::i;:::-;33860:72;33928:2;33917:9;33913:18;33904:6;33860:72;:::i;:::-;33607:332;;;;;:::o;33945:137::-;33999:5;34030:6;34024:13;34015:22;;34046:30;34070:5;34046:30;:::i;:::-;33945:137;;;;:::o;34088:345::-;34155:6;34204:2;34192:9;34183:7;34179:23;34175:32;34172:119;;;34210:79;;:::i;:::-;34172:119;34330:1;34355:61;34408:7;34399:6;34388:9;34384:22;34355:61;:::i;:::-;34345:71;;34301:125;34088:345;;;;:::o;34439:233::-;34478:3;34501:24;34519:5;34501:24;:::i;:::-;34492:33;;34547:66;34540:5;34537:77;34534:103;;34617:18;;:::i;:::-;34534:103;34664:1;34657:5;34653:13;34646:20;;34439:233;;;:::o;34678:180::-;34726:77;34723:1;34716:88;34823:4;34820:1;34813:15;34847:4;34844:1;34837:15;34864:185;34904:1;34921:20;34939:1;34921:20;:::i;:::-;34916:25;;34955:20;34973:1;34955:20;:::i;:::-;34950:25;;34994:1;34984:35;;34999:18;;:::i;:::-;34984:35;35041:1;35038;35034:9;35029:14;;34864:185;;;;:::o;35055:176::-;35087:1;35104:20;35122:1;35104:20;:::i;:::-;35099:25;;35138:20;35156:1;35138:20;:::i;:::-;35133:25;;35177:1;35167:35;;35182:18;;:::i;:::-;35167:35;35223:1;35220;35216:9;35211:14;;35055:176;;;;:::o;35237:180::-;35285:77;35282:1;35275:88;35382:4;35379:1;35372:15;35406:4;35403:1;35396:15;35423:98;35474:6;35508:5;35502:12;35492:22;;35423:98;;;:::o;35527:168::-;35610:11;35644:6;35639:3;35632:19;35684:4;35679:3;35675:14;35660:29;;35527:168;;;;:::o;35701:373::-;35787:3;35815:38;35847:5;35815:38;:::i;:::-;35869:70;35932:6;35927:3;35869:70;:::i;:::-;35862:77;;35948:65;36006:6;36001:3;35994:4;35987:5;35983:16;35948:65;:::i;:::-;36038:29;36060:6;36038:29;:::i;:::-;36033:3;36029:39;36022:46;;35791:283;35701:373;;;;:::o;36080:640::-;36275:4;36313:3;36302:9;36298:19;36290:27;;36327:71;36395:1;36384:9;36380:17;36371:6;36327:71;:::i;:::-;36408:72;36476:2;36465:9;36461:18;36452:6;36408:72;:::i;:::-;36490;36558:2;36547:9;36543:18;36534:6;36490:72;:::i;:::-;36609:9;36603:4;36599:20;36594:2;36583:9;36579:18;36572:48;36637:76;36708:4;36699:6;36637:76;:::i;:::-;36629:84;;36080:640;;;;;;;:::o;36726:141::-;36782:5;36813:6;36807:13;36798:22;;36829:32;36855:5;36829:32;:::i;:::-;36726:141;;;;:::o;36873:349::-;36942:6;36991:2;36979:9;36970:7;36966:23;36962:32;36959:119;;;36997:79;;:::i;:::-;36959:119;37117:1;37142:63;37197:7;37188:6;37177:9;37173:22;37142:63;:::i;:::-;37132:73;;37088:127;36873:349;;;;:::o
Swarm Source
ipfs://923db56aa4d4974b71cbc3f2f52e1d56382d36f840ea13aae54c03f9737e71cf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.