ERC-721
Source Code
Overview
Max Total Supply
907 NOPE
Holders
548
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NOPELoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
NFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
// Create by 0xChrisx
// 0xChrisx Version : NEW ERC721A 4.x + MerkleProof + Burn + Queryable
//* Nova Pepe
//* Feature : มิ้นฟรี 5,000 ตัวแรก , หลังจากนั้น มิ้นเสียเงิน , ไม่ได้เป็น Whitelist ก็มิ้นได้
//* Feature : คนที่ไม่มี Whitelist สามารถมิ้นไปได้เลยพร้อมๆกัน แต่เป็น PaidMint
//* Feature : ป้องหัน ให้มิ้นได้แค่จำนวน MaxPerWallet = 10 ชิ้น ต่อเป๋า ไม่ว่า Phase ไหนก็ตาม
//* Feature : เพิ่ม MerkleRoot เรียบร้อยแล้ว
pragma solidity ^0.8.0;
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./ERC721A.sol";
import "./MerkleProof.sol";
import "./ERC721AQueryable.sol";
import "./ERC721ABurnable.sol";
contract NFT is Ownable, ERC721A, ReentrancyGuard, ERC721AQueryable, ERC721ABurnable {
event Received(address, uint);
uint256 public mintPhase ;
uint256 public collectionSize_ = 10000 ;
uint256 public maxPerWallet = 10;
uint256 public WhitelistFree = 1 ;
uint256 public globalPrice = 0.002 ether ;
uint256 public totalFree = 5000 ;
uint256 public globalMintedFree = 0 ;
uint256 public globalMintedPaid = 0;
bytes32 public WLroot ;
string private baseURI ;
struct AddressDetail {
uint256 BurnBalance ; // data 0
uint256 BurnBalanceUsed ; // data 1
uint256 WalletBalance ; // data 2
}
mapping(address => AddressDetail) public _addressDetail ;
constructor() ERC721A("Nova Pepe", "NOPE") {
}
modifier callerIsUser() {
require(tx.origin == msg.sender, "The caller is another contract");
_;
}
//------------------ BaseURI
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
function setBaseURI (string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
//--------------------- END BaseURI
//--------------------- Set & Change anythings
function setCollectionSize (uint256 newCollectionSize) public onlyOwner {
collectionSize_ = newCollectionSize ;
}
function setWLRoot (bytes32 newWLRoot) public onlyOwner {
WLroot = newWLRoot ;
}
function setPhase (uint256 newPhase) public onlyOwner {
mintPhase = newPhase ;
}
//--------------------- END Set & Change anythings
//--------------------------------------- Mint //////////////
//-------------------- DevMint
function devMint(address _to ,uint256 _mintAmount) external onlyOwner {
require(totalSupply() + _mintAmount <= collectionSize_ , "You can't mint more than collection size");
_safeMint( _to,_mintAmount);
}
//-------------------- END DevMint
function mintWhitelist(uint256 _mintAmount , bytes32[] memory _Proof) external payable {
require(mintPhase == 3, "Whitelist round hasn't open yet");
require(totalSupply() + _mintAmount <= collectionSize_, "Purchase would exceed max tokens");
require(_addressDetail[msg.sender].WalletBalance + _mintAmount <= maxPerWallet, "reached max per wallet."); // Can't mint more than maxPerWallet
uint256 mintPaidAmount ;
uint256 mintFreeAmount ;
bool isWhitelist = isValidWL(_Proof, msg.sender) ;
// * เป็น Whitelist && และ && ยังไม่ครบ 5,000 ที่ฟรี && และ && ยังไม่เกินจำนวนที่ฟรี ของคนนั้น
if (isWhitelist == true && totalFree > globalMintedFree && _addressDetail[msg.sender].WalletBalance < WhitelistFree ) {
uint256 freeRight = WhitelistFree - _addressDetail[msg.sender].WalletBalance ;
// if - จำนวนที่จะมิ้น <= น้อยกว่า หรือเท่ากับ <= จำนวนที่ฟรี --> ให้มิ้นได้เลย
if(_mintAmount <= freeRight) {
mintPaidAmount = 0 ;
mintFreeAmount = _mintAmount ;
}
// else - จำนวนมิ้น > มากกว่า > จำนวนที่ฟรี --> ให้หาจำนวนที่ไม่ฟรี แล้วจ่าย
else {
mintPaidAmount = _mintAmount - freeRight ;
mintFreeAmount = freeRight ;
}
} else {
mintPaidAmount = _mintAmount ;
mintFreeAmount = 0 ;
}
require(globalPrice * mintPaidAmount <= msg.value, "Ether value sent is not correct"); // จ่ายเท่าที่ต้องจ่าย
_safeMint(msg.sender, _mintAmount); // มิ้นเท่าจำนวนที่จะมิ้น
_addressDetail[msg.sender].WalletBalance += _mintAmount ;
globalMintedFree += mintFreeAmount ;
globalMintedPaid += mintPaidAmount ;
}
//-------------------- WhitelistMint
function isValidWL(bytes32[] memory proof, address wallet) public view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(wallet));
return MerkleProof.verify(proof, WLroot, leaf);
}
//-------------------- END WhitelistMint
function numberMinted(address owner) public view returns (uint256) { // check number Minted of that address จำนวนที่มิ้นไปแล้ว ใน address นั้น
return _numberMinted(owner);
}
//--------------------------------------------- END Mint //////////////
//------------------------- Withdraw Money
address private wallet1 = 0x16364a6B7ac1d7085346Ce6A144A1FD35bA80871; // K.Poom
address private wallet2 = 0x4B0A54D5529D34352048022a6e67BB6a26d91A7A; // K.Kayy
address private wallet3 = 0x977EE6f3C17ECB90Ac5504ad92240D40a33ba129; // K.Chrisx
address private wallet4 = 0x5350303b367FeA34bFb85Fd0da683eA9D8Ebd550; // VAULT
function withdrawMoney() external payable nonReentrant {
uint256 _paytoW1 = address(this).balance*17/100 ; // K.Poom
uint256 _paytoW2 = address(this).balance*17/100 ; // K.Kayy
uint256 _paytoW3 = address(this).balance*17/100 ; // K.Chrisx
uint256 _paytoW4 = address(this).balance*49/100 ; // VAULT
require(address(this).balance > 0, "No ETH left");
require(payable(wallet1).send(_paytoW1));
require(payable(wallet2).send(_paytoW2));
require(payable(wallet3).send(_paytoW3));
require(payable(wallet4).send(_paytoW4));
}
//------------------------- END Withdraw Money
//-------------------- START Fallback Receive Ether Function
receive() external payable {
emit Received(msg.sender, msg.value);
}
//-------------------- END Fallback Receive Ether Function
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary 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 virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
if (_startTokenId() <= tokenId) {
packed = _packedOwnerships[tokenId];
// If not burned.
if (packed & _BITMASK_BURNED == 0) {
// If the data at the starting slot does not exist, start the scan.
if (packed == 0) {
if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken();
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `tokenId` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
for (;;) {
unchecked {
packed = _packedOwnerships[--tokenId];
}
if (packed == 0) continue;
return packed;
}
}
// Otherwise, the data exists and is not burned. We can skip the scan.
// This is possible because we have already achieved the target condition.
// This saves 2143 gas on transfers of initialized tokens.
return packed;
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
*/
function approve(address to, uint256 tokenId) public payable virtual override {
_approve(to, tokenId, true);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @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) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @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. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @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 memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Hook that is called before a set of serially-ordered token IDs
* are about to be transferred. This includes minting.
* And also called before burning one token.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token IDs
* have been transferred. This includes minting.
* And also called after one token has been burned.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @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 for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, 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.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_approve(to, tokenId, false)`.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_approve(to, tokenId, false);
}
/**
* @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:
*
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
bool approvalCheck
) internal virtual {
address owner = ownerOf(tokenId);
if (approvalCheck)
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* 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 _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import "./IERC721ABurnable.sol";
import "./ERC721A.sol";
/**
* @title ERC721ABurnable.
*
* @dev ERC721A token that can be irreversibly burned (destroyed).
*/
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
/**
* @dev Burns `tokenId`. See {ERC721A-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual override {
_burn(tokenId, true);
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import "./IERC721AQueryable.sol";
import "./ERC721A.sol";
/**
* @title ERC721AQueryable.
*
* @dev ERC721A subclass with convenience query functions.
*/
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
*
* - `addr = address(0)`
* - `startTimestamp = 0`
* - `burned = false`
* - `extraData = 0`
*
* If the `tokenId` is burned:
*
* - `addr = <Address of owner before token was burned>`
* - `startTimestamp = <Timestamp when token was burned>`
* - `burned = true`
* - `extraData = <Extra data when token was burned>`
*
* Otherwise:
*
* - `addr = <Address of owner>`
* - `startTimestamp = <Timestamp of start of ownership>`
* - `burned = false`
* - `extraData = <Extra data at start of ownership>`
*/
function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
TokenOwnership memory ownership;
if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
return ownership;
}
ownership = _ownershipAt(tokenId);
if (ownership.burned) {
return ownership;
}
return _ownershipOf(tokenId);
}
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] calldata tokenIds)
external
view
virtual
override
returns (TokenOwnership[] memory)
{
unchecked {
uint256 tokenIdsLength = tokenIds.length;
TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
for (uint256 i; i != tokenIdsLength; ++i) {
ownerships[i] = explicitOwnershipOf(tokenIds[i]);
}
return ownerships;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start < stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view virtual override returns (uint256[] memory) {
unchecked {
if (start >= stop) revert InvalidQueryRange();
uint256 tokenIdsIdx;
uint256 stopLimit = _nextTokenId();
// Set `start = max(start, _startTokenId())`.
if (start < _startTokenId()) {
start = _startTokenId();
}
// Set `stop = min(stop, stopLimit)`.
if (stop > stopLimit) {
stop = stopLimit;
}
uint256 tokenIdsMaxLength = balanceOf(owner);
// Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
// to cater for cases where `balanceOf(owner)` is too big.
if (start < stop) {
uint256 rangeLength = stop - start;
if (rangeLength < tokenIdsMaxLength) {
tokenIdsMaxLength = rangeLength;
}
} else {
tokenIdsMaxLength = 0;
}
uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
if (tokenIdsMaxLength == 0) {
return tokenIds;
}
// We need to call `explicitOwnershipOf(start)`,
// because the slot at `start` may not be initialized.
TokenOwnership memory ownership = explicitOwnershipOf(start);
address currOwnershipAddr;
// If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
// `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
if (!ownership.burned) {
currOwnershipAddr = ownership.addr;
}
for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
// Downsize the array to fit.
assembly {
mstore(tokenIds, tokenIdsIdx)
}
return tokenIds;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(`totalSupply`) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K collections should be fine).
*/
function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
unchecked {
uint256 tokenIdsIdx;
address currOwnershipAddr;
uint256 tokenIdsLength = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenIdsLength);
TokenOwnership memory ownership;
for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
return tokenIds;
}
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables
* (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`,
* 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,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` 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 payable;
/**
* @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 payable;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom}
* for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import "./IERC721A.sol";
/**
* @dev Interface of ERC721ABurnable.
*/
interface IERC721ABurnable is IERC721A {
/**
* @dev Burns `tokenId`. See {ERC721A-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) external;
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import "./IERC721A.sol";
/**
* @dev Interface of ERC721AQueryable.
*/
interface IERC721AQueryable is IERC721A {
/**
* Invalid query range (`start` >= `stop`).
*/
error InvalidQueryRange();
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
*
* - `addr = address(0)`
* - `startTimestamp = 0`
* - `burned = false`
* - `extraData = 0`
*
* If the `tokenId` is burned:
*
* - `addr = <Address of owner before token was burned>`
* - `startTimestamp = <Timestamp when token was burned>`
* - `burned = true`
* - `extraData = <Extra data when token was burned>`
*
* Otherwise:
*
* - `addr = <Address of owner>`
* - `startTimestamp = <Timestamp of start of ownership>`
* - `burned = false`
* - `extraData = <Extra data at start of ownership>`
*/
function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start < stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view returns (uint256[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(`totalSupply`) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K collections should be fine).
*/
function tokensOfOwner(address owner) external view returns (uint256[] memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree 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.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
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 Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] calldata leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
* consuming from one or the other at each step according to the instructions given by
* `proofFlags`.
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] calldata leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
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() {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
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 make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","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":"WLroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressDetail","outputs":[{"internalType":"uint256","name":"BurnBalance","type":"uint256"},{"internalType":"uint256","name":"BurnBalanceUsed","type":"uint256"},{"internalType":"uint256","name":"WalletBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"globalMintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalMintedPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"wallet","type":"address"}],"name":"isValidWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCollectionSize","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWLRoot","type":"bytes32"}],"name":"setWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052612710600b55600a600c556001600d5566071afd498d0000600e55611388600f55600060105560006011557316364a6b7ac1d7085346ce6a144a1fd35ba80871601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734b0a54d5529d34352048022a6e67bb6a26d91a7a601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073977ee6f3c17ecb90ac5504ad92240d40a33ba129601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735350303b367fea34bfb85fd0da683ea9d8ebd550601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200019057600080fd5b506040518060400160405280600981526020017f4e6f7661205065706500000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4f5045000000000000000000000000000000000000000000000000000000008152506200021d620002116200026760201b60201c565b6200026f60201b60201c565b81600390816200022e9190620005b2565b508060049081620002409190620005b2565b50620002516200033360201b60201c565b6001819055505050600160098190555062000699565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ba57607f821691505b602082108103620003d057620003cf62000372565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fb565b620004468683620003fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004936200048d62000487846200045e565b62000468565b6200045e565b9050919050565b6000819050919050565b620004af8362000472565b620004c7620004be826200049a565b84845462000408565b825550505050565b600090565b620004de620004cf565b620004eb818484620004a4565b505050565b5b81811015620005135762000507600082620004d4565b600181019050620004f1565b5050565b601f82111562000562576200052c81620003d6565b6200053784620003eb565b8101602085101562000547578190505b6200055f6200055685620003eb565b830182620004f0565b50505b505050565b600082821c905092915050565b6000620005876000198460080262000567565b1980831691505092915050565b6000620005a2838362000574565b9150826002028217905092915050565b620005bd8262000338565b67ffffffffffffffff811115620005d957620005d862000343565b5b620005e58254620003a1565b620005f282828562000517565b600060209050601f8311600181146200062a576000841562000615578287015190505b62000621858262000594565b86555062000691565b601f1984166200063a86620003d6565b60005b8281101562000664578489015182556001820191506020850194506020810190506200063d565b8683101562000684578489015162000680601f89168262000574565b8355505b6001600288020188555050505b505050505050565b61479b80620006a96000396000f3fe60806040526004361061024a5760003560e01c80636352211e11610139578063ac446002116100b6578063c87b56dd1161007a578063c87b56dd14610898578063cc5e7efb146108d5578063d50f071514610900578063dc33e6811461092b578063e985e9c514610968578063f2fde38b146109a55761028a565b8063ac446002146107e3578063aca8ffe7146107ed578063b11c7f8214610816578063b88d4fde1461083f578063c23dc68f1461085b5761028a565b80638da5cb5b116100fd5780638da5cb5b146106e857806395d89b411461071357806399a2557a1461073e578063a06c03ec1461077b578063a22cb465146107ba5761028a565b80636352211e146105ef5780636992c1161461062c57806370a0823114610657578063715018a6146106945780638462151c146106ab5761028a565b806328081a49116101c757806342966c681161018b57806342966c681461050c578063453c23101461053557806355f804b3146105605780635bbb217714610589578063627804af146105c65761028a565b806328081a49146104465780632cc8265514610471578063333e44e61461049a5780633ffde173146104c557806342842e0e146104f05761028a565b806312025e591161020e57806312025e591461036c57806317881cbf146103a957806318160ddd146103d457806323a47023146103ff57806323b872dd1461042a5761028a565b806301ffc9a71461028f578063061431a8146102cc57806306fdde03146102e8578063081812fc14610313578063095ea7b3146103505761028a565b3661028a577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051610280929190613092565b60405180910390a1005b600080fd5b34801561029b57600080fd5b506102b660048036038101906102b19190613127565b6109ce565b6040516102c3919061316f565b60405180910390f35b6102e660048036038101906102e19190613345565b610a60565b005b3480156102f457600080fd5b506102fd610d7d565b60405161030a9190613420565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613442565b610e0f565b604051610347919061346f565b60405180910390f35b61036a600480360381019061036591906134b6565b610e8e565b005b34801561037857600080fd5b50610393600480360381019061038e91906134f6565b610e9e565b6040516103a0919061316f565b60405180910390f35b3480156103b557600080fd5b506103be610ee0565b6040516103cb9190613552565b60405180910390f35b3480156103e057600080fd5b506103e9610ee6565b6040516103f69190613552565b60405180910390f35b34801561040b57600080fd5b50610414610efd565b6040516104219190613552565b60405180910390f35b610444600480360381019061043f919061356d565b610f03565b005b34801561045257600080fd5b5061045b611225565b6040516104689190613552565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613442565b61122b565b005b3480156104a657600080fd5b506104af6112b1565b6040516104bc9190613552565b60405180910390f35b3480156104d157600080fd5b506104da6112b7565b6040516104e791906135cf565b60405180910390f35b61050a6004803603810190610505919061356d565b6112bd565b005b34801561051857600080fd5b50610533600480360381019061052e9190613442565b6112dd565b005b34801561054157600080fd5b5061054a6112eb565b6040516105579190613552565b60405180910390f35b34801561056c57600080fd5b506105876004803603810190610582919061369f565b6112f1565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613743565b611380565b6040516105bd91906138f3565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e891906134b6565b611443565b005b3480156105fb57600080fd5b5061061660048036038101906106119190613442565b611524565b604051610623919061346f565b60405180910390f35b34801561063857600080fd5b50610641611536565b60405161064e9190613552565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190613915565b61153c565b60405161068b9190613552565b60405180910390f35b3480156106a057600080fd5b506106a96115f4565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190613915565b61167c565b6040516106df9190613a00565b60405180910390f35b3480156106f457600080fd5b506106fd6117bf565b60405161070a919061346f565b60405180910390f35b34801561071f57600080fd5b506107286117e8565b6040516107359190613420565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613a22565b61187a565b6040516107729190613a00565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613915565b611a86565b6040516107b193929190613a75565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613ad8565b611ab0565b005b6107eb611bbb565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613442565b611e4d565b005b34801561082257600080fd5b5061083d60048036038101906108389190613b18565b611ed3565b005b61085960048036038101906108549190613be6565b611f59565b005b34801561086757600080fd5b50610882600480360381019061087d9190613442565b611fcc565b60405161088f9190613cbe565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613442565b612036565b6040516108cc9190613420565b60405180910390f35b3480156108e157600080fd5b506108ea6120d4565b6040516108f79190613552565b60405180910390f35b34801561090c57600080fd5b506109156120da565b6040516109229190613552565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d9190613915565b6120e0565b60405161095f9190613552565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a9190613cd9565b6120f2565b60405161099c919061316f565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190613915565b612186565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6003600a5414610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613d65565b60405180910390fd5b600b5482610ab1610ee6565b610abb9190613db4565b1115610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af390613e34565b60405180910390fd5b600c5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610b4d9190613db4565b1115610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590613ea0565b60405180910390fd5b6000806000610b9d8433610e9e565b905060011515811515148015610bb65750601054600f54115b8015610c055750600d54601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154105b15610c89576000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600d54610c5c9190613ec0565b9050808611610c715760009350859250610c83565b8086610c7d9190613ec0565b93508092505b50610c91565b849250600091505b3483600e54610ca09190613ef4565b1115610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890613f82565b60405180910390fd5b610ceb338661227d565b84601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610d3d9190613db4565b925050819055508160106000828254610d569190613db4565b925050819055508260116000828254610d6f9190613db4565b925050819055505050505050565b606060038054610d8c90613fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890613fd1565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000610e1a8261229b565b610e50576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e9a828260016122fa565b5050565b60008082604051602001610eb2919061404a565b604051602081830303815290604052805190602001209050610ed78460125483612446565b91505092915050565b600a5481565b6000610ef061245d565b6002546001540303905090565b600b5481565b6000610f0e82612462565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f75576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f818461255a565b91509150610f978187610f92612581565b612589565b610fe357610fac86610fa7612581565b6120f2565b610fe2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611049576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105686868660016125cd565b801561106157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061112f8561110b8888876125d3565b7c0200000000000000000000000000000000000000000000000000000000176125fb565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111b557600060018501905060006005600083815260200190815260200160002054036111b35760015481146111b2578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121d8686866001612626565b505050505050565b600e5481565b61123361262c565b73ffffffffffffffffffffffffffffffffffffffff166112516117bf565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906140b1565b60405180910390fd5b80600a8190555050565b600f5481565b60125481565b6112d883838360405180602001604052806000815250611f59565b505050565b6112e8816001612634565b50565b600c5481565b6112f961262c565b73ffffffffffffffffffffffffffffffffffffffff166113176117bf565b73ffffffffffffffffffffffffffffffffffffffff161461136d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611364906140b1565b60405180910390fd5b806013908161137c919061427d565b5050565b6060600083839050905060008167ffffffffffffffff8111156113a6576113a56131cc565b5b6040519080825280602002602001820160405280156113df57816020015b6113cc612fe9565b8152602001906001900390816113c45790505b50905060005b8281146114375761140e8686838181106114025761140161434f565b5b90506020020135611fcc565b8282815181106114215761142061434f565b5b60200260200101819052508060010190506113e5565b50809250505092915050565b61144b61262c565b73ffffffffffffffffffffffffffffffffffffffff166114696117bf565b73ffffffffffffffffffffffffffffffffffffffff16146114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b6906140b1565b60405180910390fd5b600b54816114cb610ee6565b6114d59190613db4565b1115611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906143f0565b60405180910390fd5b611520828261227d565b5050565b600061152f82612462565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115fc61262c565b73ffffffffffffffffffffffffffffffffffffffff1661161a6117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611667906140b1565b60405180910390fd5b61167a6000612886565b565b6060600080600061168c8561153c565b905060008167ffffffffffffffff8111156116aa576116a96131cc565b5b6040519080825280602002602001820160405280156116d85781602001602082028036833780820191505090505b5090506116e3612fe9565b60006116ed61245d565b90505b8386146117b1576117008161294a565b915081604001516117a657600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461174b57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036117a557808387806001019850815181106117985761179761434f565b5b6020026020010181815250505b5b8060010190506116f0565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117f790613fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461182390613fd1565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b5050505050905090565b60608183106118b5576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118c0612975565b90506118ca61245d565b8510156118dc576118d961245d565b94505b808411156118e8578093505b60006118f38761153c565b905084861015611916576000868603905081811015611910578091505b5061191b565b600090505b60008167ffffffffffffffff811115611937576119366131cc565b5b6040519080825280602002602001820160405280156119655781602001602082028036833780820191505090505b5090506000820361197c5780945050505050611a7f565b600061198788611fcc565b90506000816040015161199c57816000015190505b60008990505b8881141580156119b25750848714155b15611a71576119c08161294a565b92508260400151611a6657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a0b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a655780848880600101995081518110611a5857611a5761434f565b5b6020026020010181815250505b5b8060010190506119a2565b508583528296505050505050505b9392505050565b60146020528060005260406000206000915090508060000154908060010154908060020154905083565b8060086000611abd612581565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b6a612581565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611baf919061316f565b60405180910390a35050565b600260095403611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061445c565b60405180910390fd5b600260098190555060006064601147611c199190613ef4565b611c2391906144ab565b905060006064601147611c369190613ef4565b611c4091906144ab565b905060006064601147611c539190613ef4565b611c5d91906144ab565b905060006064603147611c709190613ef4565b611c7a91906144ab565b905060004711611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614528565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050611d1f57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050611d7f57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050611ddf57600080fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611e3f57600080fd5b505050506001600981905550565b611e5561262c565b73ffffffffffffffffffffffffffffffffffffffff16611e736117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec0906140b1565b60405180910390fd5b80600b8190555050565b611edb61262c565b73ffffffffffffffffffffffffffffffffffffffff16611ef96117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906140b1565b60405180910390fd5b8060128190555050565b611f64848484610f03565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fc657611f8f8484848461297f565b611fc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fd4612fe9565b611fdc612fe9565b611fe461245d565b831080611ff85750611ff4612975565b8310155b156120065780915050612031565b61200f8361294a565b90508060400151156120245780915050612031565b61202d83612acf565b9150505b919050565b60606120418261229b565b612077576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612081612aef565b905060008151036120a157604051806020016040528060008152506120cc565b806120ab84612b81565b6040516020016120bc929190614584565b6040516020818303038152906040525b915050919050565b60115481565b600d5481565b60006120eb82612bd1565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61218e61262c565b73ffffffffffffffffffffffffffffffffffffffff166121ac6117bf565b73ffffffffffffffffffffffffffffffffffffffff1614612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f9906140b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122689061461a565b60405180910390fd5b61227a81612886565b50565b612297828260405180602001604052806000815250612c28565b5050565b6000816122a661245d565b111580156122b5575060015482105b80156122f3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600061230583611524565b90508115612390578073ffffffffffffffffffffffffffffffffffffffff1661232c612581565b73ffffffffffffffffffffffffffffffffffffffff161461238f5761235881612353612581565b6120f2565b61238e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b6000826124538584612cc6565b1490509392505050565b600090565b60008161246d61245d565b11612523576005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612522576000810361251d5760015482106124f2576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600560008360019003935083815260200190815260200160002054905060008103612555576124f3565b612555565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125ea868684612d1c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600061263f83612462565b905060008190506000806126528661255a565b9150915084156126bb5761266e8184612669612581565b612589565b6126ba576126838361267e612581565b6120f2565b6126b9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6126c98360008860016125cd565b80156126d457600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061277c83612739856000886125d3565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176125fb565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361280257600060018701905060006005600083815260200190815260200160002054036128005760015481146127ff578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461286c836000886001612626565b600260008154809291906001019190505550505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612952612fe9565b61296e6005600084815260200190815260200160002054612d25565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129a5612581565b8786866040518563ffffffff1660e01b81526004016129c7949392919061468f565b6020604051808303816000875af1925050508015612a0357506040513d601f19601f82011682018060405250810190612a0091906146f0565b60015b612a7c573d8060008114612a33576040519150601f19603f3d011682016040523d82523d6000602084013e612a38565b606091505b506000815103612a74576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ad7612fe9565b612ae8612ae383612462565b612d25565b9050919050565b606060138054612afe90613fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2a90613fd1565b8015612b775780601f10612b4c57610100808354040283529160200191612b77565b820191906000526020600020905b815481529060010190602001808311612b5a57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612bbc57600184039350600a81066030018453600a8104905080612b9a575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612c328383612ddb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612cc15760006001549050600083820390505b612c73600086838060010194508661297f565b612ca9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c60578160015414612cbe57600080fd5b50505b505050565b60008082905060005b8451811015612d1157612cfc82868381518110612cef57612cee61434f565b5b6020026020010151612f97565b91508080612d099061471d565b915050612ccf565b508091505092915050565b60009392505050565b612d2d612fe9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000600154905060008203612e1c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2960008483856125cd565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ea083612e9160008660006125d3565b612e9a85612fc2565b176125fb565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612f4157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612f06565b5060008203612f7c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612f926000848385612626565b505050565b6000818310612faf57612faa8284612fd2565b612fba565b612fb98383612fd2565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061306382613038565b9050919050565b61307381613058565b82525050565b6000819050919050565b61308c81613079565b82525050565b60006040820190506130a7600083018561306a565b6130b46020830184613083565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613104816130cf565b811461310f57600080fd5b50565b600081359050613121816130fb565b92915050565b60006020828403121561313d5761313c6130c5565b5b600061314b84828501613112565b91505092915050565b60008115159050919050565b61316981613154565b82525050565b60006020820190506131846000830184613160565b92915050565b61319381613079565b811461319e57600080fd5b50565b6000813590506131b08161318a565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613204826131bb565b810181811067ffffffffffffffff82111715613223576132226131cc565b5b80604052505050565b60006132366130bb565b905061324282826131fb565b919050565b600067ffffffffffffffff821115613262576132616131cc565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61328b81613278565b811461329657600080fd5b50565b6000813590506132a881613282565b92915050565b60006132c16132bc84613247565b61322c565b905080838252602082019050602084028301858111156132e4576132e3613273565b5b835b8181101561330d57806132f98882613299565b8452602084019350506020810190506132e6565b5050509392505050565b600082601f83011261332c5761332b6131b6565b5b813561333c8482602086016132ae565b91505092915050565b6000806040838503121561335c5761335b6130c5565b5b600061336a858286016131a1565b925050602083013567ffffffffffffffff81111561338b5761338a6130ca565b5b61339785828601613317565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133db5780820151818401526020810190506133c0565b60008484015250505050565b60006133f2826133a1565b6133fc81856133ac565b935061340c8185602086016133bd565b613415816131bb565b840191505092915050565b6000602082019050818103600083015261343a81846133e7565b905092915050565b600060208284031215613458576134576130c5565b5b6000613466848285016131a1565b91505092915050565b6000602082019050613484600083018461306a565b92915050565b61349381613058565b811461349e57600080fd5b50565b6000813590506134b08161348a565b92915050565b600080604083850312156134cd576134cc6130c5565b5b60006134db858286016134a1565b92505060206134ec858286016131a1565b9150509250929050565b6000806040838503121561350d5761350c6130c5565b5b600083013567ffffffffffffffff81111561352b5761352a6130ca565b5b61353785828601613317565b9250506020613548858286016134a1565b9150509250929050565b60006020820190506135676000830184613083565b92915050565b600080600060608486031215613586576135856130c5565b5b6000613594868287016134a1565b93505060206135a5868287016134a1565b92505060406135b6868287016131a1565b9150509250925092565b6135c981613278565b82525050565b60006020820190506135e460008301846135c0565b92915050565b600080fd5b600067ffffffffffffffff82111561360a576136096131cc565b5b613613826131bb565b9050602081019050919050565b82818337600083830152505050565b600061364261363d846135ef565b61322c565b90508281526020810184848401111561365e5761365d6135ea565b5b613669848285613620565b509392505050565b600082601f830112613686576136856131b6565b5b813561369684826020860161362f565b91505092915050565b6000602082840312156136b5576136b46130c5565b5b600082013567ffffffffffffffff8111156136d3576136d26130ca565b5b6136df84828501613671565b91505092915050565b600080fd5b60008083601f840112613703576137026131b6565b5b8235905067ffffffffffffffff8111156137205761371f6136e8565b5b60208301915083602082028301111561373c5761373b613273565b5b9250929050565b6000806020838503121561375a576137596130c5565b5b600083013567ffffffffffffffff811115613778576137776130ca565b5b613784858286016136ed565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137c581613058565b82525050565b600067ffffffffffffffff82169050919050565b6137e8816137cb565b82525050565b6137f781613154565b82525050565b600062ffffff82169050919050565b613815816137fd565b82525050565b60808201600082015161383160008501826137bc565b50602082015161384460208501826137df565b50604082015161385760408501826137ee565b50606082015161386a606085018261380c565b50505050565b600061387c838361381b565b60808301905092915050565b6000602082019050919050565b60006138a082613790565b6138aa818561379b565b93506138b5836137ac565b8060005b838110156138e65781516138cd8882613870565b97506138d883613888565b9250506001810190506138b9565b5085935050505092915050565b6000602082019050818103600083015261390d8184613895565b905092915050565b60006020828403121561392b5761392a6130c5565b5b6000613939848285016134a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61397781613079565b82525050565b6000613989838361396e565b60208301905092915050565b6000602082019050919050565b60006139ad82613942565b6139b7818561394d565b93506139c28361395e565b8060005b838110156139f35781516139da888261397d565b97506139e583613995565b9250506001810190506139c6565b5085935050505092915050565b60006020820190508181036000830152613a1a81846139a2565b905092915050565b600080600060608486031215613a3b57613a3a6130c5565b5b6000613a49868287016134a1565b9350506020613a5a868287016131a1565b9250506040613a6b868287016131a1565b9150509250925092565b6000606082019050613a8a6000830186613083565b613a976020830185613083565b613aa46040830184613083565b949350505050565b613ab581613154565b8114613ac057600080fd5b50565b600081359050613ad281613aac565b92915050565b60008060408385031215613aef57613aee6130c5565b5b6000613afd858286016134a1565b9250506020613b0e85828601613ac3565b9150509250929050565b600060208284031215613b2e57613b2d6130c5565b5b6000613b3c84828501613299565b91505092915050565b600067ffffffffffffffff821115613b6057613b5f6131cc565b5b613b69826131bb565b9050602081019050919050565b6000613b89613b8484613b45565b61322c565b905082815260208101848484011115613ba557613ba46135ea565b5b613bb0848285613620565b509392505050565b600082601f830112613bcd57613bcc6131b6565b5b8135613bdd848260208601613b76565b91505092915050565b60008060008060808587031215613c0057613bff6130c5565b5b6000613c0e878288016134a1565b9450506020613c1f878288016134a1565b9350506040613c30878288016131a1565b925050606085013567ffffffffffffffff811115613c5157613c506130ca565b5b613c5d87828801613bb8565b91505092959194509250565b608082016000820151613c7f60008501826137bc565b506020820151613c9260208501826137df565b506040820151613ca560408501826137ee565b506060820151613cb8606085018261380c565b50505050565b6000608082019050613cd36000830184613c69565b92915050565b60008060408385031215613cf057613cef6130c5565b5b6000613cfe858286016134a1565b9250506020613d0f858286016134a1565b9150509250929050565b7f57686974656c69737420726f756e64206861736e2774206f70656e2079657400600082015250565b6000613d4f601f836133ac565b9150613d5a82613d19565b602082019050919050565b60006020820190508181036000830152613d7e81613d42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dbf82613079565b9150613dca83613079565b9250828201905080821115613de257613de1613d85565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613e1e6020836133ac565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f72656163686564206d6178207065722077616c6c65742e000000000000000000600082015250565b6000613e8a6017836133ac565b9150613e9582613e54565b602082019050919050565b60006020820190508181036000830152613eb981613e7d565b9050919050565b6000613ecb82613079565b9150613ed683613079565b9250828203905081811115613eee57613eed613d85565b5b92915050565b6000613eff82613079565b9150613f0a83613079565b9250828202613f1881613079565b91508282048414831517613f2f57613f2e613d85565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613f6c601f836133ac565b9150613f7782613f36565b602082019050919050565b60006020820190508181036000830152613f9b81613f5f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fe957607f821691505b602082108103613ffc57613ffb613fa2565b5b50919050565b60008160601b9050919050565b600061401a82614002565b9050919050565b600061402c8261400f565b9050919050565b61404461403f82613058565b614021565b82525050565b60006140568284614033565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061409b6020836133ac565b91506140a682614065565b602082019050919050565b600060208201905081810360008301526140ca8161408e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140f6565b61413d86836140f6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061417a61417561417084613079565b614155565b613079565b9050919050565b6000819050919050565b6141948361415f565b6141a86141a082614181565b848454614103565b825550505050565b600090565b6141bd6141b0565b6141c881848461418b565b505050565b5b818110156141ec576141e16000826141b5565b6001810190506141ce565b5050565b601f82111561423157614202816140d1565b61420b846140e6565b8101602085101561421a578190505b61422e614226856140e6565b8301826141cd565b50505b505050565b600082821c905092915050565b600061425460001984600802614236565b1980831691505092915050565b600061426d8383614243565b9150826002028217905092915050565b614286826133a1565b67ffffffffffffffff81111561429f5761429e6131cc565b5b6142a98254613fd1565b6142b48282856141f0565b600060209050601f8311600181146142e757600084156142d5578287015190505b6142df8582614261565b865550614347565b601f1984166142f5866140d1565b60005b8281101561431d578489015182556001820191506020850194506020810190506142f8565b8683101561433a5784890151614336601f891682614243565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b60006143da6028836133ac565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614446601f836133ac565b915061445182614410565b602082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b682613079565b91506144c183613079565b9250826144d1576144d061447c565b5b828204905092915050565b7f4e6f20455448206c656674000000000000000000000000000000000000000000600082015250565b6000614512600b836133ac565b915061451d826144dc565b602082019050919050565b6000602082019050818103600083015261454181614505565b9050919050565b600081905092915050565b600061455e826133a1565b6145688185614548565b93506145788185602086016133bd565b80840191505092915050565b60006145908285614553565b915061459c8284614553565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146046026836133ac565b915061460f826145a8565b604082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146618261463a565b61466b8185614645565b935061467b8185602086016133bd565b614684816131bb565b840191505092915050565b60006080820190506146a4600083018761306a565b6146b1602083018661306a565b6146be6040830185613083565b81810360608301526146d08184614656565b905095945050505050565b6000815190506146ea816130fb565b92915050565b600060208284031215614706576147056130c5565b5b6000614714848285016146db565b91505092915050565b600061472882613079565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361475a57614759613d85565b5b60018201905091905056fea264697066735822122069815df3b913f118f409e17063d8544f20169a9ef48a61df30d8f59b39d7a9e164736f6c63430008120033
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80636352211e11610139578063ac446002116100b6578063c87b56dd1161007a578063c87b56dd14610898578063cc5e7efb146108d5578063d50f071514610900578063dc33e6811461092b578063e985e9c514610968578063f2fde38b146109a55761028a565b8063ac446002146107e3578063aca8ffe7146107ed578063b11c7f8214610816578063b88d4fde1461083f578063c23dc68f1461085b5761028a565b80638da5cb5b116100fd5780638da5cb5b146106e857806395d89b411461071357806399a2557a1461073e578063a06c03ec1461077b578063a22cb465146107ba5761028a565b80636352211e146105ef5780636992c1161461062c57806370a0823114610657578063715018a6146106945780638462151c146106ab5761028a565b806328081a49116101c757806342966c681161018b57806342966c681461050c578063453c23101461053557806355f804b3146105605780635bbb217714610589578063627804af146105c65761028a565b806328081a49146104465780632cc8265514610471578063333e44e61461049a5780633ffde173146104c557806342842e0e146104f05761028a565b806312025e591161020e57806312025e591461036c57806317881cbf146103a957806318160ddd146103d457806323a47023146103ff57806323b872dd1461042a5761028a565b806301ffc9a71461028f578063061431a8146102cc57806306fdde03146102e8578063081812fc14610313578063095ea7b3146103505761028a565b3661028a577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051610280929190613092565b60405180910390a1005b600080fd5b34801561029b57600080fd5b506102b660048036038101906102b19190613127565b6109ce565b6040516102c3919061316f565b60405180910390f35b6102e660048036038101906102e19190613345565b610a60565b005b3480156102f457600080fd5b506102fd610d7d565b60405161030a9190613420565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613442565b610e0f565b604051610347919061346f565b60405180910390f35b61036a600480360381019061036591906134b6565b610e8e565b005b34801561037857600080fd5b50610393600480360381019061038e91906134f6565b610e9e565b6040516103a0919061316f565b60405180910390f35b3480156103b557600080fd5b506103be610ee0565b6040516103cb9190613552565b60405180910390f35b3480156103e057600080fd5b506103e9610ee6565b6040516103f69190613552565b60405180910390f35b34801561040b57600080fd5b50610414610efd565b6040516104219190613552565b60405180910390f35b610444600480360381019061043f919061356d565b610f03565b005b34801561045257600080fd5b5061045b611225565b6040516104689190613552565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613442565b61122b565b005b3480156104a657600080fd5b506104af6112b1565b6040516104bc9190613552565b60405180910390f35b3480156104d157600080fd5b506104da6112b7565b6040516104e791906135cf565b60405180910390f35b61050a6004803603810190610505919061356d565b6112bd565b005b34801561051857600080fd5b50610533600480360381019061052e9190613442565b6112dd565b005b34801561054157600080fd5b5061054a6112eb565b6040516105579190613552565b60405180910390f35b34801561056c57600080fd5b506105876004803603810190610582919061369f565b6112f1565b005b34801561059557600080fd5b506105b060048036038101906105ab9190613743565b611380565b6040516105bd91906138f3565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e891906134b6565b611443565b005b3480156105fb57600080fd5b5061061660048036038101906106119190613442565b611524565b604051610623919061346f565b60405180910390f35b34801561063857600080fd5b50610641611536565b60405161064e9190613552565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190613915565b61153c565b60405161068b9190613552565b60405180910390f35b3480156106a057600080fd5b506106a96115f4565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190613915565b61167c565b6040516106df9190613a00565b60405180910390f35b3480156106f457600080fd5b506106fd6117bf565b60405161070a919061346f565b60405180910390f35b34801561071f57600080fd5b506107286117e8565b6040516107359190613420565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613a22565b61187a565b6040516107729190613a00565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613915565b611a86565b6040516107b193929190613a75565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613ad8565b611ab0565b005b6107eb611bbb565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613442565b611e4d565b005b34801561082257600080fd5b5061083d60048036038101906108389190613b18565b611ed3565b005b61085960048036038101906108549190613be6565b611f59565b005b34801561086757600080fd5b50610882600480360381019061087d9190613442565b611fcc565b60405161088f9190613cbe565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613442565b612036565b6040516108cc9190613420565b60405180910390f35b3480156108e157600080fd5b506108ea6120d4565b6040516108f79190613552565b60405180910390f35b34801561090c57600080fd5b506109156120da565b6040516109229190613552565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d9190613915565b6120e0565b60405161095f9190613552565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a9190613cd9565b6120f2565b60405161099c919061316f565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190613915565b612186565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6003600a5414610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613d65565b60405180910390fd5b600b5482610ab1610ee6565b610abb9190613db4565b1115610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af390613e34565b60405180910390fd5b600c5482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610b4d9190613db4565b1115610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590613ea0565b60405180910390fd5b6000806000610b9d8433610e9e565b905060011515811515148015610bb65750601054600f54115b8015610c055750600d54601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154105b15610c89576000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600d54610c5c9190613ec0565b9050808611610c715760009350859250610c83565b8086610c7d9190613ec0565b93508092505b50610c91565b849250600091505b3483600e54610ca09190613ef4565b1115610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890613f82565b60405180910390fd5b610ceb338661227d565b84601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610d3d9190613db4565b925050819055508160106000828254610d569190613db4565b925050819055508260116000828254610d6f9190613db4565b925050819055505050505050565b606060038054610d8c90613fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890613fd1565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000610e1a8261229b565b610e50576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e9a828260016122fa565b5050565b60008082604051602001610eb2919061404a565b604051602081830303815290604052805190602001209050610ed78460125483612446565b91505092915050565b600a5481565b6000610ef061245d565b6002546001540303905090565b600b5481565b6000610f0e82612462565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f75576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f818461255a565b91509150610f978187610f92612581565b612589565b610fe357610fac86610fa7612581565b6120f2565b610fe2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611049576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105686868660016125cd565b801561106157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061112f8561110b8888876125d3565b7c0200000000000000000000000000000000000000000000000000000000176125fb565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111b557600060018501905060006005600083815260200190815260200160002054036111b35760015481146111b2578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121d8686866001612626565b505050505050565b600e5481565b61123361262c565b73ffffffffffffffffffffffffffffffffffffffff166112516117bf565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906140b1565b60405180910390fd5b80600a8190555050565b600f5481565b60125481565b6112d883838360405180602001604052806000815250611f59565b505050565b6112e8816001612634565b50565b600c5481565b6112f961262c565b73ffffffffffffffffffffffffffffffffffffffff166113176117bf565b73ffffffffffffffffffffffffffffffffffffffff161461136d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611364906140b1565b60405180910390fd5b806013908161137c919061427d565b5050565b6060600083839050905060008167ffffffffffffffff8111156113a6576113a56131cc565b5b6040519080825280602002602001820160405280156113df57816020015b6113cc612fe9565b8152602001906001900390816113c45790505b50905060005b8281146114375761140e8686838181106114025761140161434f565b5b90506020020135611fcc565b8282815181106114215761142061434f565b5b60200260200101819052508060010190506113e5565b50809250505092915050565b61144b61262c565b73ffffffffffffffffffffffffffffffffffffffff166114696117bf565b73ffffffffffffffffffffffffffffffffffffffff16146114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b6906140b1565b60405180910390fd5b600b54816114cb610ee6565b6114d59190613db4565b1115611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906143f0565b60405180910390fd5b611520828261227d565b5050565b600061152f82612462565b9050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115fc61262c565b73ffffffffffffffffffffffffffffffffffffffff1661161a6117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611667906140b1565b60405180910390fd5b61167a6000612886565b565b6060600080600061168c8561153c565b905060008167ffffffffffffffff8111156116aa576116a96131cc565b5b6040519080825280602002602001820160405280156116d85781602001602082028036833780820191505090505b5090506116e3612fe9565b60006116ed61245d565b90505b8386146117b1576117008161294a565b915081604001516117a657600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461174b57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036117a557808387806001019850815181106117985761179761434f565b5b6020026020010181815250505b5b8060010190506116f0565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117f790613fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461182390613fd1565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b5050505050905090565b60608183106118b5576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118c0612975565b90506118ca61245d565b8510156118dc576118d961245d565b94505b808411156118e8578093505b60006118f38761153c565b905084861015611916576000868603905081811015611910578091505b5061191b565b600090505b60008167ffffffffffffffff811115611937576119366131cc565b5b6040519080825280602002602001820160405280156119655781602001602082028036833780820191505090505b5090506000820361197c5780945050505050611a7f565b600061198788611fcc565b90506000816040015161199c57816000015190505b60008990505b8881141580156119b25750848714155b15611a71576119c08161294a565b92508260400151611a6657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a0b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a655780848880600101995081518110611a5857611a5761434f565b5b6020026020010181815250505b5b8060010190506119a2565b508583528296505050505050505b9392505050565b60146020528060005260406000206000915090508060000154908060010154908060020154905083565b8060086000611abd612581565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b6a612581565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611baf919061316f565b60405180910390a35050565b600260095403611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061445c565b60405180910390fd5b600260098190555060006064601147611c199190613ef4565b611c2391906144ab565b905060006064601147611c369190613ef4565b611c4091906144ab565b905060006064601147611c539190613ef4565b611c5d91906144ab565b905060006064603147611c709190613ef4565b611c7a91906144ab565b905060004711611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614528565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050611d1f57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050611d7f57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050611ddf57600080fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611e3f57600080fd5b505050506001600981905550565b611e5561262c565b73ffffffffffffffffffffffffffffffffffffffff16611e736117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec0906140b1565b60405180910390fd5b80600b8190555050565b611edb61262c565b73ffffffffffffffffffffffffffffffffffffffff16611ef96117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906140b1565b60405180910390fd5b8060128190555050565b611f64848484610f03565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fc657611f8f8484848461297f565b611fc5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fd4612fe9565b611fdc612fe9565b611fe461245d565b831080611ff85750611ff4612975565b8310155b156120065780915050612031565b61200f8361294a565b90508060400151156120245780915050612031565b61202d83612acf565b9150505b919050565b60606120418261229b565b612077576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612081612aef565b905060008151036120a157604051806020016040528060008152506120cc565b806120ab84612b81565b6040516020016120bc929190614584565b6040516020818303038152906040525b915050919050565b60115481565b600d5481565b60006120eb82612bd1565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61218e61262c565b73ffffffffffffffffffffffffffffffffffffffff166121ac6117bf565b73ffffffffffffffffffffffffffffffffffffffff1614612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f9906140b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122689061461a565b60405180910390fd5b61227a81612886565b50565b612297828260405180602001604052806000815250612c28565b5050565b6000816122a661245d565b111580156122b5575060015482105b80156122f3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600061230583611524565b90508115612390578073ffffffffffffffffffffffffffffffffffffffff1661232c612581565b73ffffffffffffffffffffffffffffffffffffffff161461238f5761235881612353612581565b6120f2565b61238e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b6000826124538584612cc6565b1490509392505050565b600090565b60008161246d61245d565b11612523576005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612522576000810361251d5760015482106124f2576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600560008360019003935083815260200190815260200160002054905060008103612555576124f3565b612555565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125ea868684612d1c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600061263f83612462565b905060008190506000806126528661255a565b9150915084156126bb5761266e8184612669612581565b612589565b6126ba576126838361267e612581565b6120f2565b6126b9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6126c98360008860016125cd565b80156126d457600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061277c83612739856000886125d3565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176125fb565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361280257600060018701905060006005600083815260200190815260200160002054036128005760015481146127ff578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461286c836000886001612626565b600260008154809291906001019190505550505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612952612fe9565b61296e6005600084815260200190815260200160002054612d25565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129a5612581565b8786866040518563ffffffff1660e01b81526004016129c7949392919061468f565b6020604051808303816000875af1925050508015612a0357506040513d601f19601f82011682018060405250810190612a0091906146f0565b60015b612a7c573d8060008114612a33576040519150601f19603f3d011682016040523d82523d6000602084013e612a38565b606091505b506000815103612a74576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ad7612fe9565b612ae8612ae383612462565b612d25565b9050919050565b606060138054612afe90613fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2a90613fd1565b8015612b775780601f10612b4c57610100808354040283529160200191612b77565b820191906000526020600020905b815481529060010190602001808311612b5a57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612bbc57600184039350600a81066030018453600a8104905080612b9a575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612c328383612ddb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612cc15760006001549050600083820390505b612c73600086838060010194508661297f565b612ca9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c60578160015414612cbe57600080fd5b50505b505050565b60008082905060005b8451811015612d1157612cfc82868381518110612cef57612cee61434f565b5b6020026020010151612f97565b91508080612d099061471d565b915050612ccf565b508091505092915050565b60009392505050565b612d2d612fe9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000600154905060008203612e1c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2960008483856125cd565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ea083612e9160008660006125d3565b612e9a85612fc2565b176125fb565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612f4157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612f06565b5060008203612f7c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612f926000848385612626565b505050565b6000818310612faf57612faa8284612fd2565b612fba565b612fb98383612fd2565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061306382613038565b9050919050565b61307381613058565b82525050565b6000819050919050565b61308c81613079565b82525050565b60006040820190506130a7600083018561306a565b6130b46020830184613083565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613104816130cf565b811461310f57600080fd5b50565b600081359050613121816130fb565b92915050565b60006020828403121561313d5761313c6130c5565b5b600061314b84828501613112565b91505092915050565b60008115159050919050565b61316981613154565b82525050565b60006020820190506131846000830184613160565b92915050565b61319381613079565b811461319e57600080fd5b50565b6000813590506131b08161318a565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613204826131bb565b810181811067ffffffffffffffff82111715613223576132226131cc565b5b80604052505050565b60006132366130bb565b905061324282826131fb565b919050565b600067ffffffffffffffff821115613262576132616131cc565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61328b81613278565b811461329657600080fd5b50565b6000813590506132a881613282565b92915050565b60006132c16132bc84613247565b61322c565b905080838252602082019050602084028301858111156132e4576132e3613273565b5b835b8181101561330d57806132f98882613299565b8452602084019350506020810190506132e6565b5050509392505050565b600082601f83011261332c5761332b6131b6565b5b813561333c8482602086016132ae565b91505092915050565b6000806040838503121561335c5761335b6130c5565b5b600061336a858286016131a1565b925050602083013567ffffffffffffffff81111561338b5761338a6130ca565b5b61339785828601613317565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133db5780820151818401526020810190506133c0565b60008484015250505050565b60006133f2826133a1565b6133fc81856133ac565b935061340c8185602086016133bd565b613415816131bb565b840191505092915050565b6000602082019050818103600083015261343a81846133e7565b905092915050565b600060208284031215613458576134576130c5565b5b6000613466848285016131a1565b91505092915050565b6000602082019050613484600083018461306a565b92915050565b61349381613058565b811461349e57600080fd5b50565b6000813590506134b08161348a565b92915050565b600080604083850312156134cd576134cc6130c5565b5b60006134db858286016134a1565b92505060206134ec858286016131a1565b9150509250929050565b6000806040838503121561350d5761350c6130c5565b5b600083013567ffffffffffffffff81111561352b5761352a6130ca565b5b61353785828601613317565b9250506020613548858286016134a1565b9150509250929050565b60006020820190506135676000830184613083565b92915050565b600080600060608486031215613586576135856130c5565b5b6000613594868287016134a1565b93505060206135a5868287016134a1565b92505060406135b6868287016131a1565b9150509250925092565b6135c981613278565b82525050565b60006020820190506135e460008301846135c0565b92915050565b600080fd5b600067ffffffffffffffff82111561360a576136096131cc565b5b613613826131bb565b9050602081019050919050565b82818337600083830152505050565b600061364261363d846135ef565b61322c565b90508281526020810184848401111561365e5761365d6135ea565b5b613669848285613620565b509392505050565b600082601f830112613686576136856131b6565b5b813561369684826020860161362f565b91505092915050565b6000602082840312156136b5576136b46130c5565b5b600082013567ffffffffffffffff8111156136d3576136d26130ca565b5b6136df84828501613671565b91505092915050565b600080fd5b60008083601f840112613703576137026131b6565b5b8235905067ffffffffffffffff8111156137205761371f6136e8565b5b60208301915083602082028301111561373c5761373b613273565b5b9250929050565b6000806020838503121561375a576137596130c5565b5b600083013567ffffffffffffffff811115613778576137776130ca565b5b613784858286016136ed565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137c581613058565b82525050565b600067ffffffffffffffff82169050919050565b6137e8816137cb565b82525050565b6137f781613154565b82525050565b600062ffffff82169050919050565b613815816137fd565b82525050565b60808201600082015161383160008501826137bc565b50602082015161384460208501826137df565b50604082015161385760408501826137ee565b50606082015161386a606085018261380c565b50505050565b600061387c838361381b565b60808301905092915050565b6000602082019050919050565b60006138a082613790565b6138aa818561379b565b93506138b5836137ac565b8060005b838110156138e65781516138cd8882613870565b97506138d883613888565b9250506001810190506138b9565b5085935050505092915050565b6000602082019050818103600083015261390d8184613895565b905092915050565b60006020828403121561392b5761392a6130c5565b5b6000613939848285016134a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61397781613079565b82525050565b6000613989838361396e565b60208301905092915050565b6000602082019050919050565b60006139ad82613942565b6139b7818561394d565b93506139c28361395e565b8060005b838110156139f35781516139da888261397d565b97506139e583613995565b9250506001810190506139c6565b5085935050505092915050565b60006020820190508181036000830152613a1a81846139a2565b905092915050565b600080600060608486031215613a3b57613a3a6130c5565b5b6000613a49868287016134a1565b9350506020613a5a868287016131a1565b9250506040613a6b868287016131a1565b9150509250925092565b6000606082019050613a8a6000830186613083565b613a976020830185613083565b613aa46040830184613083565b949350505050565b613ab581613154565b8114613ac057600080fd5b50565b600081359050613ad281613aac565b92915050565b60008060408385031215613aef57613aee6130c5565b5b6000613afd858286016134a1565b9250506020613b0e85828601613ac3565b9150509250929050565b600060208284031215613b2e57613b2d6130c5565b5b6000613b3c84828501613299565b91505092915050565b600067ffffffffffffffff821115613b6057613b5f6131cc565b5b613b69826131bb565b9050602081019050919050565b6000613b89613b8484613b45565b61322c565b905082815260208101848484011115613ba557613ba46135ea565b5b613bb0848285613620565b509392505050565b600082601f830112613bcd57613bcc6131b6565b5b8135613bdd848260208601613b76565b91505092915050565b60008060008060808587031215613c0057613bff6130c5565b5b6000613c0e878288016134a1565b9450506020613c1f878288016134a1565b9350506040613c30878288016131a1565b925050606085013567ffffffffffffffff811115613c5157613c506130ca565b5b613c5d87828801613bb8565b91505092959194509250565b608082016000820151613c7f60008501826137bc565b506020820151613c9260208501826137df565b506040820151613ca560408501826137ee565b506060820151613cb8606085018261380c565b50505050565b6000608082019050613cd36000830184613c69565b92915050565b60008060408385031215613cf057613cef6130c5565b5b6000613cfe858286016134a1565b9250506020613d0f858286016134a1565b9150509250929050565b7f57686974656c69737420726f756e64206861736e2774206f70656e2079657400600082015250565b6000613d4f601f836133ac565b9150613d5a82613d19565b602082019050919050565b60006020820190508181036000830152613d7e81613d42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dbf82613079565b9150613dca83613079565b9250828201905080821115613de257613de1613d85565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613e1e6020836133ac565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f72656163686564206d6178207065722077616c6c65742e000000000000000000600082015250565b6000613e8a6017836133ac565b9150613e9582613e54565b602082019050919050565b60006020820190508181036000830152613eb981613e7d565b9050919050565b6000613ecb82613079565b9150613ed683613079565b9250828203905081811115613eee57613eed613d85565b5b92915050565b6000613eff82613079565b9150613f0a83613079565b9250828202613f1881613079565b91508282048414831517613f2f57613f2e613d85565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613f6c601f836133ac565b9150613f7782613f36565b602082019050919050565b60006020820190508181036000830152613f9b81613f5f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fe957607f821691505b602082108103613ffc57613ffb613fa2565b5b50919050565b60008160601b9050919050565b600061401a82614002565b9050919050565b600061402c8261400f565b9050919050565b61404461403f82613058565b614021565b82525050565b60006140568284614033565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061409b6020836133ac565b91506140a682614065565b602082019050919050565b600060208201905081810360008301526140ca8161408e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140f6565b61413d86836140f6565b95508019841693508086168417925050509392505050565b6000819050919050565b600061417a61417561417084613079565b614155565b613079565b9050919050565b6000819050919050565b6141948361415f565b6141a86141a082614181565b848454614103565b825550505050565b600090565b6141bd6141b0565b6141c881848461418b565b505050565b5b818110156141ec576141e16000826141b5565b6001810190506141ce565b5050565b601f82111561423157614202816140d1565b61420b846140e6565b8101602085101561421a578190505b61422e614226856140e6565b8301826141cd565b50505b505050565b600082821c905092915050565b600061425460001984600802614236565b1980831691505092915050565b600061426d8383614243565b9150826002028217905092915050565b614286826133a1565b67ffffffffffffffff81111561429f5761429e6131cc565b5b6142a98254613fd1565b6142b48282856141f0565b600060209050601f8311600181146142e757600084156142d5578287015190505b6142df8582614261565b865550614347565b601f1984166142f5866140d1565b60005b8281101561431d578489015182556001820191506020850194506020810190506142f8565b8683101561433a5784890151614336601f891682614243565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b60006143da6028836133ac565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614446601f836133ac565b915061445182614410565b602082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b682613079565b91506144c183613079565b9250826144d1576144d061447c565b5b828204905092915050565b7f4e6f20455448206c656674000000000000000000000000000000000000000000600082015250565b6000614512600b836133ac565b915061451d826144dc565b602082019050919050565b6000602082019050818103600083015261454181614505565b9050919050565b600081905092915050565b600061455e826133a1565b6145688185614548565b93506145788185602086016133bd565b80840191505092915050565b60006145908285614553565b915061459c8284614553565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146046026836133ac565b915061460f826145a8565b604082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146618261463a565b61466b8185614645565b935061467b8185602086016133bd565b614684816131bb565b840191505092915050565b60006080820190506146a4600083018761306a565b6146b1602083018661306a565b6146be6040830185613083565b81810360608301526146d08184614656565b905095945050505050565b6000815190506146ea816130fb565b92915050565b600060208284031215614706576147056130c5565b5b6000614714848285016146db565b91505092915050565b600061472882613079565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361475a57614759613d85565b5b60018201905091905056fea264697066735822122069815df3b913f118f409e17063d8544f20169a9ef48a61df30d8f59b39d7a9e164736f6c63430008120033
Deployed Bytecode Sourcemap
988:6127:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7015:31;7024:10;7036:9;7015:31;;;;;;;:::i;:::-;;;;;;;;988:6127;;;;;9155:630:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2989:2254:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10039:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16278:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16006:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5290:210:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1116:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5894:317:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1148:38:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19821:2764:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1273:40:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2484:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1321:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1445:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22676:187:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;509:92:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:32:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2058:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1640:513:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2726:226:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11391:150:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1360:35:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:230:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:9;;;;;;;;;;;;;:::i;:::-;;5416:879:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:85:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10208:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2527:2454:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1667:55:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16819:231:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6256:599:8;;;:::i;:::-;;2255:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2386:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23444:396:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1069:418:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10411:313:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1402:35:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1233:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5548:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17200:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9155:630:1;9240:4;9573:10;9558:25;;:11;:25;;;;:101;;;;9649:10;9634:25;;:11;:25;;;;9558:101;:177;;;;9725:10;9710:25;;:11;:25;;;;9558:177;9539:196;;9155:630;;;:::o;2989:2254:8:-;3107:1;3094:9;;:14;3086:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3194:15;;3179:11;3163:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;3155:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;3331:12;;3316:11;3273:14;:26;3288:10;3273:26;;;;;;;;;;;;;;;:40;;;:54;;;;:::i;:::-;:70;;3265:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;3419:22;3452;3486:16;3505:29;3515:6;3523:10;3505:9;:29::i;:::-;3486:48;;3778:4;3763:19;;:11;:19;;;:51;;;;;3798:16;;3786:9;;:28;3763:51;:111;;;;;3861:13;;3818:14;:26;3833:10;3818:26;;;;;;;;;;;;;;;:40;;;:56;3763:111;3759:1041;;;3892:17;3928:14;:26;3943:10;3928:26;;;;;;;;;;;;;;;:40;;;3912:13;;:56;;;;:::i;:::-;3892:76;;4208:9;4193:11;:24;4190:480;;4255:1;4238:18;;4292:11;4275:28;;4190:480;;;4587:9;4573:11;:23;;;;:::i;:::-;4556:40;;4632:9;4615:26;;4190:480;3877:816;3759:1041;;;4743:11;4726:28;;4786:1;4769:18;;3759:1041;4858:9;4840:14;4826:11;;:28;;;;:::i;:::-;:41;;4818:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4975:34;4985:10;4997:11;4975:9;:34::i;:::-;5133:11;5089:14;:26;5104:10;5089:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;5175:14;5155:16;;:34;;;;;;;:::i;:::-;;;;;;;;5220:14;5200:16;;:34;;;;;;;:::i;:::-;;;;;;;;3076:2167;;;2989:2254;;:::o;10039:98:1:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16278:214::-;16354:7;16378:16;16386:7;16378;:16::i;:::-;16373:64;;16403:34;;;;;;;;;;;;;;16373:64;16455:15;:24;16471:7;16455:24;;;;;;;;;;;:30;;;;;;;;;;;;16448:37;;16278:214;;;:::o;16006:122::-;16094:27;16103:2;16107:7;16116:4;16094:8;:27::i;:::-;16006:122;;:::o;5290:210:8:-;5370:4;5386:12;5428:6;5411:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;5401:35;;;;;;5386:50;;5453:39;5472:5;5479:6;;5487:4;5453:18;:39::i;:::-;5446:46;;;5290:210;;;;:::o;1116:24::-;;;;:::o;5894:317:1:-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;1148:38:8:-;;;;:::o;19821:2764:1:-;19958:27;19988;20007:7;19988:18;:27::i;:::-;19958:57;;20071:4;20030:45;;20046:19;20030:45;;;20026:86;;20084:28;;;;;;;;;;;;;;20026:86;20124:27;20153:23;20180:35;20207:7;20180:26;:35::i;:::-;20123:92;;;;20312:68;20337:15;20354:4;20360:19;:17;:19::i;:::-;20312:24;:68::i;:::-;20307:179;;20399:43;20416:4;20422:19;:17;:19::i;:::-;20399:16;:43::i;:::-;20394:92;;20451:35;;;;;;;;;;;;;;20394:92;20307:179;20515:1;20501:16;;:2;:16;;;20497:52;;20526:23;;;;;;;;;;;;;;20497:52;20560:43;20582:4;20588:2;20592:7;20601:1;20560:21;:43::i;:::-;20692:15;20689:157;;;20830:1;20809:19;20802:30;20689:157;21218:18;:24;21237:4;21218:24;;;;;;;;;;;;;;;;21216:26;;;;;;;;;;;;21286:18;:22;21305:2;21286:22;;;;;;;;;;;;;;;;21284:24;;;;;;;;;;;21601:143;21637:2;21685:45;21700:4;21706:2;21710:19;21685:14;:45::i;:::-;2392:8;21657:73;21601:18;:143::i;:::-;21572:17;:26;21590:7;21572:26;;;;;;;;;;;:172;;;;21912:1;2392:8;21861:19;:47;:52;21857:617;;21933:19;21965:1;21955:7;:11;21933:33;;22120:1;22086:17;:30;22104:11;22086:30;;;;;;;;;;;;:35;22082:378;;22222:13;;22207:11;:28;22203:239;;22400:19;22367:17;:30;22385:11;22367:30;;;;;;;;;;;:52;;;;22203:239;22082:378;21915:559;21857:617;22518:7;22514:2;22499:27;;22508:4;22499:27;;;;;;;;;;;;22536:42;22557:4;22563:2;22567:7;22576:1;22536:20;:42::i;:::-;19948:2637;;;19821:2764;;;:::o;1273:40:8:-;;;;:::o;2484:92::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2560:8:8::1;2548:9;:20;;;;2484:92:::0;:::o;1321:31::-;;;;:::o;1445:21::-;;;;:::o;22676:187:1:-;22817:39;22834:4;22840:2;22844:7;22817:39;;;;;;;;;;;;:16;:39::i;:::-;22676:187;;;:::o;509:92:2:-;574:20;580:7;589:4;574:5;:20::i;:::-;509:92;:::o;1194:32:8:-;;;;:::o;2058:103::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2143:11:8::1;2133:7;:21;;;;;;:::i;:::-;;2058:103:::0;:::o;1640:513:3:-;1779:23;1842:22;1867:8;;:15;;1842:40;;1896:34;1954:14;1933:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1896:73;;1988:9;1983:123;2004:14;1999:1;:19;1983:123;;2059:32;2079:8;;2088:1;2079:11;;;;;;;:::i;:::-;;;;;;;;2059:19;:32::i;:::-;2043:10;2054:1;2043:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;2020:3;;;;;1983:123;;;;2126:10;2119:17;;;;1640:513;;;;:::o;2726:226:8:-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2846:15:8::1;;2831:11;2815:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;2807:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;2918:27;2929:3;2933:11;2918:9;:27::i;:::-;2726:226:::0;;:::o;11391:150:1:-;11463:7;11505:27;11524:7;11505:18;:27::i;:::-;11482:52;;11391:150;;;:::o;1360:35:8:-;;;;:::o;7045:230:1:-;7117:7;7157:1;7140:19;;:5;:19;;;7136:60;;7168:28;;;;;;;;;;;;;;7136:60;1360:13;7213:18;:25;7232:5;7213:25;;;;;;;;;;;;;;;;:55;7206:62;;7045:230;;;:::o;1598:92:9:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;5416:879:3:-;5494:16;5546:19;5579:25;5618:22;5643:16;5653:5;5643:9;:16::i;:::-;5618:41;;5673:25;5715:14;5701:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5673:57;;5744:31;;:::i;:::-;5794:9;5806:15;:13;:15::i;:::-;5794:27;;5789:461;5838:14;5823:11;:29;5789:461;;5889:15;5902:1;5889:12;:15::i;:::-;5877:27;;5926:9;:16;;;5966:8;5922:71;6040:1;6014:28;;:9;:14;;;:28;;;6010:109;;6086:9;:14;;;6066:34;;6010:109;6161:5;6140:26;;:17;:26;;;6136:100;;6216:1;6190:8;6199:13;;;;;;6190:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6136:100;5789:461;5854:3;;;;;5789:461;;;;6270:8;6263:15;;;;;;;5416:879;;;:::o;966:85:9:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;10208:102:1:-;10264:13;10296:7;10289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:102;:::o;2527:2454:3:-;2666:16;2731:4;2722:5;:13;2718:45;;2744:19;;;;;;;;;;;;;;2718:45;2777:19;2810:17;2830:14;:12;:14::i;:::-;2810:34;;2928:15;:13;:15::i;:::-;2920:5;:23;2916:85;;;2971:15;:13;:15::i;:::-;2963:23;;2916:85;3075:9;3068:4;:16;3064:71;;;3111:9;3104:16;;3064:71;3148:25;3176:16;3186:5;3176:9;:16::i;:::-;3148:44;;3367:4;3359:5;:12;3355:271;;;3391:19;3420:5;3413:4;:12;3391:34;;3461:17;3447:11;:31;3443:109;;;3522:11;3502:31;;3443:109;3373:193;3355:271;;;3610:1;3590:21;;3355:271;3639:25;3681:17;3667:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3639:60;;3738:1;3717:17;:22;3713:76;;3766:8;3759:15;;;;;;;;3713:76;3930:31;3964:26;3984:5;3964:19;:26::i;:::-;3930:60;;4004:25;4246:9;:16;;;4241:90;;4302:9;:14;;;4282:34;;4241:90;4349:9;4361:5;4349:17;;4344:467;4373:4;4368:1;:9;;:45;;;;;4396:17;4381:11;:32;;4368:45;4344:467;;;4450:15;4463:1;4450:12;:15::i;:::-;4438:27;;4487:9;:16;;;4527:8;4483:71;4601:1;4575:28;;:9;:14;;;:28;;;4571:109;;4647:9;:14;;;4627:34;;4571:109;4722:5;4701:26;;:17;:26;;;4697:100;;4777:1;4751:8;4760:13;;;;;;4751:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4697:100;4344:467;4415:3;;;;;4344:467;;;;4910:11;4900:8;4893:29;4956:8;4949:15;;;;;;;;2527:2454;;;;;;:::o;1667:55:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16819:231:1:-;16965:8;16913:18;:39;16932:19;:17;:19::i;:::-;16913:39;;;;;;;;;;;;;;;:49;16953:8;16913:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17024:8;16988:55;;17003:19;:17;:19::i;:::-;16988:55;;;17034:8;16988:55;;;;;;:::i;:::-;;;;;;;;16819:231;;:::o;6256:599:8:-;1680:1:10;2259:7;;:19;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;6323:16:8::1;6367:3;6364:2;6342:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;6323:47;;6391:16;6435:3;6432:2;6410:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;6391:47;;6459:16;6503:3;6500:2;6478:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;6459:47;;6529:16;6573:3;6570:2;6548:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;6529:47;;6629:1;6605:21;:25;6597:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;6673:7;;;;;;;;;;;6665:21;;:31;6687:8;6665:31;;;;;;;;;;;;;;;;;;;;;;;6657:40;;;::::0;::::1;;6723:7;;;;;;;;;;;6715:21;;:31;6737:8;6715:31;;;;;;;;;;;;;;;;;;;;;;;6707:40;;;::::0;::::1;;6773:7;;;;;;;;;;;6765:21;;:31;6787:8;6765:31;;;;;;;;;;;;;;;;;;;;;;;6757:40;;;::::0;::::1;;6823:7;;;;;;;;;;;6815:21;;:31;6837:8;6815:31;;;;;;;;;;;;;;;;;;;;;;;6807:40;;;::::0;::::1;;6311:544;;;;1637:1:10::0;2562:7;:22;;;;6256:599:8:o;2255:125::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2355:17:8::1;2337:15;:35;;;;2255:125:::0;:::o;2386:92::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2461:9:8::1;2452:6;:18;;;;2386:92:::0;:::o;23444:396:1:-;23613:31;23626:4;23632:2;23636:7;23613:12;:31::i;:::-;23676:1;23658:2;:14;;;:19;23654:180;;23696:56;23727:4;23733:2;23737:7;23746:5;23696:30;:56::i;:::-;23691:143;;23779:40;;;;;;;;;;;;;;23691:143;23654:180;23444:396;;;;:::o;1069:418:3:-;1153:21;;:::i;:::-;1186:31;;:::i;:::-;1241:15;:13;:15::i;:::-;1231:7;:25;:54;;;;1271:14;:12;:14::i;:::-;1260:7;:25;;1231:54;1227:101;;;1308:9;1301:16;;;;;1227:101;1349:21;1362:7;1349:12;:21::i;:::-;1337:33;;1384:9;:16;;;1380:63;;;1423:9;1416:16;;;;;1380:63;1459:21;1472:7;1459:12;:21::i;:::-;1452:28;;;1069:418;;;;:::o;10411:313:1:-;10484:13;10514:16;10522:7;10514;:16::i;:::-;10509:59;;10539:29;;;;;;;;;;;;;;10509:59;10579:21;10603:10;:8;:10::i;:::-;10579:34;;10655:1;10636:7;10630:21;:26;:87;;;;;;;;;;;;;;;;;10683:7;10692:18;10702:7;10692:9;:18::i;:::-;10666:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10630:87;10623:94;;;10411:313;;;:::o;1402:35:8:-;;;;:::o;1233:32::-;;;;:::o;5548:233::-;5606:7;5754:20;5768:5;5754:13;:20::i;:::-;5747:27;;5548:233;;;:::o;17200:162:1:-;17297:4;17320:18;:25;17339:5;17320:25;;;;;;;;;;;;;;;:35;17346:8;17320:35;;;;;;;;;;;;;;;;;;;;;;;;;17313:42;;17200:162;;;;:::o;1839:189:9:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;::::0;1919:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;33341:110:1:-;33417:27;33427:2;33431:8;33417:27;;;;;;;;;;;;:9;:27::i;:::-;33341:110;;:::o;17611:277::-;17676:4;17730:7;17711:15;:13;:15::i;:::-;:26;;:65;;;;;17763:13;;17753:7;:23;17711:65;:151;;;;;17861:1;2118:8;17813:17;:26;17831:7;17813:26;;;;;;;;;;;;:44;:49;17711:151;17692:170;;17611:277;;;:::o;34231:477::-;34355:13;34371:16;34379:7;34371;:16::i;:::-;34355:32;;34402:13;34398:215;;;34456:5;34433:28;;:19;:17;:19::i;:::-;:28;;;34429:184;;34484:44;34501:5;34508:19;:17;:19::i;:::-;34484:16;:44::i;:::-;34479:134;;34559:35;;;;;;;;;;;;;;34479:134;34429:184;34398:215;34656:2;34623:15;:24;34639:7;34623:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34693:7;34689:2;34673:28;;34682:5;34673:28;;;;;;;;;;;;34345:363;34231:477;;;:::o;1153:184:7:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;5426:90:1:-;5482:7;5426:90;:::o;12515:1680::-;12582:14;12631:7;12612:15;:13;:15::i;:::-;:26;12608:1533;;12663:17;:26;12681:7;12663:26;;;;;;;;;;;;12654:35;;12765:1;2118:8;12737:6;:24;:29;12733:1398;;12884:1;12874:6;:11;12870:963;;12924:13;;12913:7;:24;12909:68;;12946:31;;;;;;;;;;;;;;12909:68;13564:251;13648:17;:28;13666:9;;;;;;;13648:28;;;;;;;;;;;;13639:37;;13742:1;13732:6;:11;13779:13;13728:25;13564:251;;12870:963;14103:13;;12733:1398;12608:1533;14157:31;;;;;;;;;;;;;;12515:1680;;;;:::o;18746:474::-;18845:27;18874:23;18913:38;18954:15;:24;18970:7;18954:24;;;;;;;;;;;18913:65;;19128:18;19105:41;;19184:19;19178:26;19159:45;;19091:123;18746:474;;;:::o;40612:103::-;40672:7;40698:10;40691:17;;40612:103;:::o;17992:646::-;18137:11;18299:16;18292:5;18288:28;18279:37;;18457:16;18446:9;18442:32;18429:45;;18605:15;18594:9;18591:30;18583:5;18572:9;18569:20;18566:56;18556:66;;17992:646;;;;;:::o;24484:154::-;;;;;:::o;39939:304::-;40070:7;40089:16;2513:3;40115:19;:41;;40089:68;;2513:3;40182:31;40193:4;40199:2;40203:9;40182:10;:31::i;:::-;40174:40;;:62;;40167:69;;;39939:304;;;;;:::o;14728:443::-;14808:14;14973:16;14966:5;14962:28;14953:37;;15148:5;15134:11;15109:23;15105:41;15102:52;15095:5;15092:63;15082:73;;14728:443;;;;:::o;25285:153::-;;;;;:::o;586:96:0:-;639:7;665:10;658:17;;586:96;:::o;35270:3015:1:-;35349:27;35379;35398:7;35379:18;:27::i;:::-;35349:57;;35417:12;35448:19;35417:52;;35481:27;35510:23;35537:35;35564:7;35537:26;:35::i;:::-;35480:92;;;;35587:13;35583:312;;;35706:68;35731:15;35748:4;35754:19;:17;:19::i;:::-;35706:24;:68::i;:::-;35701:183;;35797:43;35814:4;35820:19;:17;:19::i;:::-;35797:16;:43::i;:::-;35792:92;;35849:35;;;;;;;;;;;;;;35792:92;35701:183;35583:312;35905:51;35927:4;35941:1;35945:7;35954:1;35905:21;:51::i;:::-;36045:15;36042:157;;;36183:1;36162:19;36155:30;36042:157;36847:1;1619:3;36817:1;:26;;36816:32;36788:18;:24;36807:4;36788:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;37108:173;37144:4;37214:53;37229:4;37243:1;37247:19;37214:14;:53::i;:::-;2392:8;2118;37167:43;37166:101;37108:18;:173::i;:::-;37079:17;:26;37097:7;37079:26;;;;;;;;;;;:202;;;;37449:1;2392:8;37398:19;:47;:52;37394:617;;37470:19;37502:1;37492:7;:11;37470:33;;37657:1;37623:17;:30;37641:11;37623:30;;;;;;;;;;;;:35;37619:378;;37759:13;;37744:11;:28;37740:239;;37937:19;37904:17;:30;37922:11;37904:30;;;;;;;;;;;:52;;;;37740:239;37619:378;37452:559;37394:617;38063:7;38059:1;38036:35;;38045:4;38036:35;;;;;;;;;;;;38081:50;38102:4;38116:1;38120:7;38129:1;38081:20;:50::i;:::-;38254:12;;:14;;;;;;;;;;;;;35339:2946;;;;35270:3015;;:::o;2034:169:9:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;11979:159:1:-;12047:21;;:::i;:::-;12087:44;12106:17;:24;12124:5;12106:24;;;;;;;;;;;;12087:18;:44::i;:::-;12080:51;;11979:159;;;:::o;5590:101::-;5645:7;5671:13;;5664:20;;5590:101;:::o;25866:697::-;26024:4;26069:2;26044:45;;;26090:19;:17;:19::i;:::-;26111:4;26117:7;26126:5;26044:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26040:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26339:1;26322:6;:13;:18;26318:229;;26367:40;;;;;;;;;;;;;;26318:229;26507:6;26501:13;26492:6;26488:2;26484:15;26477:38;26040:517;26210:54;;;26200:64;;;:6;:64;;;;26193:71;;;25866:697;;;;;;:::o;11724:164::-;11794:21;;:::i;:::-;11834:47;11853:27;11872:7;11853:18;:27::i;:::-;11834:18;:47::i;:::-;11827:54;;11724:164;;;:::o;1946:106:8:-;2006:13;2038:7;2031:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1946:106;:::o;40812:1708:1:-;40877:17;41305:4;41298;41292:11;41288:22;41395:1;41389:4;41382:15;41468:4;41465:1;41461:12;41454:19;;41548:1;41543:3;41536:14;41649:3;41883:5;41865:419;41891:1;41865:419;;;41930:1;41925:3;41921:11;41914:18;;42098:2;42092:4;42088:13;42084:2;42080:22;42075:3;42067:36;42190:2;42184:4;42180:13;42172:21;;42255:4;41865:419;42245:25;41865:419;41869:21;42321:3;42316;42312:13;42434:4;42429:3;42425:14;42418:21;;42497:6;42492:3;42485:19;40915:1599;;;40812:1708;;;:::o;7352:176::-;7413:7;1360:13;1495:2;7440:18;:25;7459:5;7440:25;;;;;;;;;;;;;;;;:50;;7439:82;7432:89;;7352:176;;;:::o;32593:669::-;32719:19;32725:2;32729:8;32719:5;:19::i;:::-;32795:1;32777:2;:14;;;:19;32773:473;;32816:11;32830:13;;32816:27;;32861:13;32883:8;32877:3;:14;32861:30;;32909:229;32939:62;32978:1;32982:2;32986:7;;;;;;32995:5;32939:30;:62::i;:::-;32934:165;;33036:40;;;;;;;;;;;;;;32934:165;33133:3;33125:5;:11;32909:229;;33218:3;33201:13;;:20;33197:34;;33223:8;;;33197:34;32798:448;;32773:473;32593:669;;;:::o;1991:290:7:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;39650:143:1:-;39783:6;39650:143;;;;;:::o;14289:361::-;14355:31;;:::i;:::-;14431:6;14398:9;:14;;:41;;;;;;;;;;;2004:3;14483:6;:33;;14449:9;:24;;:68;;;;;;;;;;;14574:1;2118:8;14546:6;:24;:29;;14527:9;:16;;:48;;;;;;;;;;;2513:3;14614:6;:28;;14585:9;:19;;:58;;;;;;;;;;;14289:361;;;:::o;27009:2902::-;27081:20;27104:13;;27081:36;;27143:1;27131:8;:13;27127:44;;27153:18;;;;;;;;;;;;;;27127:44;27182:61;27212:1;27216:2;27220:12;27234:8;27182:21;:61::i;:::-;27715:1;1495:2;27685:1;:26;;27684:32;27672:8;:45;27646:18;:22;27665:2;27646:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;27987:136;28023:2;28076:33;28099:1;28103:2;28107:1;28076:14;:33::i;:::-;28043:30;28064:8;28043:20;:30::i;:::-;:66;27987:18;:136::i;:::-;27953:17;:31;27971:12;27953:31;;;;;;;;;;;:170;;;;28138:16;28168:11;28197:8;28182:12;:23;28168:37;;28710:16;28706:2;28702:25;28690:37;;29074:12;29035:8;28995:1;28934:25;28876:1;28816;28790:328;29438:1;29424:12;29420:20;29379:339;29478:3;29469:7;29466:16;29379:339;;29692:7;29682:8;29679:1;29652:25;29649:1;29646;29641:59;29530:1;29521:7;29517:15;29506:26;;29379:339;;;29383:75;29761:1;29749:8;:13;29745:45;;29771:19;;;;;;;;;;;;;;29745:45;29821:3;29805:13;:19;;;;27426:2409;;29844:60;29873:1;29877:2;29881:12;29895:8;29844:20;:60::i;:::-;27071:2840;27009:2902;;:::o;5518:147:7:-;5581:7;5611:1;5607;:5;:51;;5638:20;5653:1;5656;5638:14;:20::i;:::-;5607:51;;;5615:20;5630:1;5633;5615:14;:20::i;:::-;5607:51;5600:58;;5518:147;;;;:::o;15268:318:1:-;15338:14;15567:1;15557:8;15554:15;15528:24;15524:46;15514:56;;15268:318;;;:::o;5671:261:7:-;5739:13;5843:1;5837:4;5830:15;5871:1;5865:4;5858:15;5911:4;5905;5895:21;5886:30;;5671:261;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:126:11:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:122::-;2494:24;2512:5;2494:24;:::i;:::-;2487:5;2484:35;2474:63;;2533:1;2530;2523:12;2474:63;2421:122;:::o;2549:139::-;2595:5;2633:6;2620:20;2611:29;;2649:33;2676:5;2649:33;:::i;:::-;2549:139;;;;:::o;2694:117::-;2803:1;2800;2793:12;2817:102;2858:6;2909:2;2905:7;2900:2;2893:5;2889:14;2885:28;2875:38;;2817:102;;;:::o;2925:180::-;2973:77;2970:1;2963:88;3070:4;3067:1;3060:15;3094:4;3091:1;3084:15;3111:281;3194:27;3216:4;3194:27;:::i;:::-;3186:6;3182:40;3324:6;3312:10;3309:22;3288:18;3276:10;3273:34;3270:62;3267:88;;;3335:18;;:::i;:::-;3267:88;3375:10;3371:2;3364:22;3154:238;3111:281;;:::o;3398:129::-;3432:6;3459:20;;:::i;:::-;3449:30;;3488:33;3516:4;3508:6;3488:33;:::i;:::-;3398:129;;;:::o;3533:311::-;3610:4;3700:18;3692:6;3689:30;3686:56;;;3722:18;;:::i;:::-;3686:56;3772:4;3764:6;3760:17;3752:25;;3832:4;3826;3822:15;3814:23;;3533:311;;;:::o;3850:117::-;3959:1;3956;3949:12;3973:77;4010:7;4039:5;4028:16;;3973:77;;;:::o;4056:122::-;4129:24;4147:5;4129:24;:::i;:::-;4122:5;4119:35;4109:63;;4168:1;4165;4158:12;4109:63;4056:122;:::o;4184:139::-;4230:5;4268:6;4255:20;4246:29;;4284:33;4311:5;4284:33;:::i;:::-;4184:139;;;;:::o;4346:710::-;4442:5;4467:81;4483:64;4540:6;4483:64;:::i;:::-;4467:81;:::i;:::-;4458:90;;4568:5;4597:6;4590:5;4583:21;4631:4;4624:5;4620:16;4613:23;;4684:4;4676:6;4672:17;4664:6;4660:30;4713:3;4705:6;4702:15;4699:122;;;4732:79;;:::i;:::-;4699:122;4847:6;4830:220;4864:6;4859:3;4856:15;4830:220;;;4939:3;4968:37;5001:3;4989:10;4968:37;:::i;:::-;4963:3;4956:50;5035:4;5030:3;5026:14;5019:21;;4906:144;4890:4;4885:3;4881:14;4874:21;;4830:220;;;4834:21;4448:608;;4346:710;;;;;:::o;5079:370::-;5150:5;5199:3;5192:4;5184:6;5180:17;5176:27;5166:122;;5207:79;;:::i;:::-;5166:122;5324:6;5311:20;5349:94;5439:3;5431:6;5424:4;5416:6;5412:17;5349:94;:::i;:::-;5340:103;;5156:293;5079:370;;;;:::o;5455:684::-;5548:6;5556;5605:2;5593:9;5584:7;5580:23;5576:32;5573:119;;;5611:79;;:::i;:::-;5573:119;5731:1;5756:53;5801:7;5792:6;5781:9;5777:22;5756:53;:::i;:::-;5746:63;;5702:117;5886:2;5875:9;5871:18;5858:32;5917:18;5909:6;5906:30;5903:117;;;5939:79;;:::i;:::-;5903:117;6044:78;6114:7;6105:6;6094:9;6090:22;6044:78;:::i;:::-;6034:88;;5829:303;5455:684;;;;;:::o;6145:99::-;6197:6;6231:5;6225:12;6215:22;;6145:99;;;:::o;6250:169::-;6334:11;6368:6;6363:3;6356:19;6408:4;6403:3;6399:14;6384:29;;6250:169;;;;:::o;6425:246::-;6506:1;6516:113;6530:6;6527:1;6524:13;6516:113;;;6615:1;6610:3;6606:11;6600:18;6596:1;6591:3;6587:11;6580:39;6552:2;6549:1;6545:10;6540:15;;6516:113;;;6663:1;6654:6;6649:3;6645:16;6638:27;6487:184;6425:246;;;:::o;6677:377::-;6765:3;6793:39;6826:5;6793:39;:::i;:::-;6848:71;6912:6;6907:3;6848:71;:::i;:::-;6841:78;;6928:65;6986:6;6981:3;6974:4;6967:5;6963:16;6928:65;:::i;:::-;7018:29;7040:6;7018:29;:::i;:::-;7013:3;7009:39;7002:46;;6769:285;6677:377;;;;:::o;7060:313::-;7173:4;7211:2;7200:9;7196:18;7188:26;;7260:9;7254:4;7250:20;7246:1;7235:9;7231:17;7224:47;7288:78;7361:4;7352:6;7288:78;:::i;:::-;7280:86;;7060:313;;;;:::o;7379:329::-;7438:6;7487:2;7475:9;7466:7;7462:23;7458:32;7455:119;;;7493:79;;:::i;:::-;7455:119;7613:1;7638:53;7683:7;7674:6;7663:9;7659:22;7638:53;:::i;:::-;7628:63;;7584:117;7379:329;;;;:::o;7714:222::-;7807:4;7845:2;7834:9;7830:18;7822:26;;7858:71;7926:1;7915:9;7911:17;7902:6;7858:71;:::i;:::-;7714:222;;;;:::o;7942:122::-;8015:24;8033:5;8015:24;:::i;:::-;8008:5;8005:35;7995:63;;8054:1;8051;8044:12;7995:63;7942:122;:::o;8070:139::-;8116:5;8154:6;8141:20;8132:29;;8170:33;8197:5;8170:33;:::i;:::-;8070:139;;;;:::o;8215:474::-;8283:6;8291;8340:2;8328:9;8319:7;8315:23;8311:32;8308:119;;;8346:79;;:::i;:::-;8308:119;8466:1;8491:53;8536:7;8527:6;8516:9;8512:22;8491:53;:::i;:::-;8481:63;;8437:117;8593:2;8619:53;8664:7;8655:6;8644:9;8640:22;8619:53;:::i;:::-;8609:63;;8564:118;8215:474;;;;;:::o;8695:684::-;8788:6;8796;8845:2;8833:9;8824:7;8820:23;8816:32;8813:119;;;8851:79;;:::i;:::-;8813:119;8999:1;8988:9;8984:17;8971:31;9029:18;9021:6;9018:30;9015:117;;;9051:79;;:::i;:::-;9015:117;9156:78;9226:7;9217:6;9206:9;9202:22;9156:78;:::i;:::-;9146:88;;8942:302;9283:2;9309:53;9354:7;9345:6;9334:9;9330:22;9309:53;:::i;:::-;9299:63;;9254:118;8695:684;;;;;:::o;9385:222::-;9478:4;9516:2;9505:9;9501:18;9493:26;;9529:71;9597:1;9586:9;9582:17;9573:6;9529:71;:::i;:::-;9385:222;;;;:::o;9613:619::-;9690:6;9698;9706;9755:2;9743:9;9734:7;9730:23;9726:32;9723:119;;;9761:79;;:::i;:::-;9723:119;9881:1;9906:53;9951:7;9942:6;9931:9;9927:22;9906:53;:::i;:::-;9896:63;;9852:117;10008:2;10034:53;10079:7;10070:6;10059:9;10055:22;10034:53;:::i;:::-;10024:63;;9979:118;10136:2;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10107:118;9613:619;;;;;:::o;10238:118::-;10325:24;10343:5;10325:24;:::i;:::-;10320:3;10313:37;10238:118;;:::o;10362:222::-;10455:4;10493:2;10482:9;10478:18;10470:26;;10506:71;10574:1;10563:9;10559:17;10550:6;10506:71;:::i;:::-;10362:222;;;;:::o;10590:117::-;10699:1;10696;10689:12;10713:308;10775:4;10865:18;10857:6;10854:30;10851:56;;;10887:18;;:::i;:::-;10851:56;10925:29;10947:6;10925:29;:::i;:::-;10917:37;;11009:4;11003;10999:15;10991:23;;10713:308;;;:::o;11027:146::-;11124:6;11119:3;11114;11101:30;11165:1;11156:6;11151:3;11147:16;11140:27;11027:146;;;:::o;11179:425::-;11257:5;11282:66;11298:49;11340:6;11298:49;:::i;:::-;11282:66;:::i;:::-;11273:75;;11371:6;11364:5;11357:21;11409:4;11402:5;11398:16;11447:3;11438:6;11433:3;11429:16;11426:25;11423:112;;;11454:79;;:::i;:::-;11423:112;11544:54;11591:6;11586:3;11581;11544:54;:::i;:::-;11263:341;11179:425;;;;;:::o;11624:340::-;11680:5;11729:3;11722:4;11714:6;11710:17;11706:27;11696:122;;11737:79;;:::i;:::-;11696:122;11854:6;11841:20;11879:79;11954:3;11946:6;11939:4;11931:6;11927:17;11879:79;:::i;:::-;11870:88;;11686:278;11624:340;;;;:::o;11970:509::-;12039:6;12088:2;12076:9;12067:7;12063:23;12059:32;12056:119;;;12094:79;;:::i;:::-;12056:119;12242:1;12231:9;12227:17;12214:31;12272:18;12264:6;12261:30;12258:117;;;12294:79;;:::i;:::-;12258:117;12399:63;12454:7;12445:6;12434:9;12430:22;12399:63;:::i;:::-;12389:73;;12185:287;11970:509;;;;:::o;12485:117::-;12594:1;12591;12584:12;12625:568;12698:8;12708:6;12758:3;12751:4;12743:6;12739:17;12735:27;12725:122;;12766:79;;:::i;:::-;12725:122;12879:6;12866:20;12856:30;;12909:18;12901:6;12898:30;12895:117;;;12931:79;;:::i;:::-;12895:117;13045:4;13037:6;13033:17;13021:29;;13099:3;13091:4;13083:6;13079:17;13069:8;13065:32;13062:41;13059:128;;;13106:79;;:::i;:::-;13059:128;12625:568;;;;;:::o;13199:559::-;13285:6;13293;13342:2;13330:9;13321:7;13317:23;13313:32;13310:119;;;13348:79;;:::i;:::-;13310:119;13496:1;13485:9;13481:17;13468:31;13526:18;13518:6;13515:30;13512:117;;;13548:79;;:::i;:::-;13512:117;13661:80;13733:7;13724:6;13713:9;13709:22;13661:80;:::i;:::-;13643:98;;;;13439:312;13199:559;;;;;:::o;13764:146::-;13863:6;13897:5;13891:12;13881:22;;13764:146;;;:::o;13916:216::-;14047:11;14081:6;14076:3;14069:19;14121:4;14116:3;14112:14;14097:29;;13916:216;;;;:::o;14138:164::-;14237:4;14260:3;14252:11;;14290:4;14285:3;14281:14;14273:22;;14138:164;;;:::o;14308:108::-;14385:24;14403:5;14385:24;:::i;:::-;14380:3;14373:37;14308:108;;:::o;14422:101::-;14458:7;14498:18;14491:5;14487:30;14476:41;;14422:101;;;:::o;14529:105::-;14604:23;14621:5;14604:23;:::i;:::-;14599:3;14592:36;14529:105;;:::o;14640:99::-;14711:21;14726:5;14711:21;:::i;:::-;14706:3;14699:34;14640:99;;:::o;14745:91::-;14781:7;14821:8;14814:5;14810:20;14799:31;;14745:91;;;:::o;14842:105::-;14917:23;14934:5;14917:23;:::i;:::-;14912:3;14905:36;14842:105;;:::o;15025:866::-;15176:4;15171:3;15167:14;15263:4;15256:5;15252:16;15246:23;15282:63;15339:4;15334:3;15330:14;15316:12;15282:63;:::i;:::-;15191:164;15447:4;15440:5;15436:16;15430:23;15466:61;15521:4;15516:3;15512:14;15498:12;15466:61;:::i;:::-;15365:172;15621:4;15614:5;15610:16;15604:23;15640:57;15691:4;15686:3;15682:14;15668:12;15640:57;:::i;:::-;15547:160;15794:4;15787:5;15783:16;15777:23;15813:61;15868:4;15863:3;15859:14;15845:12;15813:61;:::i;:::-;15717:167;15145:746;15025:866;;:::o;15897:307::-;16030:10;16051:110;16157:3;16149:6;16051:110;:::i;:::-;16193:4;16188:3;16184:14;16170:28;;15897:307;;;;:::o;16210:145::-;16312:4;16344;16339:3;16335:14;16327:22;;16210:145;;;:::o;16437:988::-;16620:3;16649:86;16729:5;16649:86;:::i;:::-;16751:118;16862:6;16857:3;16751:118;:::i;:::-;16744:125;;16893:88;16975:5;16893:88;:::i;:::-;17004:7;17035:1;17020:380;17045:6;17042:1;17039:13;17020:380;;;17121:6;17115:13;17148:127;17271:3;17256:13;17148:127;:::i;:::-;17141:134;;17298:92;17383:6;17298:92;:::i;:::-;17288:102;;17080:320;17067:1;17064;17060:9;17055:14;;17020:380;;;17024:14;17416:3;17409:10;;16625:800;;;16437:988;;;;:::o;17431:501::-;17638:4;17676:2;17665:9;17661:18;17653:26;;17725:9;17719:4;17715:20;17711:1;17700:9;17696:17;17689:47;17753:172;17920:4;17911:6;17753:172;:::i;:::-;17745:180;;17431:501;;;;:::o;17938:329::-;17997:6;18046:2;18034:9;18025:7;18021:23;18017:32;18014:119;;;18052:79;;:::i;:::-;18014:119;18172:1;18197:53;18242:7;18233:6;18222:9;18218:22;18197:53;:::i;:::-;18187:63;;18143:117;17938:329;;;;:::o;18273:114::-;18340:6;18374:5;18368:12;18358:22;;18273:114;;;:::o;18393:184::-;18492:11;18526:6;18521:3;18514:19;18566:4;18561:3;18557:14;18542:29;;18393:184;;;;:::o;18583:132::-;18650:4;18673:3;18665:11;;18703:4;18698:3;18694:14;18686:22;;18583:132;;;:::o;18721:108::-;18798:24;18816:5;18798:24;:::i;:::-;18793:3;18786:37;18721:108;;:::o;18835:179::-;18904:10;18925:46;18967:3;18959:6;18925:46;:::i;:::-;19003:4;18998:3;18994:14;18980:28;;18835:179;;;;:::o;19020:113::-;19090:4;19122;19117:3;19113:14;19105:22;;19020:113;;;:::o;19169:732::-;19288:3;19317:54;19365:5;19317:54;:::i;:::-;19387:86;19466:6;19461:3;19387:86;:::i;:::-;19380:93;;19497:56;19547:5;19497:56;:::i;:::-;19576:7;19607:1;19592:284;19617:6;19614:1;19611:13;19592:284;;;19693:6;19687:13;19720:63;19779:3;19764:13;19720:63;:::i;:::-;19713:70;;19806:60;19859:6;19806:60;:::i;:::-;19796:70;;19652:224;19639:1;19636;19632:9;19627:14;;19592:284;;;19596:14;19892:3;19885:10;;19293:608;;;19169:732;;;;:::o;19907:373::-;20050:4;20088:2;20077:9;20073:18;20065:26;;20137:9;20131:4;20127:20;20123:1;20112:9;20108:17;20101:47;20165:108;20268:4;20259:6;20165:108;:::i;:::-;20157:116;;19907:373;;;;:::o;20286:619::-;20363:6;20371;20379;20428:2;20416:9;20407:7;20403:23;20399:32;20396:119;;;20434:79;;:::i;:::-;20396:119;20554:1;20579:53;20624:7;20615:6;20604:9;20600:22;20579:53;:::i;:::-;20569:63;;20525:117;20681:2;20707:53;20752:7;20743:6;20732:9;20728:22;20707:53;:::i;:::-;20697:63;;20652:118;20809:2;20835:53;20880:7;20871:6;20860:9;20856:22;20835:53;:::i;:::-;20825:63;;20780:118;20286:619;;;;;:::o;20911:442::-;21060:4;21098:2;21087:9;21083:18;21075:26;;21111:71;21179:1;21168:9;21164:17;21155:6;21111:71;:::i;:::-;21192:72;21260:2;21249:9;21245:18;21236:6;21192:72;:::i;:::-;21274;21342:2;21331:9;21327:18;21318:6;21274:72;:::i;:::-;20911:442;;;;;;:::o;21359:116::-;21429:21;21444:5;21429:21;:::i;:::-;21422:5;21419:32;21409:60;;21465:1;21462;21455:12;21409:60;21359:116;:::o;21481:133::-;21524:5;21562:6;21549:20;21540:29;;21578:30;21602:5;21578:30;:::i;:::-;21481:133;;;;:::o;21620:468::-;21685:6;21693;21742:2;21730:9;21721:7;21717:23;21713:32;21710:119;;;21748:79;;:::i;:::-;21710:119;21868:1;21893:53;21938:7;21929:6;21918:9;21914:22;21893:53;:::i;:::-;21883:63;;21839:117;21995:2;22021:50;22063:7;22054:6;22043:9;22039:22;22021:50;:::i;:::-;22011:60;;21966:115;21620:468;;;;;:::o;22094:329::-;22153:6;22202:2;22190:9;22181:7;22177:23;22173:32;22170:119;;;22208:79;;:::i;:::-;22170:119;22328:1;22353:53;22398:7;22389:6;22378:9;22374:22;22353:53;:::i;:::-;22343:63;;22299:117;22094:329;;;;:::o;22429:307::-;22490:4;22580:18;22572:6;22569:30;22566:56;;;22602:18;;:::i;:::-;22566:56;22640:29;22662:6;22640:29;:::i;:::-;22632:37;;22724:4;22718;22714:15;22706:23;;22429:307;;;:::o;22742:423::-;22819:5;22844:65;22860:48;22901:6;22860:48;:::i;:::-;22844:65;:::i;:::-;22835:74;;22932:6;22925:5;22918:21;22970:4;22963:5;22959:16;23008:3;22999:6;22994:3;22990:16;22987:25;22984:112;;;23015:79;;:::i;:::-;22984:112;23105:54;23152:6;23147:3;23142;23105:54;:::i;:::-;22825:340;22742:423;;;;;:::o;23184:338::-;23239:5;23288:3;23281:4;23273:6;23269:17;23265:27;23255:122;;23296:79;;:::i;:::-;23255:122;23413:6;23400:20;23438:78;23512:3;23504:6;23497:4;23489:6;23485:17;23438:78;:::i;:::-;23429:87;;23245:277;23184:338;;;;:::o;23528:943::-;23623:6;23631;23639;23647;23696:3;23684:9;23675:7;23671:23;23667:33;23664:120;;;23703:79;;:::i;:::-;23664:120;23823:1;23848:53;23893:7;23884:6;23873:9;23869:22;23848:53;:::i;:::-;23838:63;;23794:117;23950:2;23976:53;24021:7;24012:6;24001:9;23997:22;23976:53;:::i;:::-;23966:63;;23921:118;24078:2;24104:53;24149:7;24140:6;24129:9;24125:22;24104:53;:::i;:::-;24094:63;;24049:118;24234:2;24223:9;24219:18;24206:32;24265:18;24257:6;24254:30;24251:117;;;24287:79;;:::i;:::-;24251:117;24392:62;24446:7;24437:6;24426:9;24422:22;24392:62;:::i;:::-;24382:72;;24177:287;23528:943;;;;;;;:::o;24549:876::-;24710:4;24705:3;24701:14;24797:4;24790:5;24786:16;24780:23;24816:63;24873:4;24868:3;24864:14;24850:12;24816:63;:::i;:::-;24725:164;24981:4;24974:5;24970:16;24964:23;25000:61;25055:4;25050:3;25046:14;25032:12;25000:61;:::i;:::-;24899:172;25155:4;25148:5;25144:16;25138:23;25174:57;25225:4;25220:3;25216:14;25202:12;25174:57;:::i;:::-;25081:160;25328:4;25321:5;25317:16;25311:23;25347:61;25402:4;25397:3;25393:14;25379:12;25347:61;:::i;:::-;25251:167;24679:746;24549:876;;:::o;25431:351::-;25588:4;25626:3;25615:9;25611:19;25603:27;;25640:135;25772:1;25761:9;25757:17;25748:6;25640:135;:::i;:::-;25431:351;;;;:::o;25788:474::-;25856:6;25864;25913:2;25901:9;25892:7;25888:23;25884:32;25881:119;;;25919:79;;:::i;:::-;25881:119;26039:1;26064:53;26109:7;26100:6;26089:9;26085:22;26064:53;:::i;:::-;26054:63;;26010:117;26166:2;26192:53;26237:7;26228:6;26217:9;26213:22;26192:53;:::i;:::-;26182:63;;26137:118;25788:474;;;;;:::o;26268:181::-;26408:33;26404:1;26396:6;26392:14;26385:57;26268:181;:::o;26455:366::-;26597:3;26618:67;26682:2;26677:3;26618:67;:::i;:::-;26611:74;;26694:93;26783:3;26694:93;:::i;:::-;26812:2;26807:3;26803:12;26796:19;;26455:366;;;:::o;26827:419::-;26993:4;27031:2;27020:9;27016:18;27008:26;;27080:9;27074:4;27070:20;27066:1;27055:9;27051:17;27044:47;27108:131;27234:4;27108:131;:::i;:::-;27100:139;;26827:419;;;:::o;27252:180::-;27300:77;27297:1;27290:88;27397:4;27394:1;27387:15;27421:4;27418:1;27411:15;27438:191;27478:3;27497:20;27515:1;27497:20;:::i;:::-;27492:25;;27531:20;27549:1;27531:20;:::i;:::-;27526:25;;27574:1;27571;27567:9;27560:16;;27595:3;27592:1;27589:10;27586:36;;;27602:18;;:::i;:::-;27586:36;27438:191;;;;:::o;27635:182::-;27775:34;27771:1;27763:6;27759:14;27752:58;27635:182;:::o;27823:366::-;27965:3;27986:67;28050:2;28045:3;27986:67;:::i;:::-;27979:74;;28062:93;28151:3;28062:93;:::i;:::-;28180:2;28175:3;28171:12;28164:19;;27823:366;;;:::o;28195:419::-;28361:4;28399:2;28388:9;28384:18;28376:26;;28448:9;28442:4;28438:20;28434:1;28423:9;28419:17;28412:47;28476:131;28602:4;28476:131;:::i;:::-;28468:139;;28195:419;;;:::o;28620:173::-;28760:25;28756:1;28748:6;28744:14;28737:49;28620:173;:::o;28799:366::-;28941:3;28962:67;29026:2;29021:3;28962:67;:::i;:::-;28955:74;;29038:93;29127:3;29038:93;:::i;:::-;29156:2;29151:3;29147:12;29140:19;;28799:366;;;:::o;29171:419::-;29337:4;29375:2;29364:9;29360:18;29352:26;;29424:9;29418:4;29414:20;29410:1;29399:9;29395:17;29388:47;29452:131;29578:4;29452:131;:::i;:::-;29444:139;;29171:419;;;:::o;29596:194::-;29636:4;29656:20;29674:1;29656:20;:::i;:::-;29651:25;;29690:20;29708:1;29690:20;:::i;:::-;29685:25;;29734:1;29731;29727:9;29719:17;;29758:1;29752:4;29749:11;29746:37;;;29763:18;;:::i;:::-;29746:37;29596:194;;;;:::o;29796:410::-;29836:7;29859:20;29877:1;29859:20;:::i;:::-;29854:25;;29893:20;29911:1;29893:20;:::i;:::-;29888:25;;29948:1;29945;29941:9;29970:30;29988:11;29970:30;:::i;:::-;29959:41;;30149:1;30140:7;30136:15;30133:1;30130:22;30110:1;30103:9;30083:83;30060:139;;30179:18;;:::i;:::-;30060:139;29844:362;29796:410;;;;:::o;30212:181::-;30352:33;30348:1;30340:6;30336:14;30329:57;30212:181;:::o;30399:366::-;30541:3;30562:67;30626:2;30621:3;30562:67;:::i;:::-;30555:74;;30638:93;30727:3;30638:93;:::i;:::-;30756:2;30751:3;30747:12;30740:19;;30399:366;;;:::o;30771:419::-;30937:4;30975:2;30964:9;30960:18;30952:26;;31024:9;31018:4;31014:20;31010:1;30999:9;30995:17;30988:47;31052:131;31178:4;31052:131;:::i;:::-;31044:139;;30771:419;;;:::o;31196:180::-;31244:77;31241:1;31234:88;31341:4;31338:1;31331:15;31365:4;31362:1;31355:15;31382:320;31426:6;31463:1;31457:4;31453:12;31443:22;;31510:1;31504:4;31500:12;31531:18;31521:81;;31587:4;31579:6;31575:17;31565:27;;31521:81;31649:2;31641:6;31638:14;31618:18;31615:38;31612:84;;31668:18;;:::i;:::-;31612:84;31433:269;31382:320;;;:::o;31708:94::-;31741:8;31789:5;31785:2;31781:14;31760:35;;31708:94;;;:::o;31808:::-;31847:7;31876:20;31890:5;31876:20;:::i;:::-;31865:31;;31808:94;;;:::o;31908:100::-;31947:7;31976:26;31996:5;31976:26;:::i;:::-;31965:37;;31908:100;;;:::o;32014:157::-;32119:45;32139:24;32157:5;32139:24;:::i;:::-;32119:45;:::i;:::-;32114:3;32107:58;32014:157;;:::o;32177:256::-;32289:3;32304:75;32375:3;32366:6;32304:75;:::i;:::-;32404:2;32399:3;32395:12;32388:19;;32424:3;32417:10;;32177:256;;;;:::o;32439:182::-;32579:34;32575:1;32567:6;32563:14;32556:58;32439:182;:::o;32627:366::-;32769:3;32790:67;32854:2;32849:3;32790:67;:::i;:::-;32783:74;;32866:93;32955:3;32866:93;:::i;:::-;32984:2;32979:3;32975:12;32968:19;;32627:366;;;:::o;32999:419::-;33165:4;33203:2;33192:9;33188:18;33180:26;;33252:9;33246:4;33242:20;33238:1;33227:9;33223:17;33216:47;33280:131;33406:4;33280:131;:::i;:::-;33272:139;;32999:419;;;:::o;33424:141::-;33473:4;33496:3;33488:11;;33519:3;33516:1;33509:14;33553:4;33550:1;33540:18;33532:26;;33424:141;;;:::o;33571:93::-;33608:6;33655:2;33650;33643:5;33639:14;33635:23;33625:33;;33571:93;;;:::o;33670:107::-;33714:8;33764:5;33758:4;33754:16;33733:37;;33670:107;;;;:::o;33783:393::-;33852:6;33902:1;33890:10;33886:18;33925:97;33955:66;33944:9;33925:97;:::i;:::-;34043:39;34073:8;34062:9;34043:39;:::i;:::-;34031:51;;34115:4;34111:9;34104:5;34100:21;34091:30;;34164:4;34154:8;34150:19;34143:5;34140:30;34130:40;;33859:317;;33783:393;;;;;:::o;34182:60::-;34210:3;34231:5;34224:12;;34182:60;;;:::o;34248:142::-;34298:9;34331:53;34349:34;34358:24;34376:5;34358:24;:::i;:::-;34349:34;:::i;:::-;34331:53;:::i;:::-;34318:66;;34248:142;;;:::o;34396:75::-;34439:3;34460:5;34453:12;;34396:75;;;:::o;34477:269::-;34587:39;34618:7;34587:39;:::i;:::-;34648:91;34697:41;34721:16;34697:41;:::i;:::-;34689:6;34682:4;34676:11;34648:91;:::i;:::-;34642:4;34635:105;34553:193;34477:269;;;:::o;34752:73::-;34797:3;34752:73;:::o;34831:189::-;34908:32;;:::i;:::-;34949:65;35007:6;34999;34993:4;34949:65;:::i;:::-;34884:136;34831:189;;:::o;35026:186::-;35086:120;35103:3;35096:5;35093:14;35086:120;;;35157:39;35194:1;35187:5;35157:39;:::i;:::-;35130:1;35123:5;35119:13;35110:22;;35086:120;;;35026:186;;:::o;35218:543::-;35319:2;35314:3;35311:11;35308:446;;;35353:38;35385:5;35353:38;:::i;:::-;35437:29;35455:10;35437:29;:::i;:::-;35427:8;35423:44;35620:2;35608:10;35605:18;35602:49;;;35641:8;35626:23;;35602:49;35664:80;35720:22;35738:3;35720:22;:::i;:::-;35710:8;35706:37;35693:11;35664:80;:::i;:::-;35323:431;;35308:446;35218:543;;;:::o;35767:117::-;35821:8;35871:5;35865:4;35861:16;35840:37;;35767:117;;;;:::o;35890:169::-;35934:6;35967:51;36015:1;36011:6;36003:5;36000:1;35996:13;35967:51;:::i;:::-;35963:56;36048:4;36042;36038:15;36028:25;;35941:118;35890:169;;;;:::o;36064:295::-;36140:4;36286:29;36311:3;36305:4;36286:29;:::i;:::-;36278:37;;36348:3;36345:1;36341:11;36335:4;36332:21;36324:29;;36064:295;;;;:::o;36364:1395::-;36481:37;36514:3;36481:37;:::i;:::-;36583:18;36575:6;36572:30;36569:56;;;36605:18;;:::i;:::-;36569:56;36649:38;36681:4;36675:11;36649:38;:::i;:::-;36734:67;36794:6;36786;36780:4;36734:67;:::i;:::-;36828:1;36852:4;36839:17;;36884:2;36876:6;36873:14;36901:1;36896:618;;;;37558:1;37575:6;37572:77;;;37624:9;37619:3;37615:19;37609:26;37600:35;;37572:77;37675:67;37735:6;37728:5;37675:67;:::i;:::-;37669:4;37662:81;37531:222;36866:887;;36896:618;36948:4;36944:9;36936:6;36932:22;36982:37;37014:4;36982:37;:::i;:::-;37041:1;37055:208;37069:7;37066:1;37063:14;37055:208;;;37148:9;37143:3;37139:19;37133:26;37125:6;37118:42;37199:1;37191:6;37187:14;37177:24;;37246:2;37235:9;37231:18;37218:31;;37092:4;37089:1;37085:12;37080:17;;37055:208;;;37291:6;37282:7;37279:19;37276:179;;;37349:9;37344:3;37340:19;37334:26;37392:48;37434:4;37426:6;37422:17;37411:9;37392:48;:::i;:::-;37384:6;37377:64;37299:156;37276:179;37501:1;37497;37489:6;37485:14;37481:22;37475:4;37468:36;36903:611;;;36866:887;;36456:1303;;;36364:1395;;:::o;37765:180::-;37813:77;37810:1;37803:88;37910:4;37907:1;37900:15;37934:4;37931:1;37924:15;37951:227;38091:34;38087:1;38079:6;38075:14;38068:58;38160:10;38155:2;38147:6;38143:15;38136:35;37951:227;:::o;38184:366::-;38326:3;38347:67;38411:2;38406:3;38347:67;:::i;:::-;38340:74;;38423:93;38512:3;38423:93;:::i;:::-;38541:2;38536:3;38532:12;38525:19;;38184:366;;;:::o;38556:419::-;38722:4;38760:2;38749:9;38745:18;38737:26;;38809:9;38803:4;38799:20;38795:1;38784:9;38780:17;38773:47;38837:131;38963:4;38837:131;:::i;:::-;38829:139;;38556:419;;;:::o;38981:181::-;39121:33;39117:1;39109:6;39105:14;39098:57;38981:181;:::o;39168:366::-;39310:3;39331:67;39395:2;39390:3;39331:67;:::i;:::-;39324:74;;39407:93;39496:3;39407:93;:::i;:::-;39525:2;39520:3;39516:12;39509:19;;39168:366;;;:::o;39540:419::-;39706:4;39744:2;39733:9;39729:18;39721:26;;39793:9;39787:4;39783:20;39779:1;39768:9;39764:17;39757:47;39821:131;39947:4;39821:131;:::i;:::-;39813:139;;39540:419;;;:::o;39965:180::-;40013:77;40010:1;40003:88;40110:4;40107:1;40100:15;40134:4;40131:1;40124:15;40151:185;40191:1;40208:20;40226:1;40208:20;:::i;:::-;40203:25;;40242:20;40260:1;40242:20;:::i;:::-;40237:25;;40281:1;40271:35;;40286:18;;:::i;:::-;40271:35;40328:1;40325;40321:9;40316:14;;40151:185;;;;:::o;40342:161::-;40482:13;40478:1;40470:6;40466:14;40459:37;40342:161;:::o;40509:366::-;40651:3;40672:67;40736:2;40731:3;40672:67;:::i;:::-;40665:74;;40748:93;40837:3;40748:93;:::i;:::-;40866:2;40861:3;40857:12;40850:19;;40509:366;;;:::o;40881:419::-;41047:4;41085:2;41074:9;41070:18;41062:26;;41134:9;41128:4;41124:20;41120:1;41109:9;41105:17;41098:47;41162:131;41288:4;41162:131;:::i;:::-;41154:139;;40881:419;;;:::o;41306:148::-;41408:11;41445:3;41430:18;;41306:148;;;;:::o;41460:390::-;41566:3;41594:39;41627:5;41594:39;:::i;:::-;41649:89;41731:6;41726:3;41649:89;:::i;:::-;41642:96;;41747:65;41805:6;41800:3;41793:4;41786:5;41782:16;41747:65;:::i;:::-;41837:6;41832:3;41828:16;41821:23;;41570:280;41460:390;;;;:::o;41856:435::-;42036:3;42058:95;42149:3;42140:6;42058:95;:::i;:::-;42051:102;;42170:95;42261:3;42252:6;42170:95;:::i;:::-;42163:102;;42282:3;42275:10;;41856:435;;;;;:::o;42297:225::-;42437:34;42433:1;42425:6;42421:14;42414:58;42506:8;42501:2;42493:6;42489:15;42482:33;42297:225;:::o;42528:366::-;42670:3;42691:67;42755:2;42750:3;42691:67;:::i;:::-;42684:74;;42767:93;42856:3;42767:93;:::i;:::-;42885:2;42880:3;42876:12;42869:19;;42528:366;;;:::o;42900:419::-;43066:4;43104:2;43093:9;43089:18;43081:26;;43153:9;43147:4;43143:20;43139:1;43128:9;43124:17;43117:47;43181:131;43307:4;43181:131;:::i;:::-;43173:139;;42900:419;;;:::o;43325:98::-;43376:6;43410:5;43404:12;43394:22;;43325:98;;;:::o;43429:168::-;43512:11;43546:6;43541:3;43534:19;43586:4;43581:3;43577:14;43562:29;;43429:168;;;;:::o;43603:373::-;43689:3;43717:38;43749:5;43717:38;:::i;:::-;43771:70;43834:6;43829:3;43771:70;:::i;:::-;43764:77;;43850:65;43908:6;43903:3;43896:4;43889:5;43885:16;43850:65;:::i;:::-;43940:29;43962:6;43940:29;:::i;:::-;43935:3;43931:39;43924:46;;43693:283;43603:373;;;;:::o;43982:640::-;44177:4;44215:3;44204:9;44200:19;44192:27;;44229:71;44297:1;44286:9;44282:17;44273:6;44229:71;:::i;:::-;44310:72;44378:2;44367:9;44363:18;44354:6;44310:72;:::i;:::-;44392;44460:2;44449:9;44445:18;44436:6;44392:72;:::i;:::-;44511:9;44505:4;44501:20;44496:2;44485:9;44481:18;44474:48;44539:76;44610:4;44601:6;44539:76;:::i;:::-;44531:84;;43982:640;;;;;;;:::o;44628:141::-;44684:5;44715:6;44709:13;44700:22;;44731:32;44757:5;44731:32;:::i;:::-;44628:141;;;;:::o;44775:349::-;44844:6;44893:2;44881:9;44872:7;44868:23;44864:32;44861:119;;;44899:79;;:::i;:::-;44861:119;45019:1;45044:63;45099:7;45090:6;45079:9;45075:22;45044:63;:::i;:::-;45034:73;;44990:127;44775:349;;;;:::o;45130:233::-;45169:3;45192:24;45210:5;45192:24;:::i;:::-;45183:33;;45238:66;45231:5;45228:77;45225:103;;45308:18;;:::i;:::-;45225:103;45355:1;45348:5;45344:13;45337:20;;45130:233;;;:::o
Swarm Source
ipfs://69815df3b913f118f409e17063d8544f20169a9ef48a61df30d8f59b39d7a9e1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.