Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,616 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 84501708 | 24 days ago | IN | 0 ETH | 0.00000323 | ||||
| Set Approval For... | 84501707 | 24 days ago | IN | 0 ETH | 0.00000323 | ||||
| Set Approval For... | 84477053 | 31 days ago | IN | 0 ETH | 0.00000143 | ||||
| Set Approval For... | 84319108 | 73 days ago | IN | 0 ETH | 0.00000464 | ||||
| Set Approval For... | 84071517 | 136 days ago | IN | 0 ETH | 0.00000025 | ||||
| Set Approval For... | 83813818 | 194 days ago | IN | 0 ETH | 0.00000026 | ||||
| Set Approval For... | 83788956 | 200 days ago | IN | 0 ETH | 0.00000026 | ||||
| Set Approval For... | 83773226 | 204 days ago | IN | 0 ETH | 0.00000027 | ||||
| Set Approval For... | 83615942 | 245 days ago | IN | 0 ETH | 0.00000026 | ||||
| Set Approval For... | 83590549 | 251 days ago | IN | 0 ETH | 0.00000047 | ||||
| Set Approval For... | 83381131 | 286 days ago | IN | 0 ETH | 0.00000025 | ||||
| Set Approval For... | 82573844 | 331 days ago | IN | 0 ETH | 0.00000025 | ||||
| Set Approval For... | 82148143 | 360 days ago | IN | 0 ETH | 0.00000025 | ||||
| Set Approval For... | 81416466 | 388 days ago | IN | 0 ETH | 0.00000057 | ||||
| Set Approval For... | 81243110 | 396 days ago | IN | 0 ETH | 0.0000005 | ||||
| Set Approval For... | 80956838 | 404 days ago | IN | 0 ETH | 0.0000005 | ||||
| Set Approval For... | 80915837 | 405 days ago | IN | 0 ETH | 0.00000029 | ||||
| Set Approval For... | 80905977 | 406 days ago | IN | 0 ETH | 0.0000005 | ||||
| Set Approval For... | 80459948 | 418 days ago | IN | 0 ETH | 0.00000054 | ||||
| Set Approval For... | 80280196 | 424 days ago | IN | 0 ETH | 0.00000044 | ||||
| Set Approval For... | 80248534 | 425 days ago | IN | 0 ETH | 0.00000036 | ||||
| Set Approval For... | 80207436 | 426 days ago | IN | 0 ETH | 0.00000033 | ||||
| Set Approval For... | 80186479 | 427 days ago | IN | 0 ETH | 0.00000028 | ||||
| Set Approval For... | 80016498 | 432 days ago | IN | 0 ETH | 0.00000033 | ||||
| Set Approval For... | 79988742 | 432 days ago | IN | 0 ETH | 0.00000051 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1184177 | 1165 days ago | 0.004 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.9 <0.9.0;
import './ERC721A.sol';
import './Ownable.sol';
import './MerkleProof.sol';
import './ReentrancyGuard.sol';
contract VibrantApesClub is ERC721A, Ownable, ReentrancyGuard {
using Strings for uint256;
bytes32 public merkleRoot;
mapping(address => bool) public whitelistClaimed;
mapping(address => uint256) public alreadyFreeMinted;
string public uriPrefix = '';
string public uriSuffix = '.json';
string public hiddenMetadataUri;
uint256 public MAX_FREE_PER_WALLET = 3;
uint256 public cost;
uint256 public maxSupply;
uint256 public maxMintAmountPerTx;
bool public paused = true;
bool public whitelistMintEnabled = false;
bool public revealed = true;
constructor(
string memory _tokenName,
string memory _tokenSymbol,
uint256 _cost,
uint256 _maxSupply,
uint256 _maxMintAmountPerTx,
string memory _hiddenMetadataUri
) ERC721A(_tokenName, _tokenSymbol) {
setCost(_cost);
maxSupply = _maxSupply;
setMaxMintAmountPerTx(_maxMintAmountPerTx);
setHiddenMetadataUri(_hiddenMetadataUri);
}
modifier mintCompliance(uint256 _mintAmount) {
require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
_;
}
modifier mintPriceCompliance(uint256 _mintAmount) {
require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
_;
}
function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
// Verify whitelist requirements
require(whitelistMintEnabled, 'The whitelist sale is not enabled!');
require(!whitelistClaimed[_msgSender()], 'Address already claimed!');
bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');
whitelistClaimed[_msgSender()] = true;
_safeMint(_msgSender(), _mintAmount);
}
function mint(uint256 amount) external payable
{
require(amount <= maxMintAmountPerTx,"Maximum of 10 per txn!");
require(_totalMinted() + amount <= maxSupply,"No NFTs lefts!");
require(paused, "Mint not started yet.");
uint payForCount = amount;
uint minted = alreadyFreeMinted[_msgSender()];
if(minted < MAX_FREE_PER_WALLET && _totalMinted() < maxSupply) {
uint remainingFreeMints = MAX_FREE_PER_WALLET - minted;
if(amount > remainingFreeMints) {
payForCount = amount - remainingFreeMints;
}
else {
payForCount = 0;
}
}
require(
msg.value >= payForCount * cost,
'Ether value sent is not sufficient'
);
alreadyFreeMinted[_msgSender()] += amount;
_safeMint(_msgSender(), amount);
}
function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
_safeMint(_receiver, _mintAmount);
}
function mintForTeam(uint256 _mintAmount) public onlyOwner {
_safeMint(_msgSender(),_mintAmount);
}
function walletOfOwner(address _owner) public view returns (uint256[] memory) {
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = _startTokenId();
uint256 ownedTokenIndex = 0;
address latestOwnerAddress;
while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) {
TokenOwnership memory ownership = _ownerships[currentTokenId];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
latestOwnerAddress = ownership.addr;
}
if (latestOwnerAddress == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
}
currentTokenId++;
}
return ownedTokenIds;
}
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 setRevealed(bool _state) public onlyOwner {
revealed = _state;
}
function setCost(uint256 _cost) public onlyOwner {
cost = _cost;
}
function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
maxMintAmountPerTx = _maxMintAmountPerTx;
}
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 setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
merkleRoot = _merkleRoot;
}
function setWhitelistMintEnabled(bool _state) public onlyOwner {
whitelistMintEnabled = _state;
}
function withdraw() public onlyOwner nonReentrant {
// This will transfer the remaining contract balance to the owner.
// Do not remove this otherwise you will not be able to withdraw the funds.
// =============================================================================
(bool os, ) = payable(owner()).call{value: address(this).balance}('');
require(os);
// =============================================================================
}
function _baseURI() internal view virtual override returns (string memory) {
return uriPrefix;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721.sol';
import './IERC721Receiver.sol';
import './IERC721Metadata.sol';
import './Address.sol';
import './Context.sol';
import './Strings.sol';
import './ERC165.sol';
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @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 Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
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;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _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 _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// 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();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* 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 See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].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 {
_addressData[owner].aux = aux;
}
/**
* 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) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// 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.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @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, tokenId.toString())) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @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 == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_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.isContract() && !_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 && !_ownerships[tokenId].burned;
}
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 {
_mint(to, quantity, _data, true);
}
/**
* @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,
bytes memory _data,
bool safe
) 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 {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
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 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 {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// 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 {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is 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 {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// 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 {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
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 Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert 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 {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = _efficientHash(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @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);
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// 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);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","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":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","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":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260405180602001604052806000815250600d9081620000249190620006f2565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90816200006b9190620006f2565b5060036010556001601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff021916908315150217905550348015620000cf57600080fd5b5060405162005a6038038062005a608339818101604052810190620000f591906200096e565b85858160029081620001089190620006f2565b5080600390816200011a9190620006f2565b506200012b620001a160201b60201c565b60008190555050506200015362000147620001aa60201b60201c565b620001b260201b60201c565b60016009819055506200016c846200027860201b60201c565b8260128190555062000184826200031160201b60201c565b6200019581620003aa60201b60201c565b50505050505062000aea565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000288620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ae6200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000307576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fe9062000ac8565b60405180910390fd5b8060118190555050565b62000321620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003476200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003979062000ac8565b60405180910390fd5b8060138190555050565b620003ba620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e06200044e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000439576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004309062000ac8565b60405180910390fd5b80600f90816200044a9190620006f2565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004fa57607f821691505b60208210810362000510576200050f620004b2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200057a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200053b565b6200058686836200053b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005d3620005cd620005c7846200059e565b620005a8565b6200059e565b9050919050565b6000819050919050565b620005ef83620005b2565b62000607620005fe82620005da565b84845462000548565b825550505050565b600090565b6200061e6200060f565b6200062b818484620005e4565b505050565b5b8181101562000653576200064760008262000614565b60018101905062000631565b5050565b601f821115620006a2576200066c8162000516565b62000677846200052b565b8101602085101562000687578190505b6200069f62000696856200052b565b83018262000630565b50505b505050565b600082821c905092915050565b6000620006c760001984600802620006a7565b1980831691505092915050565b6000620006e28383620006b4565b9150826002028217905092915050565b620006fd8262000478565b67ffffffffffffffff81111562000719576200071862000483565b5b620007258254620004e1565b6200073282828562000657565b600060209050601f8311600181146200076a576000841562000755578287015190505b620007618582620006d4565b865550620007d1565b601f1984166200077a8662000516565b60005b82811015620007a4578489015182556001820191506020850194506020810190506200077d565b86831015620007c45784890151620007c0601f891682620006b4565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200081382620007f7565b810181811067ffffffffffffffff8211171562000835576200083462000483565b5b80604052505050565b60006200084a620007d9565b905062000858828262000808565b919050565b600067ffffffffffffffff8211156200087b576200087a62000483565b5b6200088682620007f7565b9050602081019050919050565b60005b83811015620008b357808201518184015260208101905062000896565b60008484015250505050565b6000620008d6620008d0846200085d565b6200083e565b905082815260208101848484011115620008f557620008f4620007f2565b5b6200090284828562000893565b509392505050565b600082601f830112620009225762000921620007ed565b5b815162000934848260208601620008bf565b91505092915050565b62000948816200059e565b81146200095457600080fd5b50565b60008151905062000968816200093d565b92915050565b60008060008060008060c087890312156200098e576200098d620007e3565b5b600087015167ffffffffffffffff811115620009af57620009ae620007e8565b5b620009bd89828a016200090a565b965050602087015167ffffffffffffffff811115620009e157620009e0620007e8565b5b620009ef89828a016200090a565b955050604062000a0289828a0162000957565b945050606062000a1589828a0162000957565b935050608062000a2889828a0162000957565b92505060a087015167ffffffffffffffff81111562000a4c5762000a4b620007e8565b5b62000a5a89828a016200090a565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000ab060208362000a67565b915062000abd8262000a78565b602082019050919050565b6000602082019050818103600083015262000ae38162000aa1565b9050919050565b614f668062000afa6000396000f3fe6080604052600436106102725760003560e01c80636caede3d1161014f578063a45ba8e7116100c1578063d5abeb011161007a578063d5abeb0114610920578063db4bec441461094b578063e0a8085314610988578063e985e9c5146109b1578063efbd73f4146109ee578063f2fde38b14610a1757610272565b8063a45ba8e714610821578063b071401b1461084c578063b767a09814610875578063b88d4fde1461089e578063c87b56dd146108c7578063d2cab0561461090457610272565b80638da5cb5b116101135780638da5cb5b1461073057806394354fd01461075b57806395d89b411461078657806398710d1e146107b1578063a0712d68146107dc578063a22cb465146107f857610272565b80636caede3d1461065f57806370a082311461068a578063715018a6146106c75780637cb64759146106de5780637ec4a6591461070757610272565b80633ccfd60b116101e857806351830227116101ac578063518302271461054d5780635503a0e8146105785780635a4d448a146105a35780635c975abb146105cc57806362b99ad4146105f75780636352211e1461062257610272565b80633ccfd60b1461047e57806342842e0e14610495578063438b6300146104be57806344a0d68a146104fb5780634fdd43cb1461052457610272565b806313faede61161023a57806313faede61461038257806316ba10e0146103ad57806316c38b3c146103d657806318160ddd146103ff57806323b872dd1461042a5780632eb4a7ab1461045357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630cabd4f314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138a3565b610a40565b6040516102ab91906138eb565b60405180910390f35b3480156102c057600080fd5b506102c9610b22565b6040516102d69190613996565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906139ee565b610bb4565b6040516103139190613a5c565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613aa3565b610c30565b005b34801561035157600080fd5b5061036c60048036038101906103679190613ae3565b610d3a565b6040516103799190613b1f565b60405180910390f35b34801561038e57600080fd5b50610397610d52565b6040516103a49190613b1f565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613c6f565b610d58565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613ce4565b610de7565b005b34801561040b57600080fd5b50610414610e80565b6040516104219190613b1f565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613d11565b610e97565b005b34801561045f57600080fd5b50610468610ea7565b6040516104759190613d7d565b60405180910390f35b34801561048a57600080fd5b50610493610ead565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613d11565b610ffe565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613ae3565b61101e565b6040516104f29190613e56565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906139ee565b611231565b005b34801561053057600080fd5b5061054b60048036038101906105469190613c6f565b6112b7565b005b34801561055957600080fd5b50610562611346565b60405161056f91906138eb565b60405180910390f35b34801561058457600080fd5b5061058d611359565b60405161059a9190613996565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c591906139ee565b6113e7565b005b3480156105d857600080fd5b506105e1611477565b6040516105ee91906138eb565b60405180910390f35b34801561060357600080fd5b5061060c61148a565b6040516106199190613996565b60405180910390f35b34801561062e57600080fd5b50610649600480360381019061064491906139ee565b611518565b6040516106569190613a5c565b60405180910390f35b34801561066b57600080fd5b5061067461152e565b60405161068191906138eb565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190613ae3565b611541565b6040516106be9190613b1f565b60405180910390f35b3480156106d357600080fd5b506106dc611610565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613ea4565b611698565b005b34801561071357600080fd5b5061072e60048036038101906107299190613c6f565b61171e565b005b34801561073c57600080fd5b506107456117ad565b6040516107529190613a5c565b60405180910390f35b34801561076757600080fd5b506107706117d7565b60405161077d9190613b1f565b60405180910390f35b34801561079257600080fd5b5061079b6117dd565b6040516107a89190613996565b60405180910390f35b3480156107bd57600080fd5b506107c661186f565b6040516107d39190613b1f565b60405180910390f35b6107f660048036038101906107f191906139ee565b611875565b005b34801561080457600080fd5b5061081f600480360381019061081a9190613ed1565b611ac5565b005b34801561082d57600080fd5b50610836611c3c565b6040516108439190613996565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e91906139ee565b611cca565b005b34801561088157600080fd5b5061089c60048036038101906108979190613ce4565b611d50565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613fb2565b611de9565b005b3480156108d357600080fd5b506108ee60048036038101906108e991906139ee565b611e65565b6040516108fb9190613996565b60405180910390f35b61091e60048036038101906109199190614095565b611fbd565b005b34801561092c57600080fd5b506109356122d1565b6040516109429190613b1f565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613ae3565b6122d7565b60405161097f91906138eb565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613ce4565b6122f7565b005b3480156109bd57600080fd5b506109d860048036038101906109d391906140f5565b612390565b6040516109e591906138eb565b60405180910390f35b3480156109fa57600080fd5b50610a156004803603810190610a109190614135565b612424565b005b348015610a2357600080fd5b50610a3e6004803603810190610a399190613ae3565b612558565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1b5750610b1a8261264f565b5b9050919050565b606060028054610b31906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d906141a4565b8015610baa5780601f10610b7f57610100808354040283529160200191610baa565b820191906000526020600020905b815481529060010190602001808311610b8d57829003601f168201915b5050505050905090565b6000610bbf826126b9565b610bf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3b82611518565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc1612707565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf35750610cf181610cec612707565b612390565b155b15610d2a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3583838361270f565b505050565b600c6020528060005260406000206000915090505481565b60115481565b610d60612707565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614221565b60405180910390fd5b80600e9081610de391906143ed565b5050565b610def612707565b73ffffffffffffffffffffffffffffffffffffffff16610e0d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90614221565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610e8a6127c1565b6001546000540303905090565b610ea28383836127ca565b505050565b600a5481565b610eb5612707565b73ffffffffffffffffffffffffffffffffffffffff16610ed36117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090614221565b60405180910390fd5b600260095403610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f659061450b565b60405180910390fd5b60026009819055506000610f806117ad565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa39061455c565b60006040518083038185875af1925050503d8060008114610fe0576040519150601f19603f3d011682016040523d82523d6000602084013e610fe5565b606091505b5050905080610ff357600080fd5b506001600981905550565b61101983838360405180602001604052806000815250611de9565b505050565b6060600061102b83611541565b905060008167ffffffffffffffff81111561104957611048613b44565b5b6040519080825280602002602001820160405280156110775781602001602082028036833780820191505090505b50905060006110846127c1565b90506000805b848210801561109a575060005483105b15611224576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161121057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111ad57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361120f57838584815181106111f4576111f3614571565b5b602002602001018181525050828061120b906145cf565b9350505b5b838061121b906145cf565b9450505061108a565b8395505050505050919050565b611239612707565b73ffffffffffffffffffffffffffffffffffffffff166112576117ad565b73ffffffffffffffffffffffffffffffffffffffff16146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614221565b60405180910390fd5b8060118190555050565b6112bf612707565b73ffffffffffffffffffffffffffffffffffffffff166112dd6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90614221565b60405180910390fd5b80600f908161134291906143ed565b5050565b601460029054906101000a900460ff1681565b600e8054611366906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611392906141a4565b80156113df5780601f106113b4576101008083540402835291602001916113df565b820191906000526020600020905b8154815290600101906020018083116113c257829003601f168201915b505050505081565b6113ef612707565b73ffffffffffffffffffffffffffffffffffffffff1661140d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90614221565b60405180910390fd5b61147461146e612707565b82612c7e565b50565b601460009054906101000a900460ff1681565b600d8054611497906141a4565b80601f01602080910402602001604051908101604052809291908181526020018280546114c3906141a4565b80156115105780601f106114e557610100808354040283529160200191611510565b820191906000526020600020905b8154815290600101906020018083116114f357829003601f168201915b505050505081565b600061152382612c9c565b600001519050919050565b601460019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611618612707565b73ffffffffffffffffffffffffffffffffffffffff166116366117ad565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614221565b60405180910390fd5b6116966000612f2b565b565b6116a0612707565b73ffffffffffffffffffffffffffffffffffffffff166116be6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614221565b60405180910390fd5b80600a8190555050565b611726612707565b73ffffffffffffffffffffffffffffffffffffffff166117446117ad565b73ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614221565b60405180910390fd5b80600d90816117a991906143ed565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6060600380546117ec906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611818906141a4565b80156118655780601f1061183a57610100808354040283529160200191611865565b820191906000526020600020905b81548152906001019060200180831161184857829003601f168201915b5050505050905090565b60105481565b6013548111156118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614663565b60405180910390fd5b601254816118c6612ff1565b6118d09190614683565b1115611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890614703565b60405180910390fd5b601460009054906101000a900460ff16611960576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119579061476f565b60405180910390fd5b60008190506000600c6000611973612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601054811080156119c957506012546119c7612ff1565b105b15611a02576000816010546119de919061478f565b9050808411156119fb5780846119f4919061478f565b9250611a00565b600092505b505b60115482611a1091906147c3565b341015611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614877565b60405180910390fd5b82600c6000611a5f612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa89190614683565b92505081905550611ac0611aba612707565b84612c7e565b505050565b611acd612707565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b31576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b3e612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611beb612707565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3091906138eb565b60405180910390a35050565b600f8054611c49906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c75906141a4565b8015611cc25780601f10611c9757610100808354040283529160200191611cc2565b820191906000526020600020905b815481529060010190602001808311611ca557829003601f168201915b505050505081565b611cd2612707565b73ffffffffffffffffffffffffffffffffffffffff16611cf06117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614221565b60405180910390fd5b8060138190555050565b611d58612707565b73ffffffffffffffffffffffffffffffffffffffff16611d766117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390614221565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b611df48484846127ca565b611e138373ffffffffffffffffffffffffffffffffffffffff16613004565b8015611e285750611e2684848484613027565b155b15611e5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e70826126b9565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614909565b60405180910390fd5b60001515601460029054906101000a900460ff16151503611f5c57600f8054611ed7906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611f03906141a4565b8015611f505780601f10611f2557610100808354040283529160200191611f50565b820191906000526020600020905b815481529060010190602001808311611f3357829003601f168201915b50505050509050611fb8565b6000611f66613177565b90506000815111611f865760405180602001604052806000815250611fb4565b80611f9084613209565b600e604051602001611fa4939291906149e8565b6040516020818303038152906040525b9150505b919050565b82600081118015611fd057506013548111155b61200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614a65565b60405180910390fd5b6012548161201b610e80565b6120259190614683565b1115612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614ad1565b60405180910390fd5b838060115461207591906147c3565b3410156120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614b3d565b60405180910390fd5b601460019054906101000a900460ff16612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90614bcf565b60405180910390fd5b600b6000612112612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190614c3b565b60405180910390fd5b60006121a4612707565b6040516020016121b49190614ca3565b60405160208183030381529060405280519060200120905061221a858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613369565b612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614d0a565b60405180910390fd5b6001600b6000612267612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122c96122c3612707565b87612c7e565b505050505050565b60125481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6122ff612707565b73ffffffffffffffffffffffffffffffffffffffff1661231d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a90614221565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561243757506013548111155b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90614a65565b60405180910390fd5b60125481612482610e80565b61248c9190614683565b11156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614ad1565b60405180910390fd5b6124d5612707565b73ffffffffffffffffffffffffffffffffffffffff166124f36117ad565b73ffffffffffffffffffffffffffffffffffffffff1614612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090614221565b60405180910390fd5b6125538284612c7e565b505050565b612560612707565b73ffffffffffffffffffffffffffffffffffffffff1661257e6117ad565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614221565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614d9c565b60405180910390fd5b61264c81612f2b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816126c46127c1565b111580156126d3575060005482105b8015612700575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127d582612c9c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612840576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612861612707565b73ffffffffffffffffffffffffffffffffffffffff161480612890575061288f8561288a612707565b612390565b5b806128d5575061289e612707565b73ffffffffffffffffffffffffffffffffffffffff166128bd84610bb4565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061290e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612974576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129818585856001613380565b61298d6000848761270f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c0c576000548214612c0b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c778585856001613386565b5050505050565b612c9882826040518060200160405280600081525061338c565b5050565b612ca46137f4565b600082905080612cb26127c1565b11158015612cc1575060005481105b15612ef4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ef257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612dd6578092505050612f26565b5b600115612ef157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eec578092505050612f26565b612dd7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ffb6127c1565b60005403905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304d612707565b8786866040518563ffffffff1660e01b815260040161306f9493929190614e11565b6020604051808303816000875af19250505080156130ab57506040513d601f19601f820116820180604052508101906130a89190614e72565b60015b613124573d80600081146130db576040519150601f19603f3d011682016040523d82523d6000602084013e6130e0565b606091505b50600081510361311c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054613186906141a4565b80601f01602080910402602001604051908101604052809291908181526020018280546131b2906141a4565b80156131ff5780601f106131d4576101008083540402835291602001916131ff565b820191906000526020600020905b8154815290600101906020018083116131e257829003601f168201915b5050505050905090565b606060008203613250576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613364565b600082905060005b6000821461328257808061326b906145cf565b915050600a8261327b9190614ece565b9150613258565b60008167ffffffffffffffff81111561329e5761329d613b44565b5b6040519080825280601f01601f1916602001820160405280156132d05781602001600182028036833780820191505090505b5090505b6000851461335d576001826132e9919061478f565b9150600a856132f89190614eff565b60306133049190614683565b60f81b81838151811061331a57613319614571565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133569190614ece565b94506132d4565b8093505050505b919050565b600082613376858461339e565b1490509392505050565b50505050565b50505050565b6133998383836001613413565b505050565b60008082905060005b84518110156134085760008582815181106133c5576133c4614571565b5b602002602001015190508083116133e7576133e083826137dd565b92506133f4565b6133f181846137dd565b92505b508080613400906145cf565b9150506133a7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361347f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036134b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c66000868387613380565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613690575061368f8773ffffffffffffffffffffffffffffffffffffffff16613004565b5b15613755575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137056000888480600101955088613027565b61373b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361369657826000541461375057600080fd5b6137c0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613756575b8160008190555050506137d66000868387613386565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138808161384b565b811461388b57600080fd5b50565b60008135905061389d81613877565b92915050565b6000602082840312156138b9576138b8613841565b5b60006138c78482850161388e565b91505092915050565b60008115159050919050565b6138e5816138d0565b82525050565b600060208201905061390060008301846138dc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613940578082015181840152602081019050613925565b60008484015250505050565b6000601f19601f8301169050919050565b600061396882613906565b6139728185613911565b9350613982818560208601613922565b61398b8161394c565b840191505092915050565b600060208201905081810360008301526139b0818461395d565b905092915050565b6000819050919050565b6139cb816139b8565b81146139d657600080fd5b50565b6000813590506139e8816139c2565b92915050565b600060208284031215613a0457613a03613841565b5b6000613a12848285016139d9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a4682613a1b565b9050919050565b613a5681613a3b565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b613a8081613a3b565b8114613a8b57600080fd5b50565b600081359050613a9d81613a77565b92915050565b60008060408385031215613aba57613ab9613841565b5b6000613ac885828601613a8e565b9250506020613ad9858286016139d9565b9150509250929050565b600060208284031215613af957613af8613841565b5b6000613b0784828501613a8e565b91505092915050565b613b19816139b8565b82525050565b6000602082019050613b346000830184613b10565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7c8261394c565b810181811067ffffffffffffffff82111715613b9b57613b9a613b44565b5b80604052505050565b6000613bae613837565b9050613bba8282613b73565b919050565b600067ffffffffffffffff821115613bda57613bd9613b44565b5b613be38261394c565b9050602081019050919050565b82818337600083830152505050565b6000613c12613c0d84613bbf565b613ba4565b905082815260208101848484011115613c2e57613c2d613b3f565b5b613c39848285613bf0565b509392505050565b600082601f830112613c5657613c55613b3a565b5b8135613c66848260208601613bff565b91505092915050565b600060208284031215613c8557613c84613841565b5b600082013567ffffffffffffffff811115613ca357613ca2613846565b5b613caf84828501613c41565b91505092915050565b613cc1816138d0565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b600060208284031215613cfa57613cf9613841565b5b6000613d0884828501613ccf565b91505092915050565b600080600060608486031215613d2a57613d29613841565b5b6000613d3886828701613a8e565b9350506020613d4986828701613a8e565b9250506040613d5a868287016139d9565b9150509250925092565b6000819050919050565b613d7781613d64565b82525050565b6000602082019050613d926000830184613d6e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dcd816139b8565b82525050565b6000613ddf8383613dc4565b60208301905092915050565b6000602082019050919050565b6000613e0382613d98565b613e0d8185613da3565b9350613e1883613db4565b8060005b83811015613e49578151613e308882613dd3565b9750613e3b83613deb565b925050600181019050613e1c565b5085935050505092915050565b60006020820190508181036000830152613e708184613df8565b905092915050565b613e8181613d64565b8114613e8c57600080fd5b50565b600081359050613e9e81613e78565b92915050565b600060208284031215613eba57613eb9613841565b5b6000613ec884828501613e8f565b91505092915050565b60008060408385031215613ee857613ee7613841565b5b6000613ef685828601613a8e565b9250506020613f0785828601613ccf565b9150509250929050565b600067ffffffffffffffff821115613f2c57613f2b613b44565b5b613f358261394c565b9050602081019050919050565b6000613f55613f5084613f11565b613ba4565b905082815260208101848484011115613f7157613f70613b3f565b5b613f7c848285613bf0565b509392505050565b600082601f830112613f9957613f98613b3a565b5b8135613fa9848260208601613f42565b91505092915050565b60008060008060808587031215613fcc57613fcb613841565b5b6000613fda87828801613a8e565b9450506020613feb87828801613a8e565b9350506040613ffc878288016139d9565b925050606085013567ffffffffffffffff81111561401d5761401c613846565b5b61402987828801613f84565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261405557614054613b3a565b5b8235905067ffffffffffffffff81111561407257614071614035565b5b60208301915083602082028301111561408e5761408d61403a565b5b9250929050565b6000806000604084860312156140ae576140ad613841565b5b60006140bc868287016139d9565b935050602084013567ffffffffffffffff8111156140dd576140dc613846565b5b6140e98682870161403f565b92509250509250925092565b6000806040838503121561410c5761410b613841565b5b600061411a85828601613a8e565b925050602061412b85828601613a8e565b9150509250929050565b6000806040838503121561414c5761414b613841565b5b600061415a858286016139d9565b925050602061416b85828601613a8e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141bc57607f821691505b6020821081036141cf576141ce614175565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061420b602083613911565b9150614216826141d5565b602082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614266565b6142ad8683614266565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142ea6142e56142e0846139b8565b6142c5565b6139b8565b9050919050565b6000819050919050565b614304836142cf565b614318614310826142f1565b848454614273565b825550505050565b600090565b61432d614320565b6143388184846142fb565b505050565b5b8181101561435c57614351600082614325565b60018101905061433e565b5050565b601f8211156143a15761437281614241565b61437b84614256565b8101602085101561438a578190505b61439e61439685614256565b83018261433d565b50505b505050565b600082821c905092915050565b60006143c4600019846008026143a6565b1980831691505092915050565b60006143dd83836143b3565b9150826002028217905092915050565b6143f682613906565b67ffffffffffffffff81111561440f5761440e613b44565b5b61441982546141a4565b614424828285614360565b600060209050601f8311600181146144575760008415614445578287015190505b61444f85826143d1565b8655506144b7565b601f19841661446586614241565b60005b8281101561448d57848901518255600182019150602085019450602081019050614468565b868310156144aa57848901516144a6601f8916826143b3565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006144f5601f83613911565b9150614500826144bf565b602082019050919050565b60006020820190508181036000830152614524816144e8565b9050919050565b600081905092915050565b50565b600061454660008361452b565b915061455182614536565b600082019050919050565b600061456782614539565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145da826139b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361460c5761460b6145a0565b5b600182019050919050565b7f4d6178696d756d206f66203130207065722074786e2100000000000000000000600082015250565b600061464d601683613911565b915061465882614617565b602082019050919050565b6000602082019050818103600083015261467c81614640565b9050919050565b600061468e826139b8565b9150614699836139b8565b92508282019050808211156146b1576146b06145a0565b5b92915050565b7f4e6f204e465473206c6566747321000000000000000000000000000000000000600082015250565b60006146ed600e83613911565b91506146f8826146b7565b602082019050919050565b6000602082019050818103600083015261471c816146e0565b9050919050565b7f4d696e74206e6f742073746172746564207965742e0000000000000000000000600082015250565b6000614759601583613911565b915061476482614723565b602082019050919050565b600060208201905081810360008301526147888161474c565b9050919050565b600061479a826139b8565b91506147a5836139b8565b92508282039050818111156147bd576147bc6145a0565b5b92915050565b60006147ce826139b8565b91506147d9836139b8565b92508282026147e7816139b8565b915082820484148315176147fe576147fd6145a0565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000614861602283613911565b915061486c82614805565b604082019050919050565b6000602082019050818103600083015261489081614854565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148f3602f83613911565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b600081905092915050565b600061493f82613906565b6149498185614929565b9350614959818560208601613922565b80840191505092915050565b60008154614972816141a4565b61497c8186614929565b9450600182166000811461499757600181146149ac576149df565b60ff19831686528115158202860193506149df565b6149b585614241565b60005b838110156149d7578154818901526001820191506020810190506149b8565b838801955050505b50505092915050565b60006149f48286614934565b9150614a008285614934565b9150614a0c8284614965565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614a4f601483613911565b9150614a5a82614a19565b602082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614abb601483613911565b9150614ac682614a85565b602082019050919050565b60006020820190508181036000830152614aea81614aae565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614b27601383613911565b9150614b3282614af1565b602082019050919050565b60006020820190508181036000830152614b5681614b1a565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bb9602283613911565b9150614bc482614b5d565b604082019050919050565b60006020820190508181036000830152614be881614bac565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000614c25601883613911565b9150614c3082614bef565b602082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b60008160601b9050919050565b6000614c7382614c5b565b9050919050565b6000614c8582614c68565b9050919050565b614c9d614c9882613a3b565b614c7a565b82525050565b6000614caf8284614c8c565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614cf4600e83613911565b9150614cff82614cbe565b602082019050919050565b60006020820190508181036000830152614d2381614ce7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d86602683613911565b9150614d9182614d2a565b604082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614de382614dbc565b614ded8185614dc7565b9350614dfd818560208601613922565b614e068161394c565b840191505092915050565b6000608082019050614e266000830187613a4d565b614e336020830186613a4d565b614e406040830185613b10565b8181036060830152614e528184614dd8565b905095945050505050565b600081519050614e6c81613877565b92915050565b600060208284031215614e8857614e87613841565b5b6000614e9684828501614e5d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed9826139b8565b9150614ee4836139b8565b925082614ef457614ef3614e9f565b5b828204905092915050565b6000614f0a826139b8565b9150614f15836139b8565b925082614f2557614f24614e9f565b5b82820690509291505056fea2646970667358221220ac4cb0cdf0a888e2a4396d7e62edf542e53a20e2f71a67bac0236e5c58b80de664736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000e35fa931a0000000000000000000000000000000000000000000000000000000000000000270f000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001156696272616e74204170657320436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035641430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e000000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636caede3d1161014f578063a45ba8e7116100c1578063d5abeb011161007a578063d5abeb0114610920578063db4bec441461094b578063e0a8085314610988578063e985e9c5146109b1578063efbd73f4146109ee578063f2fde38b14610a1757610272565b8063a45ba8e714610821578063b071401b1461084c578063b767a09814610875578063b88d4fde1461089e578063c87b56dd146108c7578063d2cab0561461090457610272565b80638da5cb5b116101135780638da5cb5b1461073057806394354fd01461075b57806395d89b411461078657806398710d1e146107b1578063a0712d68146107dc578063a22cb465146107f857610272565b80636caede3d1461065f57806370a082311461068a578063715018a6146106c75780637cb64759146106de5780637ec4a6591461070757610272565b80633ccfd60b116101e857806351830227116101ac578063518302271461054d5780635503a0e8146105785780635a4d448a146105a35780635c975abb146105cc57806362b99ad4146105f75780636352211e1461062257610272565b80633ccfd60b1461047e57806342842e0e14610495578063438b6300146104be57806344a0d68a146104fb5780634fdd43cb1461052457610272565b806313faede61161023a57806313faede61461038257806316ba10e0146103ad57806316c38b3c146103d657806318160ddd146103ff57806323b872dd1461042a5780632eb4a7ab1461045357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630cabd4f314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138a3565b610a40565b6040516102ab91906138eb565b60405180910390f35b3480156102c057600080fd5b506102c9610b22565b6040516102d69190613996565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906139ee565b610bb4565b6040516103139190613a5c565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613aa3565b610c30565b005b34801561035157600080fd5b5061036c60048036038101906103679190613ae3565b610d3a565b6040516103799190613b1f565b60405180910390f35b34801561038e57600080fd5b50610397610d52565b6040516103a49190613b1f565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613c6f565b610d58565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613ce4565b610de7565b005b34801561040b57600080fd5b50610414610e80565b6040516104219190613b1f565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613d11565b610e97565b005b34801561045f57600080fd5b50610468610ea7565b6040516104759190613d7d565b60405180910390f35b34801561048a57600080fd5b50610493610ead565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613d11565b610ffe565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613ae3565b61101e565b6040516104f29190613e56565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906139ee565b611231565b005b34801561053057600080fd5b5061054b60048036038101906105469190613c6f565b6112b7565b005b34801561055957600080fd5b50610562611346565b60405161056f91906138eb565b60405180910390f35b34801561058457600080fd5b5061058d611359565b60405161059a9190613996565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c591906139ee565b6113e7565b005b3480156105d857600080fd5b506105e1611477565b6040516105ee91906138eb565b60405180910390f35b34801561060357600080fd5b5061060c61148a565b6040516106199190613996565b60405180910390f35b34801561062e57600080fd5b50610649600480360381019061064491906139ee565b611518565b6040516106569190613a5c565b60405180910390f35b34801561066b57600080fd5b5061067461152e565b60405161068191906138eb565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190613ae3565b611541565b6040516106be9190613b1f565b60405180910390f35b3480156106d357600080fd5b506106dc611610565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613ea4565b611698565b005b34801561071357600080fd5b5061072e60048036038101906107299190613c6f565b61171e565b005b34801561073c57600080fd5b506107456117ad565b6040516107529190613a5c565b60405180910390f35b34801561076757600080fd5b506107706117d7565b60405161077d9190613b1f565b60405180910390f35b34801561079257600080fd5b5061079b6117dd565b6040516107a89190613996565b60405180910390f35b3480156107bd57600080fd5b506107c661186f565b6040516107d39190613b1f565b60405180910390f35b6107f660048036038101906107f191906139ee565b611875565b005b34801561080457600080fd5b5061081f600480360381019061081a9190613ed1565b611ac5565b005b34801561082d57600080fd5b50610836611c3c565b6040516108439190613996565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e91906139ee565b611cca565b005b34801561088157600080fd5b5061089c60048036038101906108979190613ce4565b611d50565b005b3480156108aa57600080fd5b506108c560048036038101906108c09190613fb2565b611de9565b005b3480156108d357600080fd5b506108ee60048036038101906108e991906139ee565b611e65565b6040516108fb9190613996565b60405180910390f35b61091e60048036038101906109199190614095565b611fbd565b005b34801561092c57600080fd5b506109356122d1565b6040516109429190613b1f565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613ae3565b6122d7565b60405161097f91906138eb565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613ce4565b6122f7565b005b3480156109bd57600080fd5b506109d860048036038101906109d391906140f5565b612390565b6040516109e591906138eb565b60405180910390f35b3480156109fa57600080fd5b50610a156004803603810190610a109190614135565b612424565b005b348015610a2357600080fd5b50610a3e6004803603810190610a399190613ae3565b612558565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1b5750610b1a8261264f565b5b9050919050565b606060028054610b31906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d906141a4565b8015610baa5780601f10610b7f57610100808354040283529160200191610baa565b820191906000526020600020905b815481529060010190602001808311610b8d57829003601f168201915b5050505050905090565b6000610bbf826126b9565b610bf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3b82611518565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc1612707565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf35750610cf181610cec612707565b612390565b155b15610d2a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3583838361270f565b505050565b600c6020528060005260406000206000915090505481565b60115481565b610d60612707565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614221565b60405180910390fd5b80600e9081610de391906143ed565b5050565b610def612707565b73ffffffffffffffffffffffffffffffffffffffff16610e0d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90614221565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610e8a6127c1565b6001546000540303905090565b610ea28383836127ca565b505050565b600a5481565b610eb5612707565b73ffffffffffffffffffffffffffffffffffffffff16610ed36117ad565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090614221565b60405180910390fd5b600260095403610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f659061450b565b60405180910390fd5b60026009819055506000610f806117ad565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fa39061455c565b60006040518083038185875af1925050503d8060008114610fe0576040519150601f19603f3d011682016040523d82523d6000602084013e610fe5565b606091505b5050905080610ff357600080fd5b506001600981905550565b61101983838360405180602001604052806000815250611de9565b505050565b6060600061102b83611541565b905060008167ffffffffffffffff81111561104957611048613b44565b5b6040519080825280602002602001820160405280156110775781602001602082028036833780820191505090505b50905060006110846127c1565b90506000805b848210801561109a575060005483105b15611224576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161121057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111ad57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361120f57838584815181106111f4576111f3614571565b5b602002602001018181525050828061120b906145cf565b9350505b5b838061121b906145cf565b9450505061108a565b8395505050505050919050565b611239612707565b73ffffffffffffffffffffffffffffffffffffffff166112576117ad565b73ffffffffffffffffffffffffffffffffffffffff16146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614221565b60405180910390fd5b8060118190555050565b6112bf612707565b73ffffffffffffffffffffffffffffffffffffffff166112dd6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90614221565b60405180910390fd5b80600f908161134291906143ed565b5050565b601460029054906101000a900460ff1681565b600e8054611366906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611392906141a4565b80156113df5780601f106113b4576101008083540402835291602001916113df565b820191906000526020600020905b8154815290600101906020018083116113c257829003601f168201915b505050505081565b6113ef612707565b73ffffffffffffffffffffffffffffffffffffffff1661140d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90614221565b60405180910390fd5b61147461146e612707565b82612c7e565b50565b601460009054906101000a900460ff1681565b600d8054611497906141a4565b80601f01602080910402602001604051908101604052809291908181526020018280546114c3906141a4565b80156115105780601f106114e557610100808354040283529160200191611510565b820191906000526020600020905b8154815290600101906020018083116114f357829003601f168201915b505050505081565b600061152382612c9c565b600001519050919050565b601460019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611618612707565b73ffffffffffffffffffffffffffffffffffffffff166116366117ad565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614221565b60405180910390fd5b6116966000612f2b565b565b6116a0612707565b73ffffffffffffffffffffffffffffffffffffffff166116be6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90614221565b60405180910390fd5b80600a8190555050565b611726612707565b73ffffffffffffffffffffffffffffffffffffffff166117446117ad565b73ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614221565b60405180910390fd5b80600d90816117a991906143ed565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6060600380546117ec906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611818906141a4565b80156118655780601f1061183a57610100808354040283529160200191611865565b820191906000526020600020905b81548152906001019060200180831161184857829003601f168201915b5050505050905090565b60105481565b6013548111156118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614663565b60405180910390fd5b601254816118c6612ff1565b6118d09190614683565b1115611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890614703565b60405180910390fd5b601460009054906101000a900460ff16611960576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119579061476f565b60405180910390fd5b60008190506000600c6000611973612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601054811080156119c957506012546119c7612ff1565b105b15611a02576000816010546119de919061478f565b9050808411156119fb5780846119f4919061478f565b9250611a00565b600092505b505b60115482611a1091906147c3565b341015611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614877565b60405180910390fd5b82600c6000611a5f612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa89190614683565b92505081905550611ac0611aba612707565b84612c7e565b505050565b611acd612707565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b31576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b3e612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611beb612707565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c3091906138eb565b60405180910390a35050565b600f8054611c49906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c75906141a4565b8015611cc25780601f10611c9757610100808354040283529160200191611cc2565b820191906000526020600020905b815481529060010190602001808311611ca557829003601f168201915b505050505081565b611cd2612707565b73ffffffffffffffffffffffffffffffffffffffff16611cf06117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614221565b60405180910390fd5b8060138190555050565b611d58612707565b73ffffffffffffffffffffffffffffffffffffffff16611d766117ad565b73ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390614221565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b611df48484846127ca565b611e138373ffffffffffffffffffffffffffffffffffffffff16613004565b8015611e285750611e2684848484613027565b155b15611e5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611e70826126b9565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614909565b60405180910390fd5b60001515601460029054906101000a900460ff16151503611f5c57600f8054611ed7906141a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611f03906141a4565b8015611f505780601f10611f2557610100808354040283529160200191611f50565b820191906000526020600020905b815481529060010190602001808311611f3357829003601f168201915b50505050509050611fb8565b6000611f66613177565b90506000815111611f865760405180602001604052806000815250611fb4565b80611f9084613209565b600e604051602001611fa4939291906149e8565b6040516020818303038152906040525b9150505b919050565b82600081118015611fd057506013548111155b61200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614a65565b60405180910390fd5b6012548161201b610e80565b6120259190614683565b1115612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614ad1565b60405180910390fd5b838060115461207591906147c3565b3410156120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614b3d565b60405180910390fd5b601460019054906101000a900460ff16612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90614bcf565b60405180910390fd5b600b6000612112612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190614c3b565b60405180910390fd5b60006121a4612707565b6040516020016121b49190614ca3565b60405160208183030381529060405280519060200120905061221a858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613369565b612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614d0a565b60405180910390fd5b6001600b6000612267612707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122c96122c3612707565b87612c7e565b505050505050565b60125481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6122ff612707565b73ffffffffffffffffffffffffffffffffffffffff1661231d6117ad565b73ffffffffffffffffffffffffffffffffffffffff1614612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a90614221565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561243757506013548111155b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90614a65565b60405180910390fd5b60125481612482610e80565b61248c9190614683565b11156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614ad1565b60405180910390fd5b6124d5612707565b73ffffffffffffffffffffffffffffffffffffffff166124f36117ad565b73ffffffffffffffffffffffffffffffffffffffff1614612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090614221565b60405180910390fd5b6125538284612c7e565b505050565b612560612707565b73ffffffffffffffffffffffffffffffffffffffff1661257e6117ad565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614221565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614d9c565b60405180910390fd5b61264c81612f2b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816126c46127c1565b111580156126d3575060005482105b8015612700575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127d582612c9c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612840576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612861612707565b73ffffffffffffffffffffffffffffffffffffffff161480612890575061288f8561288a612707565b612390565b5b806128d5575061289e612707565b73ffffffffffffffffffffffffffffffffffffffff166128bd84610bb4565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061290e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612974576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129818585856001613380565b61298d6000848761270f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c0c576000548214612c0b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c778585856001613386565b5050505050565b612c9882826040518060200160405280600081525061338c565b5050565b612ca46137f4565b600082905080612cb26127c1565b11158015612cc1575060005481105b15612ef4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ef257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612dd6578092505050612f26565b5b600115612ef157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eec578092505050612f26565b612dd7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ffb6127c1565b60005403905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304d612707565b8786866040518563ffffffff1660e01b815260040161306f9493929190614e11565b6020604051808303816000875af19250505080156130ab57506040513d601f19601f820116820180604052508101906130a89190614e72565b60015b613124573d80600081146130db576040519150601f19603f3d011682016040523d82523d6000602084013e6130e0565b606091505b50600081510361311c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054613186906141a4565b80601f01602080910402602001604051908101604052809291908181526020018280546131b2906141a4565b80156131ff5780601f106131d4576101008083540402835291602001916131ff565b820191906000526020600020905b8154815290600101906020018083116131e257829003601f168201915b5050505050905090565b606060008203613250576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613364565b600082905060005b6000821461328257808061326b906145cf565b915050600a8261327b9190614ece565b9150613258565b60008167ffffffffffffffff81111561329e5761329d613b44565b5b6040519080825280601f01601f1916602001820160405280156132d05781602001600182028036833780820191505090505b5090505b6000851461335d576001826132e9919061478f565b9150600a856132f89190614eff565b60306133049190614683565b60f81b81838151811061331a57613319614571565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133569190614ece565b94506132d4565b8093505050505b919050565b600082613376858461339e565b1490509392505050565b50505050565b50505050565b6133998383836001613413565b505050565b60008082905060005b84518110156134085760008582815181106133c5576133c4614571565b5b602002602001015190508083116133e7576133e083826137dd565b92506133f4565b6133f181846137dd565b92505b508080613400906145cf565b9150506133a7565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361347f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036134b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c66000868387613380565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613690575061368f8773ffffffffffffffffffffffffffffffffffffffff16613004565b5b15613755575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137056000888480600101955088613027565b61373b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361369657826000541461375057600080fd5b6137c0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613756575b8160008190555050506137d66000868387613386565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138808161384b565b811461388b57600080fd5b50565b60008135905061389d81613877565b92915050565b6000602082840312156138b9576138b8613841565b5b60006138c78482850161388e565b91505092915050565b60008115159050919050565b6138e5816138d0565b82525050565b600060208201905061390060008301846138dc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613940578082015181840152602081019050613925565b60008484015250505050565b6000601f19601f8301169050919050565b600061396882613906565b6139728185613911565b9350613982818560208601613922565b61398b8161394c565b840191505092915050565b600060208201905081810360008301526139b0818461395d565b905092915050565b6000819050919050565b6139cb816139b8565b81146139d657600080fd5b50565b6000813590506139e8816139c2565b92915050565b600060208284031215613a0457613a03613841565b5b6000613a12848285016139d9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a4682613a1b565b9050919050565b613a5681613a3b565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b613a8081613a3b565b8114613a8b57600080fd5b50565b600081359050613a9d81613a77565b92915050565b60008060408385031215613aba57613ab9613841565b5b6000613ac885828601613a8e565b9250506020613ad9858286016139d9565b9150509250929050565b600060208284031215613af957613af8613841565b5b6000613b0784828501613a8e565b91505092915050565b613b19816139b8565b82525050565b6000602082019050613b346000830184613b10565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7c8261394c565b810181811067ffffffffffffffff82111715613b9b57613b9a613b44565b5b80604052505050565b6000613bae613837565b9050613bba8282613b73565b919050565b600067ffffffffffffffff821115613bda57613bd9613b44565b5b613be38261394c565b9050602081019050919050565b82818337600083830152505050565b6000613c12613c0d84613bbf565b613ba4565b905082815260208101848484011115613c2e57613c2d613b3f565b5b613c39848285613bf0565b509392505050565b600082601f830112613c5657613c55613b3a565b5b8135613c66848260208601613bff565b91505092915050565b600060208284031215613c8557613c84613841565b5b600082013567ffffffffffffffff811115613ca357613ca2613846565b5b613caf84828501613c41565b91505092915050565b613cc1816138d0565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b600060208284031215613cfa57613cf9613841565b5b6000613d0884828501613ccf565b91505092915050565b600080600060608486031215613d2a57613d29613841565b5b6000613d3886828701613a8e565b9350506020613d4986828701613a8e565b9250506040613d5a868287016139d9565b9150509250925092565b6000819050919050565b613d7781613d64565b82525050565b6000602082019050613d926000830184613d6e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dcd816139b8565b82525050565b6000613ddf8383613dc4565b60208301905092915050565b6000602082019050919050565b6000613e0382613d98565b613e0d8185613da3565b9350613e1883613db4565b8060005b83811015613e49578151613e308882613dd3565b9750613e3b83613deb565b925050600181019050613e1c565b5085935050505092915050565b60006020820190508181036000830152613e708184613df8565b905092915050565b613e8181613d64565b8114613e8c57600080fd5b50565b600081359050613e9e81613e78565b92915050565b600060208284031215613eba57613eb9613841565b5b6000613ec884828501613e8f565b91505092915050565b60008060408385031215613ee857613ee7613841565b5b6000613ef685828601613a8e565b9250506020613f0785828601613ccf565b9150509250929050565b600067ffffffffffffffff821115613f2c57613f2b613b44565b5b613f358261394c565b9050602081019050919050565b6000613f55613f5084613f11565b613ba4565b905082815260208101848484011115613f7157613f70613b3f565b5b613f7c848285613bf0565b509392505050565b600082601f830112613f9957613f98613b3a565b5b8135613fa9848260208601613f42565b91505092915050565b60008060008060808587031215613fcc57613fcb613841565b5b6000613fda87828801613a8e565b9450506020613feb87828801613a8e565b9350506040613ffc878288016139d9565b925050606085013567ffffffffffffffff81111561401d5761401c613846565b5b61402987828801613f84565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261405557614054613b3a565b5b8235905067ffffffffffffffff81111561407257614071614035565b5b60208301915083602082028301111561408e5761408d61403a565b5b9250929050565b6000806000604084860312156140ae576140ad613841565b5b60006140bc868287016139d9565b935050602084013567ffffffffffffffff8111156140dd576140dc613846565b5b6140e98682870161403f565b92509250509250925092565b6000806040838503121561410c5761410b613841565b5b600061411a85828601613a8e565b925050602061412b85828601613a8e565b9150509250929050565b6000806040838503121561414c5761414b613841565b5b600061415a858286016139d9565b925050602061416b85828601613a8e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141bc57607f821691505b6020821081036141cf576141ce614175565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061420b602083613911565b9150614216826141d5565b602082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614266565b6142ad8683614266565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142ea6142e56142e0846139b8565b6142c5565b6139b8565b9050919050565b6000819050919050565b614304836142cf565b614318614310826142f1565b848454614273565b825550505050565b600090565b61432d614320565b6143388184846142fb565b505050565b5b8181101561435c57614351600082614325565b60018101905061433e565b5050565b601f8211156143a15761437281614241565b61437b84614256565b8101602085101561438a578190505b61439e61439685614256565b83018261433d565b50505b505050565b600082821c905092915050565b60006143c4600019846008026143a6565b1980831691505092915050565b60006143dd83836143b3565b9150826002028217905092915050565b6143f682613906565b67ffffffffffffffff81111561440f5761440e613b44565b5b61441982546141a4565b614424828285614360565b600060209050601f8311600181146144575760008415614445578287015190505b61444f85826143d1565b8655506144b7565b601f19841661446586614241565b60005b8281101561448d57848901518255600182019150602085019450602081019050614468565b868310156144aa57848901516144a6601f8916826143b3565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006144f5601f83613911565b9150614500826144bf565b602082019050919050565b60006020820190508181036000830152614524816144e8565b9050919050565b600081905092915050565b50565b600061454660008361452b565b915061455182614536565b600082019050919050565b600061456782614539565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145da826139b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361460c5761460b6145a0565b5b600182019050919050565b7f4d6178696d756d206f66203130207065722074786e2100000000000000000000600082015250565b600061464d601683613911565b915061465882614617565b602082019050919050565b6000602082019050818103600083015261467c81614640565b9050919050565b600061468e826139b8565b9150614699836139b8565b92508282019050808211156146b1576146b06145a0565b5b92915050565b7f4e6f204e465473206c6566747321000000000000000000000000000000000000600082015250565b60006146ed600e83613911565b91506146f8826146b7565b602082019050919050565b6000602082019050818103600083015261471c816146e0565b9050919050565b7f4d696e74206e6f742073746172746564207965742e0000000000000000000000600082015250565b6000614759601583613911565b915061476482614723565b602082019050919050565b600060208201905081810360008301526147888161474c565b9050919050565b600061479a826139b8565b91506147a5836139b8565b92508282039050818111156147bd576147bc6145a0565b5b92915050565b60006147ce826139b8565b91506147d9836139b8565b92508282026147e7816139b8565b915082820484148315176147fe576147fd6145a0565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000614861602283613911565b915061486c82614805565b604082019050919050565b6000602082019050818103600083015261489081614854565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148f3602f83613911565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b600081905092915050565b600061493f82613906565b6149498185614929565b9350614959818560208601613922565b80840191505092915050565b60008154614972816141a4565b61497c8186614929565b9450600182166000811461499757600181146149ac576149df565b60ff19831686528115158202860193506149df565b6149b585614241565b60005b838110156149d7578154818901526001820191506020810190506149b8565b838801955050505b50505092915050565b60006149f48286614934565b9150614a008285614934565b9150614a0c8284614965565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614a4f601483613911565b9150614a5a82614a19565b602082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614abb601483613911565b9150614ac682614a85565b602082019050919050565b60006020820190508181036000830152614aea81614aae565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614b27601383613911565b9150614b3282614af1565b602082019050919050565b60006020820190508181036000830152614b5681614b1a565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bb9602283613911565b9150614bc482614b5d565b604082019050919050565b60006020820190508181036000830152614be881614bac565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000614c25601883613911565b9150614c3082614bef565b602082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b60008160601b9050919050565b6000614c7382614c5b565b9050919050565b6000614c8582614c68565b9050919050565b614c9d614c9882613a3b565b614c7a565b82525050565b6000614caf8284614c8c565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614cf4600e83613911565b9150614cff82614cbe565b602082019050919050565b60006020820190508181036000830152614d2381614ce7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d86602683613911565b9150614d9182614d2a565b604082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614de382614dbc565b614ded8185614dc7565b9350614dfd818560208601613922565b614e068161394c565b840191505092915050565b6000608082019050614e266000830187613a4d565b614e336020830186613a4d565b614e406040830185613b10565b8181036060830152614e528184614dd8565b905095945050505050565b600081519050614e6c81613877565b92915050565b600060208284031215614e8857614e87613841565b5b6000614e9684828501614e5d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed9826139b8565b9150614ee4836139b8565b925082614ef457614ef3614e9f565b5b828204905092915050565b6000614f0a826139b8565b9150614f15836139b8565b925082614f2557614f24614e9f565b5b82820690509291505056fea2646970667358221220ac4cb0cdf0a888e2a4396d7e62edf542e53a20e2f71a67bac0236e5c58b80de664736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000e35fa931a0000000000000000000000000000000000000000000000000000000000000000270f000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001156696272616e74204170657320436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035641430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): Vibrant Apes Club
Arg [1] : _tokenSymbol (string): VAC
Arg [2] : _cost (uint256): 4000000000000000
Arg [3] : _maxSupply (uint256): 9999
Arg [4] : _maxMintAmountPerTx (uint256): 10
Arg [5] : _hiddenMetadataUri (string): ipfs://__CID__/hidden.json
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000000000000000000000000000000e35fa931a0000
Arg [3] : 000000000000000000000000000000000000000000000000000000000000270f
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [7] : 56696272616e74204170657320436c7562000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 5641430000000000000000000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [11] : 697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e000000000000
Deployed Bytecode Sourcemap
184:6038:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4437:305:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7550:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9053:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8616:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;368:52:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;579:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5230:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5336:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3686:303:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9918:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;285:25:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5634:475;;;;;;;;;;;;;:::i;:::-;;10159:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3292:833:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4770:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4986:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;747:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;460:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3179:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;672:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;427:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7358:125:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;702:40:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4806:206:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:9;;;;;;;;;;;;;:::i;:::-;;5419:98:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5124:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1063:87:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;632:33:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7719:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;536:38:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2139:871;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9329:287:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;498:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4850:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5523:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10415:369:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4232:445:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1549:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;603:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;315:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4683:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9687:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3018:155:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4437:305:3;4539:4;4591:25;4576:40;;;:11;:40;;;;:105;;;;4648:33;4633:48;;;:11;:48;;;;4576:105;:158;;;;4698:36;4722:11;4698:23;:36::i;:::-;4576:158;4556:178;;4437:305;;;:::o;7550:100::-;7604:13;7637:5;7630:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7550:100;:::o;9053:204::-;9121:7;9146:16;9154:7;9146;:16::i;:::-;9141:64;;9171:34;;;;;;;;;;;;;;9141:64;9225:15;:24;9241:7;9225:24;;;;;;;;;;;;;;;;;;;;;9218:31;;9053:204;;;:::o;8616:371::-;8689:13;8705:24;8721:7;8705:15;:24::i;:::-;8689:40;;8750:5;8744:11;;:2;:11;;;8740:48;;8764:24;;;;;;;;;;;;;;8740:48;8821:5;8805:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;8831:37;8848:5;8855:12;:10;:12::i;:::-;8831:16;:37::i;:::-;8830:38;8805:63;8801:138;;;8892:35;;;;;;;;;;;;;;8801:138;8951:28;8960:2;8964:7;8973:5;8951:8;:28::i;:::-;8678:309;8616:371;;:::o;368:52:12:-;;;;;;;;;;;;;;;;;:::o;579:19::-;;;;:::o;5230:100::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5314:10:12::1;5302:9;:22;;;;;;:::i;:::-;;5230:100:::0;:::o;5336:77::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5401:6:12::1;5392;;:15;;;;;;;;;;;;;;;;;;5336:77:::0;:::o;3686:303:3:-;3730:7;3955:15;:13;:15::i;:::-;3940:12;;3924:13;;:28;:46;3917:53;;3686:303;:::o;9918:170::-;10052:28;10062:4;10068:2;10072:7;10052:9;:28::i;:::-;9918:170;;;:::o;285:25:12:-;;;;:::o;5634:475::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1:10::1;2376:7;;:19:::0;2368:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2509:7;:18;;;;5931:7:12::2;5952;:5;:7::i;:::-;5944:21;;5973;5944:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5930:69;;;6014:2;6006:11;;;::::0;::::2;;5684:425;1734:1:10::1;2688:7;:22;;;;5634:475:12:o:0;10159:185:3:-;10297:39;10314:4;10320:2;10324:7;10297:39;;;;;;;;;;;;:16;:39::i;:::-;10159:185;;;:::o;3292:833:12:-;3352:16;3377:23;3403:17;3413:6;3403:9;:17::i;:::-;3377:43;;3427:30;3474:15;3460:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3427:63;;3497:22;3522:15;:13;:15::i;:::-;3497:40;;3544:23;3578:26;3613:478;3638:15;3620;:33;:67;;;;;3674:13;;3657:14;:30;3620:67;3613:478;;;3698:31;3732:11;:27;3744:14;3732:27;;;;;;;;;;;3698:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3775:9;:16;;;3770:287;;3834:1;3808:28;;:9;:14;;;:28;;;3804:94;;3872:9;:14;;;3851:35;;3804:94;3936:6;3914:28;;:18;:28;;;3910:138;;3990:14;3957:13;3971:15;3957:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;4019:17;;;;;:::i;:::-;;;;3910:138;3770:287;4067:16;;;;;:::i;:::-;;;;3689:402;3613:478;;;4106:13;4099:20;;;;;;;3292:833;;;:::o;4770:74::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4833:5:12::1;4826:4;:12;;;;4770:74:::0;:::o;4986:132::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5094:18:12::1;5074:17;:38;;;;;;:::i;:::-;;4986:132:::0;:::o;747:27::-;;;;;;;;;;;;;:::o;460:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3179:107::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:35:12::1;3255:12;:10;:12::i;:::-;3268:11;3245:9;:35::i;:::-;3179:107:::0;:::o;672:25::-;;;;;;;;;;;;;:::o;427:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7358:125:3:-;7422:7;7449:21;7462:7;7449:12;:21::i;:::-;:26;;;7442:33;;7358:125;;;:::o;702:40:12:-;;;;;;;;;;;;;:::o;4806:206:3:-;4870:7;4911:1;4894:19;;:5;:19;;;4890:60;;4922:28;;;;;;;;;;;;;;4890:60;4976:12;:19;4989:5;4976:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4968:36;;4961:43;;4806:206;;;:::o;1714:103:9:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;5419:98:12:-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5500:11:12::1;5487:10;:24;;;;5419:98:::0;:::o;5124:100::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5208:10:12::1;5196:9;:22;;;;;;:::i;:::-;;5124:100:::0;:::o;1063:87:9:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;632:33:12:-;;;;:::o;7719:104:3:-;7775:13;7808:7;7801:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7719:104;:::o;536:38:12:-;;;;:::o;2139:871::-;2214:18;;2204:6;:28;;2196:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2298:9;;2288:6;2271:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:36;;2263:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2344:6;;;;;;;;;;;2336:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;2387:16;2406:6;2387:25;;2423:11;2437:17;:31;2455:12;:10;:12::i;:::-;2437:31;;;;;;;;;;;;;;;;2423:45;;2491:19;;2482:6;:28;:58;;;;;2531:9;;2514:14;:12;:14::i;:::-;:26;2482:58;2479:335;;;2557:23;2605:6;2583:19;;:28;;;;:::i;:::-;2557:54;;2638:18;2629:6;:27;2626:177;;;2700:18;2691:6;:27;;;;:::i;:::-;2677:41;;2626:177;;;2786:1;2772:15;;2626:177;2542:272;2479:335;2858:4;;2844:11;:18;;;;:::i;:::-;2831:9;:31;;2818:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;2952:6;2917:17;:31;2935:12;:10;:12::i;:::-;2917:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;2971:31;2981:12;:10;:12::i;:::-;2995:6;2971:9;:31::i;:::-;2191:819;;2139:871;:::o;9329:287:3:-;9440:12;:10;:12::i;:::-;9428:24;;:8;:24;;;9424:54;;9461:17;;;;;;;;;;;;;;9424:54;9536:8;9491:18;:32;9510:12;:10;:12::i;:::-;9491:32;;;;;;;;;;;;;;;:42;9524:8;9491:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;9589:8;9560:48;;9575:12;:10;:12::i;:::-;9560:48;;;9599:8;9560:48;;;;;;:::i;:::-;;;;;;;;9329:287;;:::o;498:31:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4850:130::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4955:19:12::1;4934:18;:40;;;;4850:130:::0;:::o;5523:105::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5616:6:12::1;5593:20;;:29;;;;;;;;;;;;;;;;;;5523:105:::0;:::o;10415:369:3:-;10582:28;10592:4;10598:2;10602:7;10582:9;:28::i;:::-;10625:15;:2;:13;;;:15::i;:::-;:76;;;;;10645:56;10676:4;10682:2;10686:7;10695:5;10645:30;:56::i;:::-;10644:57;10625:76;10621:156;;;10725:40;;;;;;;;;;;;;;10621:156;10415:369;;;;:::o;4232:445:12:-;4306:13;4336:17;4344:8;4336:7;:17::i;:::-;4328:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4430:5;4418:17;;:8;;;;;;;;;;;:17;;;4414:64;;4453:17;4446:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4414:64;4486:28;4517:10;:8;:10::i;:::-;4486:41;;4572:1;4547:14;4541:28;:32;:130;;;;;;;;;;;;;;;;;4609:14;4625:19;:8;:17;:19::i;:::-;4646:9;4592:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4541:130;4534:137;;;4232:445;;;;:::o;1549:582::-;1656:11;1246:1;1232:11;:15;:52;;;;;1266:18;;1251:11;:33;;1232:52;1224:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1355:9;;1340:11;1324:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;1316:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1689:11:::1;1494;1487:4;;:18;;;;:::i;:::-;1474:9;:31;;1466:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1755:20:::2;;;;;;;;;;;1747:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1830:16;:30;1847:12;:10;:12::i;:::-;1830:30;;;;;;;;;;;;;;;;;;;;;;;;;1829:31;1821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1896:12;1938;:10;:12::i;:::-;1921:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;1911:41;;;;;;1896:56;;1967:50;1986:12;;1967:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2000:10;;2012:4;1967:18;:50::i;:::-;1959:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2078:4;2045:16;:30;2062:12;:10;:12::i;:::-;2045:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;2089:36;2099:12;:10;:12::i;:::-;2113:11;2089:9;:36::i;:::-;1702:429;1396:1:::1;1549:582:::0;;;;:::o;603:24::-;;;;:::o;315:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;4683:81::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4752:6:12::1;4741:8;;:17;;;;;;;;;;;;;;;;;;4683:81:::0;:::o;9687:164:3:-;9784:4;9808:18;:25;9827:5;9808:25;;;;;;;;;;;;;;;:35;9834:8;9808:35;;;;;;;;;;;;;;;;;;;;;;;;;9801:42;;9687:164;;;;:::o;3018:155:12:-;3104:11;1246:1;1232:11;:15;:52;;;;;1266:18;;1251:11;:33;;1232:52;1224:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1355:9;;1340:11;1324:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;1316:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1294:12:9::1;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3134:33:12::2;3144:9;3155:11;3134:9;:33::i;:::-;3018:155:::0;;;:::o;1972:201:9:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;::::0;2053:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;854:157:2:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;11039:174:3:-;11096:4;11139:7;11120:15;:13;:15::i;:::-;:26;;:53;;;;;11160:13;;11150:7;:23;11120:53;:85;;;;;11178:11;:20;11190:7;11178:20;;;;;;;;;;;:27;;;;;;;;;;;;11177:28;11120:85;11113:92;;11039:174;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;19196:196:3:-;19338:2;19311:15;:24;19327:7;19311:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19376:7;19372:2;19356:28;;19365:5;19356:28;;;;;;;;;;;;19196:196;;;:::o;4131:95:12:-;4196:7;4219:1;4212:8;;4131:95;:::o;14139:2130:3:-;14254:35;14292:21;14305:7;14292:12;:21::i;:::-;14254:59;;14352:4;14330:26;;:13;:18;;;:26;;;14326:67;;14365:28;;;;;;;;;;;;;;14326:67;14406:22;14448:4;14432:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;14469:36;14486:4;14492:12;:10;:12::i;:::-;14469:16;:36::i;:::-;14432:73;:126;;;;14546:12;:10;:12::i;:::-;14522:36;;:20;14534:7;14522:11;:20::i;:::-;:36;;;14432:126;14406:153;;14577:17;14572:66;;14603:35;;;;;;;;;;;;;;14572:66;14667:1;14653:16;;:2;:16;;;14649:52;;14678:23;;;;;;;;;;;;;;14649:52;14714:43;14736:4;14742:2;14746:7;14755:1;14714:21;:43::i;:::-;14822:35;14839:1;14843:7;14852:4;14822:8;:35::i;:::-;15183:1;15153:12;:18;15166:4;15153:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15227:1;15199:12;:16;15212:2;15199:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15245:31;15279:11;:20;15291:7;15279:20;;;;;;;;;;;15245:54;;15330:2;15314:8;:13;;;:18;;;;;;;;;;;;;;;;;;15380:15;15347:8;:23;;;:49;;;;;;;;;;;;;;;;;;15648:19;15680:1;15670:7;:11;15648:33;;15696:31;15730:11;:24;15742:11;15730:24;;;;;;;;;;;15696:58;;15798:1;15773:27;;:8;:13;;;;;;;;;;;;:27;;;15769:384;;15983:13;;15968:11;:28;15964:174;;16037:4;16021:8;:13;;;:20;;;;;;;;;;;;;;;;;;16090:13;:28;;;16064:8;:23;;;:54;;;;;;;;;;;;;;;;;;15964:174;15769:384;15128:1036;;;16200:7;16196:2;16181:27;;16190:4;16181:27;;;;;;;;;;;;16219:42;16240:4;16246:2;16250:7;16259:1;16219:20;:42::i;:::-;14243:2026;;14139:2130;;;:::o;11221:104::-;11290:27;11300:2;11304:8;11290:27;;;;;;;;;;;;:9;:27::i;:::-;11221:104;;:::o;6187:1109::-;6249:21;;:::i;:::-;6283:12;6298:7;6283:22;;6366:4;6347:15;:13;:15::i;:::-;:23;;:47;;;;;6381:13;;6374:4;:20;6347:47;6343:886;;;6415:31;6449:11;:17;6461:4;6449:17;;;;;;;;;;;6415:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6490:9;:16;;;6485:729;;6561:1;6535:28;;:9;:14;;;:28;;;6531:101;;6599:9;6592:16;;;;;;6531:101;6934:261;6941:4;6934:261;;;6974:6;;;;;;;;7019:11;:17;7031:4;7019:17;;;;;;;;;;;7007:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7093:1;7067:28;;:9;:14;;;:28;;;7063:109;;7135:9;7128:16;;;;;;7063:109;6934:261;;;6485:729;6396:833;6343:886;7257:31;;;;;;;;;;;;;;6187:1109;;;;:::o;2333:191:9:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;4082:283:3:-;4129:7;4331:15;:13;:15::i;:::-;4315:13;;:31;4308:38;;4082:283;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;19884:667:3:-;20047:4;20084:2;20068:36;;;20105:12;:10;:12::i;:::-;20119:4;20125:7;20134:5;20068:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20064:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20319:1;20302:6;:13;:18;20298:235;;20348:40;;;;;;;;;;;;;;20298:235;20491:6;20485:13;20476:6;20472:2;20468:15;20461:38;20064:480;20197:45;;;20187:55;;;:6;:55;;;;20180:62;;;19884:667;;;;;;:::o;6115:104:12:-;6175:13;6204:9;6197:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6115:104;:::o;342:723:11:-;398:13;628:1;619:5;:10;615:53;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;883:190:8:-;1008:4;1061;1032:25;1045:5;1052:4;1032:12;:25::i;:::-;:33;1025:40;;883:190;;;;;:::o;21199:159:3:-;;;;;:::o;22017:158::-;;;;;:::o;11688:163::-;11811:32;11817:2;11821:8;11831:5;11838:4;11811:5;:32::i;:::-;11688:163;;;:::o;1435:675:8:-;1518:7;1538:20;1561:4;1538:27;;1581:9;1576:497;1600:5;:12;1596:1;:16;1576:497;;;1634:20;1657:5;1663:1;1657:8;;;;;;;;:::i;:::-;;;;;;;;1634:31;;1700:12;1684;:28;1680:382;;1827:42;1842:12;1856;1827:14;:42::i;:::-;1812:57;;1680:382;;;2004:42;2019:12;2033;2004:14;:42::i;:::-;1989:57;;1680:382;1619:454;1614:3;;;;;:::i;:::-;;;;1576:497;;;;2090:12;2083:19;;;1435:675;;;;:::o;12110:1775:3:-;12249:20;12272:13;;12249:36;;12314:1;12300:16;;:2;:16;;;12296:48;;12325:19;;;;;;;;;;;;;;12296:48;12371:1;12359:8;:13;12355:44;;12381:18;;;;;;;;;;;;;;12355:44;12412:61;12442:1;12446:2;12450:12;12464:8;12412:21;:61::i;:::-;12785:8;12750:12;:16;12763:2;12750:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12849:8;12809:12;:16;12822:2;12809:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12908:2;12875:11;:25;12887:12;12875:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;12975:15;12925:11;:25;12937:12;12925:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13008:20;13031:12;13008:35;;13058:11;13087:8;13072:12;:23;13058:37;;13116:4;:23;;;;;13124:15;:2;:13;;;:15::i;:::-;13116:23;13112:641;;;13160:314;13216:12;13212:2;13191:38;;13208:1;13191:38;;;;;;;;;;;;13257:69;13296:1;13300:2;13304:14;;;;;;13320:5;13257:30;:69::i;:::-;13252:174;;13362:40;;;;;;;;;;;;;;13252:174;13469:3;13453:12;:19;13160:314;;13555:12;13538:13;;:29;13534:43;;13569:8;;;13534:43;13112:641;;;13618:120;13674:14;;;;;;13670:2;13649:40;;13666:1;13649:40;;;;;;;;;;;;13733:3;13717:12;:19;13618:120;;13112:641;13783:12;13767:13;:28;;;;12725:1082;;13817:60;13846:1;13850:2;13854:12;13868:8;13817:20;:60::i;:::-;12238:1647;12110:1775;;;;:::o;2118:224:8:-;2186:13;2249:1;2243:4;2236:15;2278:1;2272:4;2265:15;2319:4;2313;2303:21;2294:30;;2118:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:13:-;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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:117::-;5686:1;5683;5676:12;5700:117;5809:1;5806;5799:12;5823:180;5871:77;5868:1;5861:88;5968:4;5965:1;5958:15;5992:4;5989:1;5982:15;6009:281;6092:27;6114:4;6092:27;:::i;:::-;6084:6;6080:40;6222:6;6210:10;6207:22;6186:18;6174:10;6171:34;6168:62;6165:88;;;6233:18;;:::i;:::-;6165:88;6273:10;6269:2;6262:22;6052:238;6009:281;;:::o;6296:129::-;6330:6;6357:20;;:::i;:::-;6347:30;;6386:33;6414:4;6406:6;6386:33;:::i;:::-;6296:129;;;:::o;6431:308::-;6493:4;6583:18;6575:6;6572:30;6569:56;;;6605:18;;:::i;:::-;6569:56;6643:29;6665:6;6643:29;:::i;:::-;6635:37;;6727:4;6721;6717:15;6709:23;;6431:308;;;:::o;6745:146::-;6842:6;6837:3;6832;6819:30;6883:1;6874:6;6869:3;6865:16;6858:27;6745:146;;;:::o;6897:425::-;6975:5;7000:66;7016:49;7058:6;7016:49;:::i;:::-;7000:66;:::i;:::-;6991:75;;7089:6;7082:5;7075:21;7127:4;7120:5;7116:16;7165:3;7156:6;7151:3;7147:16;7144:25;7141:112;;;7172:79;;:::i;:::-;7141:112;7262:54;7309:6;7304:3;7299;7262:54;:::i;:::-;6981:341;6897:425;;;;;:::o;7342:340::-;7398:5;7447:3;7440:4;7432:6;7428:17;7424:27;7414:122;;7455:79;;:::i;:::-;7414:122;7572:6;7559:20;7597:79;7672:3;7664:6;7657:4;7649:6;7645:17;7597:79;:::i;:::-;7588:88;;7404:278;7342:340;;;;:::o;7688:509::-;7757:6;7806:2;7794:9;7785:7;7781:23;7777:32;7774:119;;;7812:79;;:::i;:::-;7774:119;7960:1;7949:9;7945:17;7932:31;7990:18;7982:6;7979:30;7976:117;;;8012:79;;:::i;:::-;7976:117;8117:63;8172:7;8163:6;8152:9;8148:22;8117:63;:::i;:::-;8107:73;;7903:287;7688:509;;;;:::o;8203:116::-;8273:21;8288:5;8273:21;:::i;:::-;8266:5;8263:32;8253:60;;8309:1;8306;8299:12;8253:60;8203:116;:::o;8325:133::-;8368:5;8406:6;8393:20;8384:29;;8422:30;8446:5;8422:30;:::i;:::-;8325:133;;;;:::o;8464:323::-;8520:6;8569:2;8557:9;8548:7;8544:23;8540:32;8537:119;;;8575:79;;:::i;:::-;8537:119;8695:1;8720:50;8762:7;8753:6;8742:9;8738:22;8720:50;:::i;:::-;8710:60;;8666:114;8464:323;;;;:::o;8793:619::-;8870:6;8878;8886;8935:2;8923:9;8914:7;8910:23;8906:32;8903:119;;;8941:79;;:::i;:::-;8903:119;9061:1;9086:53;9131:7;9122:6;9111:9;9107:22;9086:53;:::i;:::-;9076:63;;9032:117;9188:2;9214:53;9259:7;9250:6;9239:9;9235:22;9214:53;:::i;:::-;9204:63;;9159:118;9316:2;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9287:118;8793:619;;;;;:::o;9418:77::-;9455:7;9484:5;9473:16;;9418:77;;;:::o;9501:118::-;9588:24;9606:5;9588:24;:::i;:::-;9583:3;9576:37;9501:118;;:::o;9625:222::-;9718:4;9756:2;9745:9;9741:18;9733:26;;9769:71;9837:1;9826:9;9822:17;9813:6;9769:71;:::i;:::-;9625:222;;;;:::o;9853:114::-;9920:6;9954:5;9948:12;9938:22;;9853:114;;;:::o;9973:184::-;10072:11;10106:6;10101:3;10094:19;10146:4;10141:3;10137:14;10122:29;;9973:184;;;;:::o;10163:132::-;10230:4;10253:3;10245:11;;10283:4;10278:3;10274:14;10266:22;;10163:132;;;:::o;10301:108::-;10378:24;10396:5;10378:24;:::i;:::-;10373:3;10366:37;10301:108;;:::o;10415:179::-;10484:10;10505:46;10547:3;10539:6;10505:46;:::i;:::-;10583:4;10578:3;10574:14;10560:28;;10415:179;;;;:::o;10600:113::-;10670:4;10702;10697:3;10693:14;10685:22;;10600:113;;;:::o;10749:732::-;10868:3;10897:54;10945:5;10897:54;:::i;:::-;10967:86;11046:6;11041:3;10967:86;:::i;:::-;10960:93;;11077:56;11127:5;11077:56;:::i;:::-;11156:7;11187:1;11172:284;11197:6;11194:1;11191:13;11172:284;;;11273:6;11267:13;11300:63;11359:3;11344:13;11300:63;:::i;:::-;11293:70;;11386:60;11439:6;11386:60;:::i;:::-;11376:70;;11232:224;11219:1;11216;11212:9;11207:14;;11172:284;;;11176:14;11472:3;11465:10;;10873:608;;;10749:732;;;;:::o;11487:373::-;11630:4;11668:2;11657:9;11653:18;11645:26;;11717:9;11711:4;11707:20;11703:1;11692:9;11688:17;11681:47;11745:108;11848:4;11839:6;11745:108;:::i;:::-;11737:116;;11487:373;;;;:::o;11866:122::-;11939:24;11957:5;11939:24;:::i;:::-;11932:5;11929:35;11919:63;;11978:1;11975;11968:12;11919:63;11866:122;:::o;11994:139::-;12040:5;12078:6;12065:20;12056:29;;12094:33;12121:5;12094:33;:::i;:::-;11994:139;;;;:::o;12139:329::-;12198:6;12247:2;12235:9;12226:7;12222:23;12218:32;12215:119;;;12253:79;;:::i;:::-;12215:119;12373:1;12398:53;12443:7;12434:6;12423:9;12419:22;12398:53;:::i;:::-;12388:63;;12344:117;12139:329;;;;:::o;12474:468::-;12539:6;12547;12596:2;12584:9;12575:7;12571:23;12567:32;12564:119;;;12602:79;;:::i;:::-;12564:119;12722:1;12747:53;12792:7;12783:6;12772:9;12768:22;12747:53;:::i;:::-;12737:63;;12693:117;12849:2;12875:50;12917:7;12908:6;12897:9;12893:22;12875:50;:::i;:::-;12865:60;;12820:115;12474:468;;;;;:::o;12948:307::-;13009:4;13099:18;13091:6;13088:30;13085:56;;;13121:18;;:::i;:::-;13085:56;13159:29;13181:6;13159:29;:::i;:::-;13151:37;;13243:4;13237;13233:15;13225:23;;12948:307;;;:::o;13261:423::-;13338:5;13363:65;13379:48;13420:6;13379:48;:::i;:::-;13363:65;:::i;:::-;13354:74;;13451:6;13444:5;13437:21;13489:4;13482:5;13478:16;13527:3;13518:6;13513:3;13509:16;13506:25;13503:112;;;13534:79;;:::i;:::-;13503:112;13624:54;13671:6;13666:3;13661;13624:54;:::i;:::-;13344:340;13261:423;;;;;:::o;13703:338::-;13758:5;13807:3;13800:4;13792:6;13788:17;13784:27;13774:122;;13815:79;;:::i;:::-;13774:122;13932:6;13919:20;13957:78;14031:3;14023:6;14016:4;14008:6;14004:17;13957:78;:::i;:::-;13948:87;;13764:277;13703:338;;;;:::o;14047:943::-;14142:6;14150;14158;14166;14215:3;14203:9;14194:7;14190:23;14186:33;14183:120;;;14222:79;;:::i;:::-;14183:120;14342:1;14367:53;14412:7;14403:6;14392:9;14388:22;14367:53;:::i;:::-;14357:63;;14313:117;14469:2;14495:53;14540:7;14531:6;14520:9;14516:22;14495:53;:::i;:::-;14485:63;;14440:118;14597:2;14623:53;14668:7;14659:6;14648:9;14644:22;14623:53;:::i;:::-;14613:63;;14568:118;14753:2;14742:9;14738:18;14725:32;14784:18;14776:6;14773:30;14770:117;;;14806:79;;:::i;:::-;14770:117;14911:62;14965:7;14956:6;14945:9;14941:22;14911:62;:::i;:::-;14901:72;;14696:287;14047:943;;;;;;;:::o;14996:117::-;15105:1;15102;15095:12;15119:117;15228:1;15225;15218:12;15259:568;15332:8;15342:6;15392:3;15385:4;15377:6;15373:17;15369:27;15359:122;;15400:79;;:::i;:::-;15359:122;15513:6;15500:20;15490:30;;15543:18;15535:6;15532:30;15529:117;;;15565:79;;:::i;:::-;15529:117;15679:4;15671:6;15667:17;15655:29;;15733:3;15725:4;15717:6;15713:17;15703:8;15699:32;15696:41;15693:128;;;15740:79;;:::i;:::-;15693:128;15259:568;;;;;:::o;15833:704::-;15928:6;15936;15944;15993:2;15981:9;15972:7;15968:23;15964:32;15961:119;;;15999:79;;:::i;:::-;15961:119;16119:1;16144:53;16189:7;16180:6;16169:9;16165:22;16144:53;:::i;:::-;16134:63;;16090:117;16274:2;16263:9;16259:18;16246:32;16305:18;16297:6;16294:30;16291:117;;;16327:79;;:::i;:::-;16291:117;16440:80;16512:7;16503:6;16492:9;16488:22;16440:80;:::i;:::-;16422:98;;;;16217:313;15833:704;;;;;:::o;16543:474::-;16611:6;16619;16668:2;16656:9;16647:7;16643:23;16639:32;16636:119;;;16674:79;;:::i;:::-;16636:119;16794:1;16819:53;16864:7;16855:6;16844:9;16840:22;16819:53;:::i;:::-;16809:63;;16765:117;16921:2;16947:53;16992:7;16983:6;16972:9;16968:22;16947:53;:::i;:::-;16937:63;;16892:118;16543:474;;;;;:::o;17023:::-;17091:6;17099;17148:2;17136:9;17127:7;17123:23;17119:32;17116:119;;;17154:79;;:::i;:::-;17116:119;17274:1;17299:53;17344:7;17335:6;17324:9;17320:22;17299:53;:::i;:::-;17289:63;;17245:117;17401:2;17427:53;17472:7;17463:6;17452:9;17448:22;17427:53;:::i;:::-;17417:63;;17372:118;17023:474;;;;;:::o;17503:180::-;17551:77;17548:1;17541:88;17648:4;17645:1;17638:15;17672:4;17669:1;17662:15;17689:320;17733:6;17770:1;17764:4;17760:12;17750:22;;17817:1;17811:4;17807:12;17838:18;17828:81;;17894:4;17886:6;17882:17;17872:27;;17828:81;17956:2;17948:6;17945:14;17925:18;17922:38;17919:84;;17975:18;;:::i;:::-;17919:84;17740:269;17689:320;;;:::o;18015:182::-;18155:34;18151:1;18143:6;18139:14;18132:58;18015:182;:::o;18203:366::-;18345:3;18366:67;18430:2;18425:3;18366:67;:::i;:::-;18359:74;;18442:93;18531:3;18442:93;:::i;:::-;18560:2;18555:3;18551:12;18544:19;;18203:366;;;:::o;18575:419::-;18741:4;18779:2;18768:9;18764:18;18756:26;;18828:9;18822:4;18818:20;18814:1;18803:9;18799:17;18792:47;18856:131;18982:4;18856:131;:::i;:::-;18848:139;;18575:419;;;:::o;19000:141::-;19049:4;19072:3;19064:11;;19095:3;19092:1;19085:14;19129:4;19126:1;19116:18;19108:26;;19000:141;;;:::o;19147:93::-;19184:6;19231:2;19226;19219:5;19215:14;19211:23;19201:33;;19147:93;;;:::o;19246:107::-;19290:8;19340:5;19334:4;19330:16;19309:37;;19246:107;;;;:::o;19359:393::-;19428:6;19478:1;19466:10;19462:18;19501:97;19531:66;19520:9;19501:97;:::i;:::-;19619:39;19649:8;19638:9;19619:39;:::i;:::-;19607:51;;19691:4;19687:9;19680:5;19676:21;19667:30;;19740:4;19730:8;19726:19;19719:5;19716:30;19706:40;;19435:317;;19359:393;;;;;:::o;19758:60::-;19786:3;19807:5;19800:12;;19758:60;;;:::o;19824:142::-;19874:9;19907:53;19925:34;19934:24;19952:5;19934:24;:::i;:::-;19925:34;:::i;:::-;19907:53;:::i;:::-;19894:66;;19824:142;;;:::o;19972:75::-;20015:3;20036:5;20029:12;;19972:75;;;:::o;20053:269::-;20163:39;20194:7;20163:39;:::i;:::-;20224:91;20273:41;20297:16;20273:41;:::i;:::-;20265:6;20258:4;20252:11;20224:91;:::i;:::-;20218:4;20211:105;20129:193;20053:269;;;:::o;20328:73::-;20373:3;20328:73;:::o;20407:189::-;20484:32;;:::i;:::-;20525:65;20583:6;20575;20569:4;20525:65;:::i;:::-;20460:136;20407:189;;:::o;20602:186::-;20662:120;20679:3;20672:5;20669:14;20662:120;;;20733:39;20770:1;20763:5;20733:39;:::i;:::-;20706:1;20699:5;20695:13;20686:22;;20662:120;;;20602:186;;:::o;20794:543::-;20895:2;20890:3;20887:11;20884:446;;;20929:38;20961:5;20929:38;:::i;:::-;21013:29;21031:10;21013:29;:::i;:::-;21003:8;20999:44;21196:2;21184:10;21181:18;21178:49;;;21217:8;21202:23;;21178:49;21240:80;21296:22;21314:3;21296:22;:::i;:::-;21286:8;21282:37;21269:11;21240:80;:::i;:::-;20899:431;;20884:446;20794:543;;;:::o;21343:117::-;21397:8;21447:5;21441:4;21437:16;21416:37;;21343:117;;;;:::o;21466:169::-;21510:6;21543:51;21591:1;21587:6;21579:5;21576:1;21572:13;21543:51;:::i;:::-;21539:56;21624:4;21618;21614:15;21604:25;;21517:118;21466:169;;;;:::o;21640:295::-;21716:4;21862:29;21887:3;21881:4;21862:29;:::i;:::-;21854:37;;21924:3;21921:1;21917:11;21911:4;21908:21;21900:29;;21640:295;;;;:::o;21940:1395::-;22057:37;22090:3;22057:37;:::i;:::-;22159:18;22151:6;22148:30;22145:56;;;22181:18;;:::i;:::-;22145:56;22225:38;22257:4;22251:11;22225:38;:::i;:::-;22310:67;22370:6;22362;22356:4;22310:67;:::i;:::-;22404:1;22428:4;22415:17;;22460:2;22452:6;22449:14;22477:1;22472:618;;;;23134:1;23151:6;23148:77;;;23200:9;23195:3;23191:19;23185:26;23176:35;;23148:77;23251:67;23311:6;23304:5;23251:67;:::i;:::-;23245:4;23238:81;23107:222;22442:887;;22472:618;22524:4;22520:9;22512:6;22508:22;22558:37;22590:4;22558:37;:::i;:::-;22617:1;22631:208;22645:7;22642:1;22639:14;22631:208;;;22724:9;22719:3;22715:19;22709:26;22701:6;22694:42;22775:1;22767:6;22763:14;22753:24;;22822:2;22811:9;22807:18;22794:31;;22668:4;22665:1;22661:12;22656:17;;22631:208;;;22867:6;22858:7;22855:19;22852:179;;;22925:9;22920:3;22916:19;22910:26;22968:48;23010:4;23002:6;22998:17;22987:9;22968:48;:::i;:::-;22960:6;22953:64;22875:156;22852:179;23077:1;23073;23065:6;23061:14;23057:22;23051:4;23044:36;22479:611;;;22442:887;;22032:1303;;;21940:1395;;:::o;23341:181::-;23481:33;23477:1;23469:6;23465:14;23458:57;23341:181;:::o;23528:366::-;23670:3;23691:67;23755:2;23750:3;23691:67;:::i;:::-;23684:74;;23767:93;23856:3;23767:93;:::i;:::-;23885:2;23880:3;23876:12;23869:19;;23528:366;;;:::o;23900:419::-;24066:4;24104:2;24093:9;24089:18;24081:26;;24153:9;24147:4;24143:20;24139:1;24128:9;24124:17;24117:47;24181:131;24307:4;24181:131;:::i;:::-;24173:139;;23900:419;;;:::o;24325:147::-;24426:11;24463:3;24448:18;;24325:147;;;;:::o;24478:114::-;;:::o;24598:398::-;24757:3;24778:83;24859:1;24854:3;24778:83;:::i;:::-;24771:90;;24870:93;24959:3;24870:93;:::i;:::-;24988:1;24983:3;24979:11;24972:18;;24598:398;;;:::o;25002:379::-;25186:3;25208:147;25351:3;25208:147;:::i;:::-;25201:154;;25372:3;25365:10;;25002:379;;;:::o;25387:180::-;25435:77;25432:1;25425:88;25532:4;25529:1;25522:15;25556:4;25553:1;25546:15;25573:180;25621:77;25618:1;25611:88;25718:4;25715:1;25708:15;25742:4;25739:1;25732:15;25759:233;25798:3;25821:24;25839:5;25821:24;:::i;:::-;25812:33;;25867:66;25860:5;25857:77;25854:103;;25937:18;;:::i;:::-;25854:103;25984:1;25977:5;25973:13;25966:20;;25759:233;;;:::o;25998:172::-;26138:24;26134:1;26126:6;26122:14;26115:48;25998:172;:::o;26176:366::-;26318:3;26339:67;26403:2;26398:3;26339:67;:::i;:::-;26332:74;;26415:93;26504:3;26415:93;:::i;:::-;26533:2;26528:3;26524:12;26517:19;;26176:366;;;:::o;26548:419::-;26714:4;26752:2;26741:9;26737:18;26729:26;;26801:9;26795:4;26791:20;26787:1;26776:9;26772:17;26765:47;26829:131;26955:4;26829:131;:::i;:::-;26821:139;;26548:419;;;:::o;26973:191::-;27013:3;27032:20;27050:1;27032:20;:::i;:::-;27027:25;;27066:20;27084:1;27066:20;:::i;:::-;27061:25;;27109:1;27106;27102:9;27095:16;;27130:3;27127:1;27124:10;27121:36;;;27137:18;;:::i;:::-;27121:36;26973:191;;;;:::o;27170:164::-;27310:16;27306:1;27298:6;27294:14;27287:40;27170:164;:::o;27340:366::-;27482:3;27503:67;27567:2;27562:3;27503:67;:::i;:::-;27496:74;;27579:93;27668:3;27579:93;:::i;:::-;27697:2;27692:3;27688:12;27681:19;;27340:366;;;:::o;27712:419::-;27878:4;27916:2;27905:9;27901:18;27893:26;;27965:9;27959:4;27955:20;27951:1;27940:9;27936:17;27929:47;27993:131;28119:4;27993:131;:::i;:::-;27985:139;;27712:419;;;:::o;28137:171::-;28277:23;28273:1;28265:6;28261:14;28254:47;28137:171;:::o;28314:366::-;28456:3;28477:67;28541:2;28536:3;28477:67;:::i;:::-;28470:74;;28553:93;28642:3;28553:93;:::i;:::-;28671:2;28666:3;28662:12;28655:19;;28314:366;;;:::o;28686:419::-;28852:4;28890:2;28879:9;28875:18;28867:26;;28939:9;28933:4;28929:20;28925:1;28914:9;28910:17;28903:47;28967:131;29093:4;28967:131;:::i;:::-;28959:139;;28686:419;;;:::o;29111:194::-;29151:4;29171:20;29189:1;29171:20;:::i;:::-;29166:25;;29205:20;29223:1;29205:20;:::i;:::-;29200:25;;29249:1;29246;29242:9;29234:17;;29273:1;29267:4;29264:11;29261:37;;;29278:18;;:::i;:::-;29261:37;29111:194;;;;:::o;29311:410::-;29351:7;29374:20;29392:1;29374:20;:::i;:::-;29369:25;;29408:20;29426:1;29408:20;:::i;:::-;29403:25;;29463:1;29460;29456:9;29485:30;29503:11;29485:30;:::i;:::-;29474:41;;29664:1;29655:7;29651:15;29648:1;29645:22;29625:1;29618:9;29598:83;29575:139;;29694:18;;:::i;:::-;29575:139;29359:362;29311:410;;;;:::o;29727:221::-;29867:34;29863:1;29855:6;29851:14;29844:58;29936:4;29931:2;29923:6;29919:15;29912:29;29727:221;:::o;29954:366::-;30096:3;30117:67;30181:2;30176:3;30117:67;:::i;:::-;30110:74;;30193:93;30282:3;30193:93;:::i;:::-;30311:2;30306:3;30302:12;30295:19;;29954:366;;;:::o;30326:419::-;30492:4;30530:2;30519:9;30515:18;30507:26;;30579:9;30573:4;30569:20;30565:1;30554:9;30550:17;30543:47;30607:131;30733:4;30607:131;:::i;:::-;30599:139;;30326:419;;;:::o;30751:234::-;30891:34;30887:1;30879:6;30875:14;30868:58;30960:17;30955:2;30947:6;30943:15;30936:42;30751:234;:::o;30991:366::-;31133:3;31154:67;31218:2;31213:3;31154:67;:::i;:::-;31147:74;;31230:93;31319:3;31230:93;:::i;:::-;31348:2;31343:3;31339:12;31332:19;;30991:366;;;:::o;31363:419::-;31529:4;31567:2;31556:9;31552:18;31544:26;;31616:9;31610:4;31606:20;31602:1;31591:9;31587:17;31580:47;31644:131;31770:4;31644:131;:::i;:::-;31636:139;;31363:419;;;:::o;31788:148::-;31890:11;31927:3;31912:18;;31788:148;;;;:::o;31942:390::-;32048:3;32076:39;32109:5;32076:39;:::i;:::-;32131:89;32213:6;32208:3;32131:89;:::i;:::-;32124:96;;32229:65;32287:6;32282:3;32275:4;32268:5;32264:16;32229:65;:::i;:::-;32319:6;32314:3;32310:16;32303:23;;32052:280;31942:390;;;;:::o;32362:874::-;32465:3;32502:5;32496:12;32531:36;32557:9;32531:36;:::i;:::-;32583:89;32665:6;32660:3;32583:89;:::i;:::-;32576:96;;32703:1;32692:9;32688:17;32719:1;32714:166;;;;32894:1;32889:341;;;;32681:549;;32714:166;32798:4;32794:9;32783;32779:25;32774:3;32767:38;32860:6;32853:14;32846:22;32838:6;32834:35;32829:3;32825:45;32818:52;;32714:166;;32889:341;32956:38;32988:5;32956:38;:::i;:::-;33016:1;33030:154;33044:6;33041:1;33038:13;33030:154;;;33118:7;33112:14;33108:1;33103:3;33099:11;33092:35;33168:1;33159:7;33155:15;33144:26;;33066:4;33063:1;33059:12;33054:17;;33030:154;;;33213:6;33208:3;33204:16;33197:23;;32896:334;;32681:549;;32469:767;;32362:874;;;;:::o;33242:589::-;33467:3;33489:95;33580:3;33571:6;33489:95;:::i;:::-;33482:102;;33601:95;33692:3;33683:6;33601:95;:::i;:::-;33594:102;;33713:92;33801:3;33792:6;33713:92;:::i;:::-;33706:99;;33822:3;33815:10;;33242:589;;;;;;:::o;33837:170::-;33977:22;33973:1;33965:6;33961:14;33954:46;33837:170;:::o;34013:366::-;34155:3;34176:67;34240:2;34235:3;34176:67;:::i;:::-;34169:74;;34252:93;34341:3;34252:93;:::i;:::-;34370:2;34365:3;34361:12;34354:19;;34013:366;;;:::o;34385:419::-;34551:4;34589:2;34578:9;34574:18;34566:26;;34638:9;34632:4;34628:20;34624:1;34613:9;34609:17;34602:47;34666:131;34792:4;34666:131;:::i;:::-;34658:139;;34385:419;;;:::o;34810:170::-;34950:22;34946:1;34938:6;34934:14;34927:46;34810:170;:::o;34986:366::-;35128:3;35149:67;35213:2;35208:3;35149:67;:::i;:::-;35142:74;;35225:93;35314:3;35225:93;:::i;:::-;35343:2;35338:3;35334:12;35327:19;;34986:366;;;:::o;35358:419::-;35524:4;35562:2;35551:9;35547:18;35539:26;;35611:9;35605:4;35601:20;35597:1;35586:9;35582:17;35575:47;35639:131;35765:4;35639:131;:::i;:::-;35631:139;;35358:419;;;:::o;35783:169::-;35923:21;35919:1;35911:6;35907:14;35900:45;35783:169;:::o;35958:366::-;36100:3;36121:67;36185:2;36180:3;36121:67;:::i;:::-;36114:74;;36197:93;36286:3;36197:93;:::i;:::-;36315:2;36310:3;36306:12;36299:19;;35958:366;;;:::o;36330:419::-;36496:4;36534:2;36523:9;36519:18;36511:26;;36583:9;36577:4;36573:20;36569:1;36558:9;36554:17;36547:47;36611:131;36737:4;36611:131;:::i;:::-;36603:139;;36330:419;;;:::o;36755:221::-;36895:34;36891:1;36883:6;36879:14;36872:58;36964:4;36959:2;36951:6;36947:15;36940:29;36755:221;:::o;36982:366::-;37124:3;37145:67;37209:2;37204:3;37145:67;:::i;:::-;37138:74;;37221:93;37310:3;37221:93;:::i;:::-;37339:2;37334:3;37330:12;37323:19;;36982:366;;;:::o;37354:419::-;37520:4;37558:2;37547:9;37543:18;37535:26;;37607:9;37601:4;37597:20;37593:1;37582:9;37578:17;37571:47;37635:131;37761:4;37635:131;:::i;:::-;37627:139;;37354:419;;;:::o;37779:174::-;37919:26;37915:1;37907:6;37903:14;37896:50;37779:174;:::o;37959:366::-;38101:3;38122:67;38186:2;38181:3;38122:67;:::i;:::-;38115:74;;38198:93;38287:3;38198:93;:::i;:::-;38316:2;38311:3;38307:12;38300:19;;37959:366;;;:::o;38331:419::-;38497:4;38535:2;38524:9;38520:18;38512:26;;38584:9;38578:4;38574:20;38570:1;38559:9;38555:17;38548:47;38612:131;38738:4;38612:131;:::i;:::-;38604:139;;38331:419;;;:::o;38756:94::-;38789:8;38837:5;38833:2;38829:14;38808:35;;38756:94;;;:::o;38856:::-;38895:7;38924:20;38938:5;38924:20;:::i;:::-;38913:31;;38856:94;;;:::o;38956:100::-;38995:7;39024:26;39044:5;39024:26;:::i;:::-;39013:37;;38956:100;;;:::o;39062:157::-;39167:45;39187:24;39205:5;39187:24;:::i;:::-;39167:45;:::i;:::-;39162:3;39155:58;39062:157;;:::o;39225:256::-;39337:3;39352:75;39423:3;39414:6;39352:75;:::i;:::-;39452:2;39447:3;39443:12;39436:19;;39472:3;39465:10;;39225:256;;;;:::o;39487:164::-;39627:16;39623:1;39615:6;39611:14;39604:40;39487:164;:::o;39657:366::-;39799:3;39820:67;39884:2;39879:3;39820:67;:::i;:::-;39813:74;;39896:93;39985:3;39896:93;:::i;:::-;40014:2;40009:3;40005:12;39998:19;;39657:366;;;:::o;40029:419::-;40195:4;40233:2;40222:9;40218:18;40210:26;;40282:9;40276:4;40272:20;40268:1;40257:9;40253:17;40246:47;40310:131;40436:4;40310:131;:::i;:::-;40302:139;;40029:419;;;:::o;40454:225::-;40594:34;40590:1;40582:6;40578:14;40571:58;40663:8;40658:2;40650:6;40646:15;40639:33;40454:225;:::o;40685:366::-;40827:3;40848:67;40912:2;40907:3;40848:67;:::i;:::-;40841:74;;40924:93;41013:3;40924:93;:::i;:::-;41042:2;41037:3;41033:12;41026:19;;40685:366;;;:::o;41057:419::-;41223:4;41261:2;41250:9;41246:18;41238:26;;41310:9;41304:4;41300:20;41296:1;41285:9;41281:17;41274:47;41338:131;41464:4;41338:131;:::i;:::-;41330:139;;41057:419;;;:::o;41482:98::-;41533:6;41567:5;41561:12;41551:22;;41482:98;;;:::o;41586:168::-;41669:11;41703:6;41698:3;41691:19;41743:4;41738:3;41734:14;41719:29;;41586:168;;;;:::o;41760:373::-;41846:3;41874:38;41906:5;41874:38;:::i;:::-;41928:70;41991:6;41986:3;41928:70;:::i;:::-;41921:77;;42007:65;42065:6;42060:3;42053:4;42046:5;42042:16;42007:65;:::i;:::-;42097:29;42119:6;42097:29;:::i;:::-;42092:3;42088:39;42081:46;;41850:283;41760:373;;;;:::o;42139:640::-;42334:4;42372:3;42361:9;42357:19;42349:27;;42386:71;42454:1;42443:9;42439:17;42430:6;42386:71;:::i;:::-;42467:72;42535:2;42524:9;42520:18;42511:6;42467:72;:::i;:::-;42549;42617:2;42606:9;42602:18;42593:6;42549:72;:::i;:::-;42668:9;42662:4;42658:20;42653:2;42642:9;42638:18;42631:48;42696:76;42767:4;42758:6;42696:76;:::i;:::-;42688:84;;42139:640;;;;;;;:::o;42785:141::-;42841:5;42872:6;42866:13;42857:22;;42888:32;42914:5;42888:32;:::i;:::-;42785:141;;;;:::o;42932:349::-;43001:6;43050:2;43038:9;43029:7;43025:23;43021:32;43018:119;;;43056:79;;:::i;:::-;43018:119;43176:1;43201:63;43256:7;43247:6;43236:9;43232:22;43201:63;:::i;:::-;43191:73;;43147:127;42932:349;;;;:::o;43287:180::-;43335:77;43332:1;43325:88;43432:4;43429:1;43422:15;43456:4;43453:1;43446:15;43473:185;43513:1;43530:20;43548:1;43530:20;:::i;:::-;43525:25;;43564:20;43582:1;43564:20;:::i;:::-;43559:25;;43603:1;43593:35;;43608:18;;:::i;:::-;43593:35;43650:1;43647;43643:9;43638:14;;43473:185;;;;:::o;43664:176::-;43696:1;43713:20;43731:1;43713:20;:::i;:::-;43708:25;;43747:20;43765:1;43747:20;:::i;:::-;43742:25;;43786:1;43776:35;;43791:18;;:::i;:::-;43776:35;43832:1;43829;43825:9;43820:14;;43664:176;;;;:::o
Swarm Source
ipfs://ac4cb0cdf0a888e2a4396d7e62edf542e53a20e2f71a67bac0236e5c58b80de6
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.