Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 296 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 20061831 | 647 days ago | IN | 0 ETH | 0.00045772 | ||||
| Safe Transfer Fr... | 19671356 | 702 days ago | IN | 0 ETH | 0.00042689 | ||||
| Safe Transfer Fr... | 19663226 | 703 days ago | IN | 0 ETH | 0.00078959 | ||||
| Transfer From | 19662914 | 703 days ago | IN | 0 ETH | 0.00217997 | ||||
| Safe Transfer Fr... | 19430593 | 736 days ago | IN | 0 ETH | 0.00292994 | ||||
| Safe Transfer Fr... | 19164793 | 773 days ago | IN | 0 ETH | 0.00152991 | ||||
| Transfer From | 19148862 | 775 days ago | IN | 0 ETH | 0.00106859 | ||||
| Transfer From | 18135095 | 917 days ago | IN | 0 ETH | 0.00158445 | ||||
| Transfer From | 18095126 | 923 days ago | IN | 0 ETH | 0.0005678 | ||||
| Transfer From | 17944869 | 944 days ago | IN | 0 ETH | 0.00111266 | ||||
| Transfer From | 17900064 | 950 days ago | IN | 0 ETH | 0.00087771 | ||||
| Transfer From | 17876232 | 953 days ago | IN | 0 ETH | 0.00100278 | ||||
| Withdraw | 17339644 | 1029 days ago | IN | 0 ETH | 0.0016258 | ||||
| Transfer From | 17122642 | 1059 days ago | IN | 0 ETH | 0.00208734 | ||||
| Transfer From | 16905866 | 1090 days ago | IN | 0 ETH | 0.00124166 | ||||
| Transfer From | 16510234 | 1146 days ago | IN | 0 ETH | 0.00098768 | ||||
| Set Approval For... | 16230227 | 1185 days ago | IN | 0 ETH | 0.00075044 | ||||
| Presale | 16191974 | 1190 days ago | IN | 0 ETH | 0.00315102 | ||||
| Transfer From | 16176878 | 1192 days ago | IN | 0 ETH | 0.00157654 | ||||
| Transfer From | 15990718 | 1218 days ago | IN | 0 ETH | 0.00046975 | ||||
| Transfer From | 15990717 | 1218 days ago | IN | 0 ETH | 0.00203781 | ||||
| Transfer From | 15964593 | 1222 days ago | IN | 0 ETH | 0.00078922 | ||||
| Presale | 15806871 | 1244 days ago | IN | 0 ETH | 0.0015366 | ||||
| Mint | 15790510 | 1246 days ago | IN | 0.733 ETH | 0.00350781 | ||||
| Safe Transfer Fr... | 15784131 | 1247 days ago | IN | 0 ETH | 0.00311779 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Seven22
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import "./ReentrancyGuard.sol";
import "./MerkleProof.sol";
import "./Strings.sol";
import "./Delegated.sol";
import "./ERC721A.sol";
contract Seven22 is Delegated, ReentrancyGuard, ERC721A {
using Strings for uint256;
uint256 public immutable maxSupply = 7022;
uint256 public immutable maxPreSaleSupply = 678;
uint256 public immutable personalCap = 55;
address public immutable treasury = 0xCf11d957D94A7d2988d9f9b875EAFBB1A2D765D1;
uint256 public immutable teamAllocation = 60;
bool public teamClaimed = false;
string public baseURI;
uint256 public currentSupply = 2200;
bool public isPresaleActive;
bool public isPublicSaleActive;
bytes32 public merkleRoot;
uint256 public publicPrice = 733000000000000000;
uint256 public whitelistSold;
mapping(address => uint256) public whitelistAccountAmounts;
event BaseURI(string baseUri);
event Presale(address indexed user, uint256 qty);
constructor(bytes32 _merkleRoot)
Delegated()
ERC721A("Seven22 HDN FIGRZ", "HDNFIGRZ") {
merkleRoot = _merkleRoot;
}
function setBaseURI(string calldata _baseUri) external onlyOwner {
baseURI = _baseUri;
emit BaseURI(_baseUri);
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function setMerkleRoot(bytes32 root) external onlyOwner {
merkleRoot = root;
}
function setPublicPrice(uint256 _publicPrice) external onlyOwner {
publicPrice = _publicPrice;
}
function setSaleConfig( bool presaleState, bool publicState ) external onlyOwner{
isPresaleActive = presaleState;
isPublicSaleActive = publicState;
}
function setSupply( uint256 newSupply ) external onlyOwner{
require(newSupply <= maxSupply, "new supply too large");
currentSupply = newSupply;
}
function isWhitelisted(
address account,
bytes32[] memory proof,
uint256 alloc
) public view returns (bool) {
return
MerkleProof.verify(
proof,
merkleRoot,
keccak256(abi.encodePacked(keccak256(abi.encodePacked(account, alloc))))
);
}
/// @notice Allows whitelisted addresses to participate in the presale
/// @param proof the merkle proof that the given user with the provided allocation is in the merke tree
/// @param alloc the initial allocation to this whitelisted account
/// @param amount the amount of NFTs to mint
function presale(
bytes32[] memory proof,
uint256 alloc,
uint256 amount
) external nonReentrant {
require(isWhitelisted(_msgSender(), proof, alloc), "not whitelisted");
require(
whitelistAccountAmounts[_msgSender()] + amount <= alloc,
"all NFTs purchased"
);
require(isPresaleActive, "presale not started");
require(whitelistSold + amount <= maxPreSaleSupply, "max presale supply");
whitelistSold += amount;
whitelistAccountAmounts[_msgSender()] += amount;
_safeMint(_msgSender(), amount);
emit Presale(_msgSender(), amount);
}
/// @notice Mints the given quantity of tokens. Anyone can call it as long the
/// total price is paid
/// @param qty number of tokens to mint
function mint(uint256 qty) external payable nonReentrant {
require(isPublicSaleActive, "public sale not started yet");
require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
require(totalSupply() + qty <= currentSupply, "max supply");
require(msg.value == qty * publicPrice, "wrong amount");
_safeMint(_msgSender(), qty);
}
function withdraw() external onlyOwner {
(bool hs, ) = payable(0xa33a70FABFeb361Fe891C208B1c27ec0b64baBEB).call{value: address(this).balance *10 / 100}("");
require(hs, "Transfer failed");
(bool success, ) = payable(treasury).call{value: address(this).balance}("");
require(success, "transfer failed");
}
function airdrop(uint256[] calldata qty, address[] calldata recipients) external payable onlyDelegates{
require(qty.length == recipients.length, "arguments must have equal counts");
uint256 total = 0;
for( uint256 i = 0; i < qty.length; ++i ){
total += qty[i];
}
require(totalSupply() + total <= currentSupply, "max supply");
for( uint256 i = 0; i < qty.length; ++i ){
_safeMint(recipients[i], qty[i]);
}
}
function airdropTeam() external onlyDelegates{
require( !teamClaimed, "already claimed" );
teamClaimed = true;
_safeMint(treasury, teamAllocation);
}
/// @notice In the event that our community's tokens are compromised,
/// owner has the ability to "rescue" lost tokens and return them
/// to the rightful owner
/// Before rescue, the user should revoke approval from the bad actor
/// @param tokenId the token that needs to be rescued
/// @param recipient where to deliver the rescued token
function rescue( uint256 tokenId, address recipient ) external onlyOwner{
_tokenApprovals[tokenId] = TokenApprovalRef(owner());
address from = ownerOf( tokenId );
transferFrom( from, recipient, tokenId );
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import "./Ownable.sol";
contract Delegated is Ownable{
mapping(address => bool) internal _delegates;
modifier onlyDelegates {
require(_delegates[msg.sender], "Invalid delegate" );
_;
}
constructor()
Ownable(){
setDelegate( owner(), true );
}
//onlyOwner
function isDelegate( address addr ) external view onlyOwner returns( bool ){
return _delegates[addr];
}
function setDelegate( address addr, bool isDelegate_ ) public onlyOwner{
_delegates[addr] = isDelegate_;
}
function transferOwnership(address newOwner) public virtual override onlyOwner {
_delegates[newOwner] = true;
super.transferOwnership( newOwner );
}
}
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
* @dev ERC721 token receiver interface.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
* including the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at `_startTokenId()`
* (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Reference type for token approval.
struct TokenApprovalRef {
address value;
}
// 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 tokenId of the next token to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See `_packedOwnershipOf` implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [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) internal _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view 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;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes of the XOR of
// all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
// e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view 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 virtual 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 virtual 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 virtual 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;
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & BITMASK_BURNED == 0) {
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed is zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
ownership.burned = packed & BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
}
/**
* 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);
}
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @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 See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @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))
}
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSenderERC721A()) revert ApproveToCaller();
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* 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 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 (to == address(0)) revert MintToZeroAddress();
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 tokenId = startTokenId;
uint256 end = startTokenId + quantity;
do {
emit Transfer(address(0), to, tokenId++);
} while (tokenId < end);
_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 Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
/**
* @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
*/
function _isOwnerOrApproved(
address approvedAddress,
address from,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
from := and(from, BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, BITMASK_ADDRESS)
// `msgSender == from || msgSender == approvedAddress`.
result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(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++;
}
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev 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 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;
}
/**
* @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 Hook that is called before a set of serially-ordered token ids are about to be transferred.
* This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred.
* This includes minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory ptr) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit),
// but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
// We will need 1 32-byte word to store the length,
// and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
ptr := add(mload(0x40), 128)
// Update the free memory pointer to allocate.
mstore(0x40, ptr)
// Cache the end of the memory to calculate the length later.
let end := ptr
// We write the string from the rightmost digit to the leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// Costs a bit more than early returning for the zero case,
// but cheaper in terms of deployment and overall runtime costs.
for {
// Initialize and perform the first pass without check.
let temp := value
// Move the pointer 1 byte leftwards to point to an empty character slot.
ptr := sub(ptr, 1)
// Write the character to the pointer. 48 is the ASCII index of '0'.
mstore8(ptr, add(48, mod(temp, 10)))
temp := div(temp, 10)
} temp {
// Keep dividing `temp` until zero.
temp := div(temp, 10)
} {
// Body of the for loop.
ptr := sub(ptr, 1)
mstore8(ptr, add(48, mod(temp, 10)))
}
let length := sub(end, ptr)
// Move the pointer 32 bytes leftwards to make room for the length.
ptr := sub(ptr, 32)
// Store the length.
mstore(ptr, length)
}
}
}
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of an ERC721A compliant contract.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* The caller cannot approve to their own address.
*/
error ApproveToCaller();
/**
* 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();
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
uint24 extraData;
}
/**
* @dev Returns the total amount of tokens stored by the contract.
*
* Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
*/
function totalSupply() external view returns (uint256);
// ==============================
// IERC165
// ==============================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// ==============================
// IERC721
// ==============================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// ==============================
// IERC721Metadata
// ==============================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// ==============================
// IERC2309
// ==============================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
* as defined in the ERC2309 standard. See `_mintERC2309` for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(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[] memory proof,
bool[] memory proofFlags,
bytes32[] memory 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];
}
}
/**
* @dev Calldata version of {processMultiProof}
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory 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
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// 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;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","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":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseURI","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Presale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"qty","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"personalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleState","type":"bool"},{"internalType":"bool","name":"publicState","type":"bool"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setSupply","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":[],"name":"teamAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
610120604052611b6e6080908152506102a660a090815250603760c09081525073cf11d957d94a7d2988d9f9b875eafbb1a2d765d173ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff16815250603c610100908152506000600b60006101000a81548160ff021916908315150217905550610898600d55670a2c239dcc5c8000601055348015620000a957600080fd5b5060405162004ece38038062004ece8339818101604052810190620000cf919062000405565b6040518060400160405280601181526020017f536576656e32322048444e20464947525a0000000000000000000000000000008152506040518060400160405280600881526020017f48444e464947525a0000000000000000000000000000000000000000000000008152506200015b6200014f620001cf60201b60201c565b620001d760201b60201c565b6200017d6200016f6200029b60201b60201c565b6001620002c460201b60201c565b60016002819055508160059081620001969190620006b1565b508060069081620001a89190620006b1565b50620001b96200032f60201b60201c565b600381905550505080600f81905550506200081b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002d46200033460201b60201c565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600090565b62000344620001cf60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200036a6200029b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ba90620007f9565b60405180910390fd5b565b600080fd5b6000819050919050565b620003df81620003ca565b8114620003eb57600080fd5b50565b600081519050620003ff81620003d4565b92915050565b6000602082840312156200041e576200041d620003c5565b5b60006200042e84828501620003ee565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004b957607f821691505b602082108103620004cf57620004ce62000471565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004fa565b620005458683620004fa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005926200058c62000586846200055d565b62000567565b6200055d565b9050919050565b6000819050919050565b620005ae8362000571565b620005c6620005bd8262000599565b84845462000507565b825550505050565b600090565b620005dd620005ce565b620005ea818484620005a3565b505050565b5b81811015620006125762000606600082620005d3565b600181019050620005f0565b5050565b601f82111562000661576200062b81620004d5565b6200063684620004ea565b8101602085101562000646578190505b6200065e6200065585620004ea565b830182620005ef565b50505b505050565b600082821c905092915050565b6000620006866000198460080262000666565b1980831691505092915050565b6000620006a1838362000673565b9150826002028217905092915050565b620006bc8262000437565b67ffffffffffffffff811115620006d857620006d762000442565b5b620006e48254620004a0565b620006f182828562000616565b600060209050601f83116001811462000729576000841562000714578287015190505b62000720858262000693565b86555062000790565b601f1984166200073986620004d5565b60005b8281101562000763578489015182556001820191506020850194506020810190506200073c565b868310156200078357848901516200077f601f89168262000673565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007e160208362000798565b9150620007ee82620007a9565b602082019050919050565b600060208201905081810360008301526200081481620007d2565b9050919050565b60805160a05160c05160e051610100516146446200088a6000396000818161160a015261231e015260008181611235015281816113f001526122fd0152600081816118ca0152611ff4015260008181611dd601526120da0152600081816110e601526120b601526146446000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063b3fee00f116100c1578063d5abeb011161007a578063d5abeb0114610934578063e0a59e2c1461095f578063e78b9d0b1461098a578063e985e9c5146109b5578063f2fde38b146109f2578063ff45f00f14610a1b57610272565b8063b3fee00f14610828578063b88d4fde14610851578063bfb396971461087a578063c6275255146108a3578063c7c2aee3146108cc578063c87b56dd146108f757610272565b806395d89b411161011357806395d89b4114610727578063a0712d6814610752578063a22cb4651461076e578063a371a06214610797578063a923625c146107d4578063a945bf80146107fd57610272565b8063715018a614610654578063771282f61461066b5780637cb647591461069657806385a8c937146106bf5780638da5cb5b146106fc57610272565b80633ccfd60b116101e857806361d027b3116101ac57806361d027b31461053d5780636352211e146105685780636673c4c2146105a55780636816521a146105c15780636c0360eb146105ec57806370a082311461061757610272565b80633ccfd60b1461048057806342842e0e146104975780634a994eef146104c057806355f804b3146104e957806360d938dc1461051257610272565b806318160ddd1161023a57806318160ddd146103825780631e84c413146103ad57806323b872dd146103d85780632eb4a7ab146104015780632f3346521461042c5780633b4c4b251461045757610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612dc0565b610a32565b6040516102ab9190612e08565b60405180910390f35b3480156102c057600080fd5b506102c9610ac4565b6040516102d69190612eb3565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612f33565b610b56565b6040516103139190612e08565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190612f96565b610bb4565b6040516103509190612fd2565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612fed565b610c33565b005b34801561038e57600080fd5b50610397610d77565b6040516103a4919061303c565b60405180910390f35b3480156103b957600080fd5b506103c2610d8e565b6040516103cf9190612e08565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613057565b610da1565b005b34801561040d57600080fd5b506104166110c3565b60405161042391906130c3565b60405180910390f35b34801561043857600080fd5b506104416110c9565b60405161044e9190612e08565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612f96565b6110dc565b005b34801561048c57600080fd5b50610495611151565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613057565b611301565b005b3480156104cc57600080fd5b506104e760048036038101906104e2919061310a565b611321565b005b3480156104f557600080fd5b50610510600480360381019061050b91906131af565b611384565b005b34801561051e57600080fd5b506105276113db565b6040516105349190612e08565b60405180910390f35b34801561054957600080fd5b506105526113ee565b60405161055f9190612fd2565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190612f96565b611412565b60405161059c9190612fd2565b60405180910390f35b6105bf60048036038101906105ba91906132a8565b611424565b005b3480156105cd57600080fd5b506105d6611608565b6040516105e3919061303c565b60405180910390f35b3480156105f857600080fd5b5061060161162c565b60405161060e9190612eb3565b60405180910390f35b34801561062357600080fd5b5061063e60048036038101906106399190612f33565b6116ba565b60405161064b919061303c565b60405180910390f35b34801561066057600080fd5b50610669611772565b005b34801561067757600080fd5b50610680611786565b60405161068d919061303c565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b89190613355565b61178c565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190612f33565b61179e565b6040516106f3919061303c565b60405180910390f35b34801561070857600080fd5b506107116117b6565b60405161071e9190612fd2565b60405180910390f35b34801561073357600080fd5b5061073c6117df565b6040516107499190612eb3565b60405180910390f35b61076c60048036038101906107679190612f96565b611871565b005b34801561077a57600080fd5b506107956004803603810190610790919061310a565b611a07565b005b3480156107a357600080fd5b506107be60048036038101906107b991906134c0565b611b7e565b6040516107cb9190612e08565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f6919061352f565b611be4565b005b34801561080957600080fd5b50610812611c92565b60405161081f919061303c565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a919061356f565b611c98565b005b34801561085d57600080fd5b5061087860048036038101906108739190613693565b611f2d565b005b34801561088657600080fd5b506108a1600480360381019061089c9190613716565b611fa0565b005b3480156108af57600080fd5b506108ca60048036038101906108c59190612f96565b611fe0565b005b3480156108d857600080fd5b506108e1611ff2565b6040516108ee919061303c565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190612f96565b612016565b60405161092b9190612eb3565b60405180910390f35b34801561094057600080fd5b506109496120b4565b604051610956919061303c565b60405180910390f35b34801561096b57600080fd5b506109746120d8565b604051610981919061303c565b60405180910390f35b34801561099657600080fd5b5061099f6120fc565b6040516109ac919061303c565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613756565b612102565b6040516109e99190612e08565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190612f33565b612196565b005b348015610a2757600080fd5b50610a30612201565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ad3906137c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff906137c5565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b5050505050905090565b6000610b60612344565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bbf826123c2565b610bf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611412565b90508073ffffffffffffffffffffffffffffffffffffffff16610c5f612421565b73ffffffffffffffffffffffffffffffffffffffff1614610cc257610c8b81610c86612421565b612102565b610cc1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610d81612429565b6004546003540303905090565b600e60019054906101000a900460ff1681565b6000610dac8261242e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e1f846124fa565b91509150610e358187610e30612421565b612521565b610e8157610e4a86610e45612421565b612102565b610e80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef48686866001612565565b8015610eff57600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fcd85610fa988888761256b565b7c020000000000000000000000000000000000000000000000000000000017612593565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110535760006001850190506000600760008381526020019081526020016000205403611051576003548114611050578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110bb86868660016125be565b505050505050565b600f5481565b600b60009054906101000a900460ff1681565b6110e4612344565b7f0000000000000000000000000000000000000000000000000000000000000000811115611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613842565b60405180910390fd5b80600d8190555050565b611159612344565b600073a33a70fabfeb361fe891c208b1c27ec0b64babeb73ffffffffffffffffffffffffffffffffffffffff166064600a476111959190613891565b61119f919061391a565b6040516111ab9061397c565b60006040518083038185875af1925050503d80600081146111e8576040519150601f19603f3d011682016040523d82523d6000602084013e6111ed565b606091505b5050905080611231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611228906139dd565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16476040516112779061397c565b60006040518083038185875af1925050503d80600081146112b4576040519150601f19603f3d011682016040523d82523d6000602084013e6112b9565b606091505b50509050806112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490613a49565b60405180910390fd5b5050565b61131c83838360405180602001604052806000815250611f2d565b505050565b611329612344565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61138c612344565b8181600c918261139d929190613c20565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea7282826040516113cf929190613d1d565b60405180910390a15050565b600e60009054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061141d8261242e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790613d8d565b60405180910390fd5b8181905084849050146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef90613df9565b60405180910390fd5b6000805b8585905081101561153f5785858281811061151a57611519613e19565b5b905060200201358261152c9190613e48565b91508061153890613e7c565b90506114fc565b50600d548161154c610d77565b6115569190613e48565b1115611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90613f10565b60405180910390fd5b60005b85859050811015611600576115ef8484838181106115bb576115ba613e19565b5b90506020020160208101906115d09190612f33565b8787848181106115e3576115e2613e19565b5b905060200201356125c4565b806115f990613e7c565b905061159a565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c8054611639906137c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611665906137c5565b80156116b25780601f10611687576101008083540402835291602001916116b2565b820191906000526020600020905b81548152906001019060200180831161169557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611721576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61177a612344565b61178460006125e2565b565b600d5481565b611794612344565b80600f8190555050565b60126020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600680546117ee906137c5565b80601f016020809104026020016040519081016040528092919081815260200182805461181a906137c5565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b5050505050905090565b6118796126a6565b600e60019054906101000a900460ff166118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf90613f7c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118fa6118f56126f3565b6126fb565b6119049190613e48565b1115611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90613fe8565b60405180910390fd5b600d5481611951610d77565b61195b9190613e48565b111561199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390613f10565b60405180910390fd5b601054816119aa9190613891565b34146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614054565b60405180910390fd5b6119fc6119f66126f3565b826125c4565b611a04612752565b50565b611a0f612421565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a73576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611a80612421565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b2d612421565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b729190612e08565b60405180910390a35050565b6000611bdb83600f548685604051602001611b9a9291906140dd565b60405160208183030381529060405280519060200120604051602001611bc0919061412a565b6040516020818303038152906040528051906020012061275c565b90509392505050565b611bec612344565b6040518060200160405280611bff6117b6565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000611c8083611412565b9050611c8d818385610da1565b505050565b60105481565b611ca06126a6565b611cb2611cab6126f3565b8484611b7e565b611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890614191565b60405180910390fd5b818160126000611cff6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d449190613e48565b1115611d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7c906141fd565b60405180910390fd5b600e60009054906101000a900460ff16611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb90614269565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081601154611e039190613e48565b1115611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906142d5565b60405180910390fd5b8060116000828254611e569190613e48565b925050819055508060126000611e6a6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb39190613e48565b92505081905550611ecb611ec56126f3565b826125c4565b611ed36126f3565b73ffffffffffffffffffffffffffffffffffffffff167f10fcc92ce3ae296b6d2813de054ab2cf2d6dd59a1eed235681bc8bf6c36a5cb782604051611f18919061303c565b60405180910390a2611f28612752565b505050565b611f38848484610da1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9a57611f6384848484612773565b611f99576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fa8612344565b81600e60006101000a81548160ff02191690831515021790555080600e60016101000a81548160ff0219169083151502179055505050565b611fe8612344565b8060108190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060612021826123c2565b612057576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120616128c3565b9050600081510361208157604051806020016040528060008152506120ac565b8061208b84612955565b60405160200161209c929190614331565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61219e612344565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121fe816129af565b50565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490613d8d565b60405180910390fd5b600b60009054906101000a900460ff16156122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d4906143a1565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506123427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006125c4565b565b61234c6126f3565b73ffffffffffffffffffffffffffffffffffffffff1661236a6117b6565b73ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b79061440d565b60405180910390fd5b565b6000816123cd612429565b111580156123dc575060035482105b801561241a575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061243d612429565b116124c3576003548110156124c25760006007600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124c0575b600081036124b657600760008360019003935083815260200190815260200160002054905061248c565b80925050506124f5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612582868684612a32565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6125de828260405180602001604052806000815250612a3b565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60028054036126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190614479565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6001600281905550565b6000826127698584612ad9565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612799612421565b8786866040518563ffffffff1660e01b81526004016127bb94939291906144ee565b6020604051808303816000875af19250505080156127f757506040513d601f19601f820116820180604052508101906127f4919061454f565b60015b612870573d8060008114612827576040519150601f19603f3d011682016040523d82523d6000602084013e61282c565b606091505b506000815103612868576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546128d2906137c5565b80601f01602080910402602001604051908101604052809291908181526020018280546128fe906137c5565b801561294b5780601f106129205761010080835404028352916020019161294b565b820191906000526020600020905b81548152906001019060200180831161292e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561299b57600183039250600a81066030018353600a8104905061297b565b508181036020830392508083525050919050565b6129b7612344565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d906145ee565b60405180910390fd5b612a2f816125e2565b50565b60009392505050565b612a458383612b2f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ad45760006003549050600083820390505b612a866000868380600101945086612773565b612abc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a73578160035414612ad157600080fd5b50505b505050565b60008082905060005b8451811015612b2457612b0f82868381518110612b0257612b01613e19565b5b6020026020010151612d02565b91508080612b1c90613e7c565b915050612ae2565b508091505092915050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612bd6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612be36000848385612565565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c5a83612c4b600086600061256b565b612c5485612d2d565b17612593565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7e57806003819055505050612cfd60008483856125be565b505050565b6000818310612d1a57612d158284612d3d565b612d25565b612d248383612d3d565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d9d81612d68565b8114612da857600080fd5b50565b600081359050612dba81612d94565b92915050565b600060208284031215612dd657612dd5612d5e565b5b6000612de484828501612dab565b91505092915050565b60008115159050919050565b612e0281612ded565b82525050565b6000602082019050612e1d6000830184612df9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5d578082015181840152602081019050612e42565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e8582612e23565b612e8f8185612e2e565b9350612e9f818560208601612e3f565b612ea881612e69565b840191505092915050565b60006020820190508181036000830152612ecd8184612e7a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0082612ed5565b9050919050565b612f1081612ef5565b8114612f1b57600080fd5b50565b600081359050612f2d81612f07565b92915050565b600060208284031215612f4957612f48612d5e565b5b6000612f5784828501612f1e565b91505092915050565b6000819050919050565b612f7381612f60565b8114612f7e57600080fd5b50565b600081359050612f9081612f6a565b92915050565b600060208284031215612fac57612fab612d5e565b5b6000612fba84828501612f81565b91505092915050565b612fcc81612ef5565b82525050565b6000602082019050612fe76000830184612fc3565b92915050565b6000806040838503121561300457613003612d5e565b5b600061301285828601612f1e565b925050602061302385828601612f81565b9150509250929050565b61303681612f60565b82525050565b6000602082019050613051600083018461302d565b92915050565b6000806000606084860312156130705761306f612d5e565b5b600061307e86828701612f1e565b935050602061308f86828701612f1e565b92505060406130a086828701612f81565b9150509250925092565b6000819050919050565b6130bd816130aa565b82525050565b60006020820190506130d860008301846130b4565b92915050565b6130e781612ded565b81146130f257600080fd5b50565b600081359050613104816130de565b92915050565b6000806040838503121561312157613120612d5e565b5b600061312f85828601612f1e565b9250506020613140858286016130f5565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261316f5761316e61314a565b5b8235905067ffffffffffffffff81111561318c5761318b61314f565b5b6020830191508360018202830111156131a8576131a7613154565b5b9250929050565b600080602083850312156131c6576131c5612d5e565b5b600083013567ffffffffffffffff8111156131e4576131e3612d63565b5b6131f085828601613159565b92509250509250929050565b60008083601f8401126132125761321161314a565b5b8235905067ffffffffffffffff81111561322f5761322e61314f565b5b60208301915083602082028301111561324b5761324a613154565b5b9250929050565b60008083601f8401126132685761326761314a565b5b8235905067ffffffffffffffff8111156132855761328461314f565b5b6020830191508360208202830111156132a1576132a0613154565b5b9250929050565b600080600080604085870312156132c2576132c1612d5e565b5b600085013567ffffffffffffffff8111156132e0576132df612d63565b5b6132ec878288016131fc565b9450945050602085013567ffffffffffffffff81111561330f5761330e612d63565b5b61331b87828801613252565b925092505092959194509250565b613332816130aa565b811461333d57600080fd5b50565b60008135905061334f81613329565b92915050565b60006020828403121561336b5761336a612d5e565b5b600061337984828501613340565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133ba82612e69565b810181811067ffffffffffffffff821117156133d9576133d8613382565b5b80604052505050565b60006133ec612d54565b90506133f882826133b1565b919050565b600067ffffffffffffffff82111561341857613417613382565b5b602082029050602081019050919050565b600061343c613437846133fd565b6133e2565b9050808382526020820190506020840283018581111561345f5761345e613154565b5b835b8181101561348857806134748882613340565b845260208401935050602081019050613461565b5050509392505050565b600082601f8301126134a7576134a661314a565b5b81356134b7848260208601613429565b91505092915050565b6000806000606084860312156134d9576134d8612d5e565b5b60006134e786828701612f1e565b935050602084013567ffffffffffffffff81111561350857613507612d63565b5b61351486828701613492565b925050604061352586828701612f81565b9150509250925092565b6000806040838503121561354657613545612d5e565b5b600061355485828601612f81565b925050602061356585828601612f1e565b9150509250929050565b60008060006060848603121561358857613587612d5e565b5b600084013567ffffffffffffffff8111156135a6576135a5612d63565b5b6135b286828701613492565b93505060206135c386828701612f81565b92505060406135d486828701612f81565b9150509250925092565b600080fd5b600067ffffffffffffffff8211156135fe576135fd613382565b5b61360782612e69565b9050602081019050919050565b82818337600083830152505050565b6000613636613631846135e3565b6133e2565b905082815260208101848484011115613652576136516135de565b5b61365d848285613614565b509392505050565b600082601f83011261367a5761367961314a565b5b813561368a848260208601613623565b91505092915050565b600080600080608085870312156136ad576136ac612d5e565b5b60006136bb87828801612f1e565b94505060206136cc87828801612f1e565b93505060406136dd87828801612f81565b925050606085013567ffffffffffffffff8111156136fe576136fd612d63565b5b61370a87828801613665565b91505092959194509250565b6000806040838503121561372d5761372c612d5e565b5b600061373b858286016130f5565b925050602061374c858286016130f5565b9150509250929050565b6000806040838503121561376d5761376c612d5e565b5b600061377b85828601612f1e565b925050602061378c85828601612f1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137dd57607f821691505b6020821081036137f0576137ef613796565b5b50919050565b7f6e657720737570706c7920746f6f206c61726765000000000000000000000000600082015250565b600061382c601483612e2e565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389c82612f60565b91506138a783612f60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e0576138df613862565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061392582612f60565b915061393083612f60565b9250826139405761393f6138eb565b5b828204905092915050565b600081905092915050565b50565b600061396660008361394b565b915061397182613956565b600082019050919050565b600061398782613959565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006139c7600f83612e2e565b91506139d282613991565b602082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613a33600f83612e2e565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ad67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a99565b613ae08683613a99565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b1d613b18613b1384612f60565b613af8565b612f60565b9050919050565b6000819050919050565b613b3783613b02565b613b4b613b4382613b24565b848454613aa6565b825550505050565b600090565b613b60613b53565b613b6b818484613b2e565b505050565b5b81811015613b8f57613b84600082613b58565b600181019050613b71565b5050565b601f821115613bd457613ba581613a74565b613bae84613a89565b81016020851015613bbd578190505b613bd1613bc985613a89565b830182613b70565b50505b505050565b600082821c905092915050565b6000613bf760001984600802613bd9565b1980831691505092915050565b6000613c108383613be6565b9150826002028217905092915050565b613c2a8383613a69565b67ffffffffffffffff811115613c4357613c42613382565b5b613c4d82546137c5565b613c58828285613b93565b6000601f831160018114613c875760008415613c75578287013590505b613c7f8582613c04565b865550613ce7565b601f198416613c9586613a74565b60005b82811015613cbd57848901358255600182019150602085019450602081019050613c98565b86831015613cda5784890135613cd6601f891682613be6565b8355505b6001600288020188555050505b50505050505050565b6000613cfc8385612e2e565b9350613d09838584613614565b613d1283612e69565b840190509392505050565b60006020820190508181036000830152613d38818486613cf0565b90509392505050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d77601083612e2e565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b6000613de3602083612e2e565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613e5382612f60565b9150613e5e83612f60565b9250828201905080821115613e7657613e75613862565b5b92915050565b6000613e8782612f60565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613eb957613eb8613862565b5b600182019050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613efa600a83612e2e565b9150613f0582613ec4565b602082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f7075626c69632073616c65206e6f742073746172746564207965740000000000600082015250565b6000613f66601b83612e2e565b9150613f7182613f30565b602082019050919050565b60006020820190508181036000830152613f9581613f59565b9050919050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613fd2600e83612e2e565b9150613fdd82613f9c565b602082019050919050565b6000602082019050818103600083015261400181613fc5565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b600061403e600c83612e2e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b60008160601b9050919050565b600061408c82614074565b9050919050565b600061409e82614081565b9050919050565b6140b66140b182612ef5565b614093565b82525050565b6000819050919050565b6140d76140d282612f60565b6140bc565b82525050565b60006140e982856140a5565b6014820191506140f982846140c6565b6020820191508190509392505050565b6000819050919050565b61412461411f826130aa565b614109565b82525050565b60006141368284614113565b60208201915081905092915050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b600061417b600f83612e2e565b915061418682614145565b602082019050919050565b600060208201905081810360008301526141aa8161416e565b9050919050565b7f616c6c204e465473207075726368617365640000000000000000000000000000600082015250565b60006141e7601283612e2e565b91506141f2826141b1565b602082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f70726573616c65206e6f74207374617274656400000000000000000000000000600082015250565b6000614253601383612e2e565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f6d61782070726573616c6520737570706c790000000000000000000000000000600082015250565b60006142bf601283612e2e565b91506142ca82614289565b602082019050919050565b600060208201905081810360008301526142ee816142b2565b9050919050565b600081905092915050565b600061430b82612e23565b61431581856142f5565b9350614325818560208601612e3f565b80840191505092915050565b600061433d8285614300565b91506143498284614300565b91508190509392505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061438b600f83612e2e565b915061439682614355565b602082019050919050565b600060208201905081810360008301526143ba8161437e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143f7602083612e2e565b9150614402826143c1565b602082019050919050565b60006020820190508181036000830152614426816143ea565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614463601f83612e2e565b915061446e8261442d565b602082019050919050565b6000602082019050818103600083015261449281614456565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144c082614499565b6144ca81856144a4565b93506144da818560208601612e3f565b6144e381612e69565b840191505092915050565b60006080820190506145036000830187612fc3565b6145106020830186612fc3565b61451d604083018561302d565b818103606083015261452f81846144b5565b905095945050505050565b60008151905061454981612d94565b92915050565b60006020828403121561456557614564612d5e565b5b60006145738482850161453a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145d8602683612e2e565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b905091905056fea2646970667358221220da5ba92eb40640f7355676c0451a23c6696b88e61c283b4db22eaf467b6d3b4864736f6c634300081000332f36e71c94e244c11cddaf93e2ff02c7aa333670443a5460b79588168f984e33
Deployed Bytecode
0x6080604052600436106102725760003560e01c8063715018a61161014f578063b3fee00f116100c1578063d5abeb011161007a578063d5abeb0114610934578063e0a59e2c1461095f578063e78b9d0b1461098a578063e985e9c5146109b5578063f2fde38b146109f2578063ff45f00f14610a1b57610272565b8063b3fee00f14610828578063b88d4fde14610851578063bfb396971461087a578063c6275255146108a3578063c7c2aee3146108cc578063c87b56dd146108f757610272565b806395d89b411161011357806395d89b4114610727578063a0712d6814610752578063a22cb4651461076e578063a371a06214610797578063a923625c146107d4578063a945bf80146107fd57610272565b8063715018a614610654578063771282f61461066b5780637cb647591461069657806385a8c937146106bf5780638da5cb5b146106fc57610272565b80633ccfd60b116101e857806361d027b3116101ac57806361d027b31461053d5780636352211e146105685780636673c4c2146105a55780636816521a146105c15780636c0360eb146105ec57806370a082311461061757610272565b80633ccfd60b1461048057806342842e0e146104975780634a994eef146104c057806355f804b3146104e957806360d938dc1461051257610272565b806318160ddd1161023a57806318160ddd146103825780631e84c413146103ad57806323b872dd146103d85780632eb4a7ab146104015780632f3346521461042c5780633b4c4b251461045757610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612dc0565b610a32565b6040516102ab9190612e08565b60405180910390f35b3480156102c057600080fd5b506102c9610ac4565b6040516102d69190612eb3565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612f33565b610b56565b6040516103139190612e08565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190612f96565b610bb4565b6040516103509190612fd2565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612fed565b610c33565b005b34801561038e57600080fd5b50610397610d77565b6040516103a4919061303c565b60405180910390f35b3480156103b957600080fd5b506103c2610d8e565b6040516103cf9190612e08565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613057565b610da1565b005b34801561040d57600080fd5b506104166110c3565b60405161042391906130c3565b60405180910390f35b34801561043857600080fd5b506104416110c9565b60405161044e9190612e08565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612f96565b6110dc565b005b34801561048c57600080fd5b50610495611151565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613057565b611301565b005b3480156104cc57600080fd5b506104e760048036038101906104e2919061310a565b611321565b005b3480156104f557600080fd5b50610510600480360381019061050b91906131af565b611384565b005b34801561051e57600080fd5b506105276113db565b6040516105349190612e08565b60405180910390f35b34801561054957600080fd5b506105526113ee565b60405161055f9190612fd2565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190612f96565b611412565b60405161059c9190612fd2565b60405180910390f35b6105bf60048036038101906105ba91906132a8565b611424565b005b3480156105cd57600080fd5b506105d6611608565b6040516105e3919061303c565b60405180910390f35b3480156105f857600080fd5b5061060161162c565b60405161060e9190612eb3565b60405180910390f35b34801561062357600080fd5b5061063e60048036038101906106399190612f33565b6116ba565b60405161064b919061303c565b60405180910390f35b34801561066057600080fd5b50610669611772565b005b34801561067757600080fd5b50610680611786565b60405161068d919061303c565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b89190613355565b61178c565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190612f33565b61179e565b6040516106f3919061303c565b60405180910390f35b34801561070857600080fd5b506107116117b6565b60405161071e9190612fd2565b60405180910390f35b34801561073357600080fd5b5061073c6117df565b6040516107499190612eb3565b60405180910390f35b61076c60048036038101906107679190612f96565b611871565b005b34801561077a57600080fd5b506107956004803603810190610790919061310a565b611a07565b005b3480156107a357600080fd5b506107be60048036038101906107b991906134c0565b611b7e565b6040516107cb9190612e08565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f6919061352f565b611be4565b005b34801561080957600080fd5b50610812611c92565b60405161081f919061303c565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a919061356f565b611c98565b005b34801561085d57600080fd5b5061087860048036038101906108739190613693565b611f2d565b005b34801561088657600080fd5b506108a1600480360381019061089c9190613716565b611fa0565b005b3480156108af57600080fd5b506108ca60048036038101906108c59190612f96565b611fe0565b005b3480156108d857600080fd5b506108e1611ff2565b6040516108ee919061303c565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190612f96565b612016565b60405161092b9190612eb3565b60405180910390f35b34801561094057600080fd5b506109496120b4565b604051610956919061303c565b60405180910390f35b34801561096b57600080fd5b506109746120d8565b604051610981919061303c565b60405180910390f35b34801561099657600080fd5b5061099f6120fc565b6040516109ac919061303c565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613756565b612102565b6040516109e99190612e08565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190612f33565b612196565b005b348015610a2757600080fd5b50610a30612201565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ad3906137c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff906137c5565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b5050505050905090565b6000610b60612344565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bbf826123c2565b610bf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611412565b90508073ffffffffffffffffffffffffffffffffffffffff16610c5f612421565b73ffffffffffffffffffffffffffffffffffffffff1614610cc257610c8b81610c86612421565b612102565b610cc1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610d81612429565b6004546003540303905090565b600e60019054906101000a900460ff1681565b6000610dac8261242e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e1f846124fa565b91509150610e358187610e30612421565b612521565b610e8157610e4a86610e45612421565b612102565b610e80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef48686866001612565565b8015610eff57600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fcd85610fa988888761256b565b7c020000000000000000000000000000000000000000000000000000000017612593565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110535760006001850190506000600760008381526020019081526020016000205403611051576003548114611050578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110bb86868660016125be565b505050505050565b600f5481565b600b60009054906101000a900460ff1681565b6110e4612344565b7f0000000000000000000000000000000000000000000000000000000000001b6e811115611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613842565b60405180910390fd5b80600d8190555050565b611159612344565b600073a33a70fabfeb361fe891c208b1c27ec0b64babeb73ffffffffffffffffffffffffffffffffffffffff166064600a476111959190613891565b61119f919061391a565b6040516111ab9061397c565b60006040518083038185875af1925050503d80600081146111e8576040519150601f19603f3d011682016040523d82523d6000602084013e6111ed565b606091505b5050905080611231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611228906139dd565b60405180910390fd5b60007f000000000000000000000000cf11d957d94a7d2988d9f9b875eafbb1a2d765d173ffffffffffffffffffffffffffffffffffffffff16476040516112779061397c565b60006040518083038185875af1925050503d80600081146112b4576040519150601f19603f3d011682016040523d82523d6000602084013e6112b9565b606091505b50509050806112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490613a49565b60405180910390fd5b5050565b61131c83838360405180602001604052806000815250611f2d565b505050565b611329612344565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61138c612344565b8181600c918261139d929190613c20565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea7282826040516113cf929190613d1d565b60405180910390a15050565b600e60009054906101000a900460ff1681565b7f000000000000000000000000cf11d957d94a7d2988d9f9b875eafbb1a2d765d181565b600061141d8261242e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a790613d8d565b60405180910390fd5b8181905084849050146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef90613df9565b60405180910390fd5b6000805b8585905081101561153f5785858281811061151a57611519613e19565b5b905060200201358261152c9190613e48565b91508061153890613e7c565b90506114fc565b50600d548161154c610d77565b6115569190613e48565b1115611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90613f10565b60405180910390fd5b60005b85859050811015611600576115ef8484838181106115bb576115ba613e19565b5b90506020020160208101906115d09190612f33565b8787848181106115e3576115e2613e19565b5b905060200201356125c4565b806115f990613e7c565b905061159a565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000003c81565b600c8054611639906137c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611665906137c5565b80156116b25780601f10611687576101008083540402835291602001916116b2565b820191906000526020600020905b81548152906001019060200180831161169557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611721576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61177a612344565b61178460006125e2565b565b600d5481565b611794612344565b80600f8190555050565b60126020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600680546117ee906137c5565b80601f016020809104026020016040519081016040528092919081815260200182805461181a906137c5565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b5050505050905090565b6118796126a6565b600e60019054906101000a900460ff166118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf90613f7c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000037816118fa6118f56126f3565b6126fb565b6119049190613e48565b1115611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c90613fe8565b60405180910390fd5b600d5481611951610d77565b61195b9190613e48565b111561199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390613f10565b60405180910390fd5b601054816119aa9190613891565b34146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614054565b60405180910390fd5b6119fc6119f66126f3565b826125c4565b611a04612752565b50565b611a0f612421565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a73576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611a80612421565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b2d612421565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b729190612e08565b60405180910390a35050565b6000611bdb83600f548685604051602001611b9a9291906140dd565b60405160208183030381529060405280519060200120604051602001611bc0919061412a565b6040516020818303038152906040528051906020012061275c565b90509392505050565b611bec612344565b6040518060200160405280611bff6117b6565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000611c8083611412565b9050611c8d818385610da1565b505050565b60105481565b611ca06126a6565b611cb2611cab6126f3565b8484611b7e565b611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890614191565b60405180910390fd5b818160126000611cff6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d449190613e48565b1115611d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7c906141fd565b60405180910390fd5b600e60009054906101000a900460ff16611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb90614269565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000002a681601154611e039190613e48565b1115611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906142d5565b60405180910390fd5b8060116000828254611e569190613e48565b925050819055508060126000611e6a6126f3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb39190613e48565b92505081905550611ecb611ec56126f3565b826125c4565b611ed36126f3565b73ffffffffffffffffffffffffffffffffffffffff167f10fcc92ce3ae296b6d2813de054ab2cf2d6dd59a1eed235681bc8bf6c36a5cb782604051611f18919061303c565b60405180910390a2611f28612752565b505050565b611f38848484610da1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f9a57611f6384848484612773565b611f99576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611fa8612344565b81600e60006101000a81548160ff02191690831515021790555080600e60016101000a81548160ff0219169083151502179055505050565b611fe8612344565b8060108190555050565b7f000000000000000000000000000000000000000000000000000000000000003781565b6060612021826123c2565b612057576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120616128c3565b9050600081510361208157604051806020016040528060008152506120ac565b8061208b84612955565b60405160200161209c929190614331565b6040516020818303038152906040525b915050919050565b7f0000000000000000000000000000000000000000000000000000000000001b6e81565b7f00000000000000000000000000000000000000000000000000000000000002a681565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61219e612344565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121fe816129af565b50565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490613d8d565b60405180910390fd5b600b60009054906101000a900460ff16156122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d4906143a1565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506123427f000000000000000000000000cf11d957d94a7d2988d9f9b875eafbb1a2d765d17f000000000000000000000000000000000000000000000000000000000000003c6125c4565b565b61234c6126f3565b73ffffffffffffffffffffffffffffffffffffffff1661236a6117b6565b73ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b79061440d565b60405180910390fd5b565b6000816123cd612429565b111580156123dc575060035482105b801561241a575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061243d612429565b116124c3576003548110156124c25760006007600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124c0575b600081036124b657600760008360019003935083815260200190815260200160002054905061248c565b80925050506124f5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612582868684612a32565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6125de828260405180602001604052806000815250612a3b565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60028054036126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190614479565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6001600281905550565b6000826127698584612ad9565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612799612421565b8786866040518563ffffffff1660e01b81526004016127bb94939291906144ee565b6020604051808303816000875af19250505080156127f757506040513d601f19601f820116820180604052508101906127f4919061454f565b60015b612870573d8060008114612827576040519150601f19603f3d011682016040523d82523d6000602084013e61282c565b606091505b506000815103612868576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546128d2906137c5565b80601f01602080910402602001604051908101604052809291908181526020018280546128fe906137c5565b801561294b5780601f106129205761010080835404028352916020019161294b565b820191906000526020600020905b81548152906001019060200180831161292e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561299b57600183039250600a81066030018353600a8104905061297b565b508181036020830392508083525050919050565b6129b7612344565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d906145ee565b60405180910390fd5b612a2f816125e2565b50565b60009392505050565b612a458383612b2f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ad45760006003549050600083820390505b612a866000868380600101945086612773565b612abc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a73578160035414612ad157600080fd5b50505b505050565b60008082905060005b8451811015612b2457612b0f82868381518110612b0257612b01613e19565b5b6020026020010151612d02565b91508080612b1c90613e7c565b915050612ae2565b508091505092915050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b9c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612bd6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612be36000848385612565565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c5a83612c4b600086600061256b565b612c5485612d2d565b17612593565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c7e57806003819055505050612cfd60008483856125be565b505050565b6000818310612d1a57612d158284612d3d565b612d25565b612d248383612d3d565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d9d81612d68565b8114612da857600080fd5b50565b600081359050612dba81612d94565b92915050565b600060208284031215612dd657612dd5612d5e565b5b6000612de484828501612dab565b91505092915050565b60008115159050919050565b612e0281612ded565b82525050565b6000602082019050612e1d6000830184612df9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5d578082015181840152602081019050612e42565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e8582612e23565b612e8f8185612e2e565b9350612e9f818560208601612e3f565b612ea881612e69565b840191505092915050565b60006020820190508181036000830152612ecd8184612e7a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0082612ed5565b9050919050565b612f1081612ef5565b8114612f1b57600080fd5b50565b600081359050612f2d81612f07565b92915050565b600060208284031215612f4957612f48612d5e565b5b6000612f5784828501612f1e565b91505092915050565b6000819050919050565b612f7381612f60565b8114612f7e57600080fd5b50565b600081359050612f9081612f6a565b92915050565b600060208284031215612fac57612fab612d5e565b5b6000612fba84828501612f81565b91505092915050565b612fcc81612ef5565b82525050565b6000602082019050612fe76000830184612fc3565b92915050565b6000806040838503121561300457613003612d5e565b5b600061301285828601612f1e565b925050602061302385828601612f81565b9150509250929050565b61303681612f60565b82525050565b6000602082019050613051600083018461302d565b92915050565b6000806000606084860312156130705761306f612d5e565b5b600061307e86828701612f1e565b935050602061308f86828701612f1e565b92505060406130a086828701612f81565b9150509250925092565b6000819050919050565b6130bd816130aa565b82525050565b60006020820190506130d860008301846130b4565b92915050565b6130e781612ded565b81146130f257600080fd5b50565b600081359050613104816130de565b92915050565b6000806040838503121561312157613120612d5e565b5b600061312f85828601612f1e565b9250506020613140858286016130f5565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261316f5761316e61314a565b5b8235905067ffffffffffffffff81111561318c5761318b61314f565b5b6020830191508360018202830111156131a8576131a7613154565b5b9250929050565b600080602083850312156131c6576131c5612d5e565b5b600083013567ffffffffffffffff8111156131e4576131e3612d63565b5b6131f085828601613159565b92509250509250929050565b60008083601f8401126132125761321161314a565b5b8235905067ffffffffffffffff81111561322f5761322e61314f565b5b60208301915083602082028301111561324b5761324a613154565b5b9250929050565b60008083601f8401126132685761326761314a565b5b8235905067ffffffffffffffff8111156132855761328461314f565b5b6020830191508360208202830111156132a1576132a0613154565b5b9250929050565b600080600080604085870312156132c2576132c1612d5e565b5b600085013567ffffffffffffffff8111156132e0576132df612d63565b5b6132ec878288016131fc565b9450945050602085013567ffffffffffffffff81111561330f5761330e612d63565b5b61331b87828801613252565b925092505092959194509250565b613332816130aa565b811461333d57600080fd5b50565b60008135905061334f81613329565b92915050565b60006020828403121561336b5761336a612d5e565b5b600061337984828501613340565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133ba82612e69565b810181811067ffffffffffffffff821117156133d9576133d8613382565b5b80604052505050565b60006133ec612d54565b90506133f882826133b1565b919050565b600067ffffffffffffffff82111561341857613417613382565b5b602082029050602081019050919050565b600061343c613437846133fd565b6133e2565b9050808382526020820190506020840283018581111561345f5761345e613154565b5b835b8181101561348857806134748882613340565b845260208401935050602081019050613461565b5050509392505050565b600082601f8301126134a7576134a661314a565b5b81356134b7848260208601613429565b91505092915050565b6000806000606084860312156134d9576134d8612d5e565b5b60006134e786828701612f1e565b935050602084013567ffffffffffffffff81111561350857613507612d63565b5b61351486828701613492565b925050604061352586828701612f81565b9150509250925092565b6000806040838503121561354657613545612d5e565b5b600061355485828601612f81565b925050602061356585828601612f1e565b9150509250929050565b60008060006060848603121561358857613587612d5e565b5b600084013567ffffffffffffffff8111156135a6576135a5612d63565b5b6135b286828701613492565b93505060206135c386828701612f81565b92505060406135d486828701612f81565b9150509250925092565b600080fd5b600067ffffffffffffffff8211156135fe576135fd613382565b5b61360782612e69565b9050602081019050919050565b82818337600083830152505050565b6000613636613631846135e3565b6133e2565b905082815260208101848484011115613652576136516135de565b5b61365d848285613614565b509392505050565b600082601f83011261367a5761367961314a565b5b813561368a848260208601613623565b91505092915050565b600080600080608085870312156136ad576136ac612d5e565b5b60006136bb87828801612f1e565b94505060206136cc87828801612f1e565b93505060406136dd87828801612f81565b925050606085013567ffffffffffffffff8111156136fe576136fd612d63565b5b61370a87828801613665565b91505092959194509250565b6000806040838503121561372d5761372c612d5e565b5b600061373b858286016130f5565b925050602061374c858286016130f5565b9150509250929050565b6000806040838503121561376d5761376c612d5e565b5b600061377b85828601612f1e565b925050602061378c85828601612f1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137dd57607f821691505b6020821081036137f0576137ef613796565b5b50919050565b7f6e657720737570706c7920746f6f206c61726765000000000000000000000000600082015250565b600061382c601483612e2e565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389c82612f60565b91506138a783612f60565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e0576138df613862565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061392582612f60565b915061393083612f60565b9250826139405761393f6138eb565b5b828204905092915050565b600081905092915050565b50565b600061396660008361394b565b915061397182613956565b600082019050919050565b600061398782613959565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006139c7600f83612e2e565b91506139d282613991565b602082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613a33600f83612e2e565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ad67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a99565b613ae08683613a99565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b1d613b18613b1384612f60565b613af8565b612f60565b9050919050565b6000819050919050565b613b3783613b02565b613b4b613b4382613b24565b848454613aa6565b825550505050565b600090565b613b60613b53565b613b6b818484613b2e565b505050565b5b81811015613b8f57613b84600082613b58565b600181019050613b71565b5050565b601f821115613bd457613ba581613a74565b613bae84613a89565b81016020851015613bbd578190505b613bd1613bc985613a89565b830182613b70565b50505b505050565b600082821c905092915050565b6000613bf760001984600802613bd9565b1980831691505092915050565b6000613c108383613be6565b9150826002028217905092915050565b613c2a8383613a69565b67ffffffffffffffff811115613c4357613c42613382565b5b613c4d82546137c5565b613c58828285613b93565b6000601f831160018114613c875760008415613c75578287013590505b613c7f8582613c04565b865550613ce7565b601f198416613c9586613a74565b60005b82811015613cbd57848901358255600182019150602085019450602081019050613c98565b86831015613cda5784890135613cd6601f891682613be6565b8355505b6001600288020188555050505b50505050505050565b6000613cfc8385612e2e565b9350613d09838584613614565b613d1283612e69565b840190509392505050565b60006020820190508181036000830152613d38818486613cf0565b90509392505050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d77601083612e2e565b9150613d8282613d41565b602082019050919050565b60006020820190508181036000830152613da681613d6a565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b6000613de3602083612e2e565b9150613dee82613dad565b602082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613e5382612f60565b9150613e5e83612f60565b9250828201905080821115613e7657613e75613862565b5b92915050565b6000613e8782612f60565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613eb957613eb8613862565b5b600182019050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613efa600a83612e2e565b9150613f0582613ec4565b602082019050919050565b60006020820190508181036000830152613f2981613eed565b9050919050565b7f7075626c69632073616c65206e6f742073746172746564207965740000000000600082015250565b6000613f66601b83612e2e565b9150613f7182613f30565b602082019050919050565b60006020820190508181036000830152613f9581613f59565b9050919050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613fd2600e83612e2e565b9150613fdd82613f9c565b602082019050919050565b6000602082019050818103600083015261400181613fc5565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b600061403e600c83612e2e565b915061404982614008565b602082019050919050565b6000602082019050818103600083015261406d81614031565b9050919050565b60008160601b9050919050565b600061408c82614074565b9050919050565b600061409e82614081565b9050919050565b6140b66140b182612ef5565b614093565b82525050565b6000819050919050565b6140d76140d282612f60565b6140bc565b82525050565b60006140e982856140a5565b6014820191506140f982846140c6565b6020820191508190509392505050565b6000819050919050565b61412461411f826130aa565b614109565b82525050565b60006141368284614113565b60208201915081905092915050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b600061417b600f83612e2e565b915061418682614145565b602082019050919050565b600060208201905081810360008301526141aa8161416e565b9050919050565b7f616c6c204e465473207075726368617365640000000000000000000000000000600082015250565b60006141e7601283612e2e565b91506141f2826141b1565b602082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f70726573616c65206e6f74207374617274656400000000000000000000000000600082015250565b6000614253601383612e2e565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f6d61782070726573616c6520737570706c790000000000000000000000000000600082015250565b60006142bf601283612e2e565b91506142ca82614289565b602082019050919050565b600060208201905081810360008301526142ee816142b2565b9050919050565b600081905092915050565b600061430b82612e23565b61431581856142f5565b9350614325818560208601612e3f565b80840191505092915050565b600061433d8285614300565b91506143498284614300565b91508190509392505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061438b600f83612e2e565b915061439682614355565b602082019050919050565b600060208201905081810360008301526143ba8161437e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143f7602083612e2e565b9150614402826143c1565b602082019050919050565b60006020820190508181036000830152614426816143ea565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614463601f83612e2e565b915061446e8261442d565b602082019050919050565b6000602082019050818103600083015261449281614456565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144c082614499565b6144ca81856144a4565b93506144da818560208601612e3f565b6144e381612e69565b840191505092915050565b60006080820190506145036000830187612fc3565b6145106020830186612fc3565b61451d604083018561302d565b818103606083015261452f81846144b5565b905095945050505050565b60008151905061454981612d94565b92915050565b60006020828403121561456557614564612d5e565b5b60006145738482850161453a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145d8602683612e2e565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b905091905056fea2646970667358221220da5ba92eb40640f7355676c0451a23c6696b88e61c283b4db22eaf467b6d3b4864736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
2f36e71c94e244c11cddaf93e2ff02c7aa333670443a5460b79588168f984e33
-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x2f36e71c94e244c11cddaf93e2ff02c7aa333670443a5460b79588168f984e33
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 2f36e71c94e244c11cddaf93e2ff02c7aa333670443a5460b79588168f984e33
Deployed Bytecode Sourcemap
211:5331:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5970:615:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;346:109:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13649:218:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13183:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5000:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;740:30:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:2800:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;777:25:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;594:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1863:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3895:333;;;;;;;;;;;;;:::i;:::-;;14553:185:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;459:112:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1219:129:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;706:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;454:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11470:152:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4238:486:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;543:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;636:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6649:232:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:6;;;;;;;;;;;;;:::i;:::-;;664:35:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1466:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;904:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11858:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3496:389:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13939:308:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2037:322:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5301:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;809:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2677:647;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14809:399:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1685:168:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1567:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;402:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12033:318:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;304:41:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;350:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;863:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;575:158:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4734:179:8;;;;;;;;;;;;;:::i;:::-;;5970:615:2;6055:4;6370:10;6355:25;;:11;:25;;;;:102;;;;6447:10;6432:25;;:11;:25;;;;6355:102;:179;;;;6524:10;6509:25;;:11;:25;;;;6355:179;6335:199;;5970:615;;;:::o;11689:100::-;11743:13;11776:5;11769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11689:100;:::o;346:109:1:-;415:4;1122:13:6;:11;:13::i;:::-;434:10:1::1;:16;445:4;434:16;;;;;;;;;;;;;;;;;;;;;;;;;427:23;;346:109:::0;;;:::o;13649:218:2:-;13725:7;13750:16;13758:7;13750;:16::i;:::-;13745:64;;13775:34;;;;;;;;;;;;;;13745:64;13829:15;:24;13845:7;13829:24;;;;;;;;;;;:30;;;;;;;;;;;;13822:37;;13649:218;;;:::o;13183:400::-;13264:13;13280:16;13288:7;13280;:16::i;:::-;13264:32;;13336:5;13313:28;;:19;:17;:19::i;:::-;:28;;;13309:175;;13361:44;13378:5;13385:19;:17;:19::i;:::-;13361:16;:44::i;:::-;13356:128;;13433:35;;;;;;;;;;;;;;13356:128;13309:175;13529:2;13496:15;:24;13512:7;13496:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13567:7;13563:2;13547:28;;13556:5;13547:28;;;;;;;;;;;;13253:330;13183:400;;:::o;5000:323::-;5061:7;5289:15;:13;:15::i;:::-;5274:12;;5258:13;;:28;:46;5251:53;;5000:323;:::o;740:30:8:-;;;;;;;;;;;;;:::o;22788:2800:2:-;22922:27;22952;22971:7;22952:18;:27::i;:::-;22922:57;;23037:4;22996:45;;23012:19;22996:45;;;22992:86;;23050:28;;;;;;;;;;;;;;22992:86;23092:27;23121:23;23148:28;23168:7;23148:19;:28::i;:::-;23091:85;;;;23276:62;23295:15;23312:4;23318:19;:17;:19::i;:::-;23276:18;:62::i;:::-;23271:174;;23358:43;23375:4;23381:19;:17;:19::i;:::-;23358:16;:43::i;:::-;23353:92;;23410:35;;;;;;;;;;;;;;23353:92;23271:174;23476:1;23462:16;;:2;:16;;;23458:52;;23487:23;;;;;;;;;;;;;;23458:52;23523:43;23545:4;23551:2;23555:7;23564:1;23523:21;:43::i;:::-;23659:15;23656:160;;;23799:1;23778:19;23771:30;23656:160;24194:18;:24;24213:4;24194:24;;;;;;;;;;;;;;;;24192:26;;;;;;;;;;;;24263:18;:22;24282:2;24263:22;;;;;;;;;;;;;;;;24261:24;;;;;;;;;;;24585:145;24622:2;24670:45;24685:4;24691:2;24695:19;24670:14;:45::i;:::-;2210:8;24643:72;24585:18;:145::i;:::-;24556:17;:26;24574:7;24556:26;;;;;;;;;;;:174;;;;24900:1;2210:8;24850:19;:46;:51;24846:626;;24922:19;24954:1;24944:7;:11;24922:33;;25111:1;25077:17;:30;25095:11;25077:30;;;;;;;;;;;;:35;25073:384;;25215:13;;25200:11;:28;25196:242;;25395:19;25362:17;:30;25380:11;25362:30;;;;;;;;;;;:52;;;;25196:242;25073:384;24903:569;24846:626;25519:7;25515:2;25500:27;;25509:4;25500:27;;;;;;;;;;;;25538:42;25559:4;25565:2;25569:7;25578:1;25538:20;:42::i;:::-;22911:2677;;;22788:2800;;;:::o;777:25:8:-;;;;:::o;594:31::-;;;;;;;;;;;;;:::o;1863:164::-;1122:13:6;:11;:13::i;:::-;1951:9:8::1;1938;:22;;1930:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2010:9;1994:13;:25;;;;1863:164:::0;:::o;3895:333::-;1122:13:6;:11;:13::i;:::-;3944:7:8::1;3965:42;3957:56;;4049:3;4044:2;4021:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;3957:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3943:114;;;4072:2;4064:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;4104:12;4130:8;4122:22;;4152:21;4122:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4103:75;;;4193:7;4185:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3934:294;;3895:333::o:0;14553:185:2:-;14691:39;14708:4;14714:2;14718:7;14691:39;;;;;;;;;;;;:16;:39::i;:::-;14553:185;;;:::o;459:112:1:-;1122:13:6;:11;:13::i;:::-;555:11:1::1;536:10;:16;547:4;536:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;459:112:::0;;:::o;1219:129:8:-;1122:13:6;:11;:13::i;:::-;1303:8:8::1;;1293:7;:18;;;;;;;:::i;:::-;;1323:17;1331:8;;1323:17;;;;;;;:::i;:::-;;;;;;;;1219:129:::0;;:::o;706:27::-;;;;;;;;;;;;;:::o;454:78::-;;;:::o;11470:152:2:-;11542:7;11585:27;11604:7;11585:18;:27::i;:::-;11562:52;;11470:152;;;:::o;4238:486:8:-;202:10:1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4371:10:8::1;;:17;;4357:3;;:10;;:31;4349:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:13;4469:9:::0;4464:77:::1;4488:3;;:10;;4484:1;:14;4464:77;;;4525:3;;4529:1;4525:6;;;;;;;:::i;:::-;;;;;;;;4516:15;;;;;:::i;:::-;;;4500:3;;;;:::i;:::-;;;4464:77;;;;4582:13;;4573:5;4557:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:38;;4549:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;4628:9;4623:94;4647:3;;:10;;4643:1;:14;4623:94;;;4675:32;4685:10;;4696:1;4685:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4700:3;;4704:1;4700:6;;;;;;;:::i;:::-;;;;;;;;4675:9;:32::i;:::-;4659:3;;;;:::i;:::-;;;4623:94;;;;4340:384;4238:486:::0;;;;:::o;543:44::-;;;:::o;636:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6649:232:2:-;6721:7;6762:1;6745:19;;:5;:19;;;6741:60;;6773:28;;;;;;;;;;;;;;6741:60;1162:13;6819:18;:25;6838:5;6819:25;;;;;;;;;;;;;;;;:54;6812:61;;6649:232;;;:::o;1884:103:6:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;664:35:8:-;;;;:::o;1466:90::-;1122:13:6;:11;:13::i;:::-;1544:4:8::1;1531:10;:17;;;;1466:90:::0;:::o;904:58::-;;;;;;;;;;;;;;;;;:::o;1236:87:6:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;11858:104:2:-;11914:13;11947:7;11940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11858:104;:::o;3496:389:8:-;2296:21:7;:19;:21::i;:::-;3570:18:8::1;;;;;;;;;;;3562:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3674:11;3667:3;3637:27;3651:12;:10;:12::i;:::-;3637:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;3629:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3744:13;;3737:3;3721:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:36;;3713:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3808:11;;3802:3;:17;;;;:::i;:::-;3789:9;:30;3781:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3849:28;3859:12;:10;:12::i;:::-;3873:3;3849:9;:28::i;:::-;2340:20:7::0;:18;:20::i;:::-;3496:389:8;:::o;13939:308:2:-;14050:19;:17;:19::i;:::-;14038:31;;:8;:31;;;14034:61;;14078:17;;;;;;;;;;;;;;14034:61;14160:8;14108:18;:39;14127:19;:17;:19::i;:::-;14108:39;;;;;;;;;;;;;;;:49;14148:8;14108:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;14220:8;14184:55;;14199:19;:17;:19::i;:::-;14184:55;;;14230:8;14184:55;;;;;;:::i;:::-;;;;;;;;13939:308;;:::o;2037:322:8:-;2165:4;2196:155;2227:5;2245:10;;2322:7;2331:5;2305:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2295:43;;;;;;2278:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;2268:72;;;;;;2196:18;:155::i;:::-;2180:171;;2037:322;;;;;:::o;5301:236::-;1122:13:6;:11;:13::i;:::-;5409:25:8::1;;;;;;;;5426:7;:5;:7::i;:::-;5409:25;;;;::::0;5382:15:::1;:24;5398:7;5382:24;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5447:12;5462:18;5471:7;5462;:18::i;:::-;5447:33;;5489:40;5503:4;5509:9;5520:7;5489:12;:40::i;:::-;5373:164;5301:236:::0;;:::o;809:47::-;;;;:::o;2677:647::-;2296:21:7;:19;:21::i;:::-;2816:41:8::1;2830:12;:10;:12::i;:::-;2844:5;2851;2816:13;:41::i;:::-;2808:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2954:5;2944:6;2904:23;:37;2928:12;:10;:12::i;:::-;2904:37;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:55;;2886:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;3016:15;;;;;;;;;;;3008:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;3098:16;3088:6;3072:13;;:22;;;;:::i;:::-;:42;;3064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3167:6;3150:13;;:23;;;;;;;:::i;:::-;;;;;;;;3223:6;3182:23;:37;3206:12;:10;:12::i;:::-;3182:37;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;3242:31;3252:12;:10;:12::i;:::-;3266:6;3242:9;:31::i;:::-;3295:12;:10;:12::i;:::-;3287:29;;;3309:6;3287:29;;;;;;:::i;:::-;;;;;;;;2340:20:7::0;:18;:20::i;:::-;2677:647:8;;;:::o;14809:399:2:-;14976:31;14989:4;14995:2;14999:7;14976:12;:31::i;:::-;15040:1;15022:2;:14;;;:19;15018:183;;15061:56;15092:4;15098:2;15102:7;15111:5;15061:30;:56::i;:::-;15056:145;;15145:40;;;;;;;;;;;;;;15056:145;15018:183;14809:399;;;;:::o;1685:168:8:-;1122:13:6;:11;:13::i;:::-;1792:12:8::1;1774:15;;:30;;;;;;;;;;;;;;;;;;1834:11;1813:18;;:32;;;;;;;;;;;;;;;;;;1685:168:::0;;:::o;1567:108::-;1122:13:6;:11;:13::i;:::-;1655:12:8::1;1641:11;:26;;;;1567:108:::0;:::o;402:41::-;;;:::o;12033:318:2:-;12106:13;12137:16;12145:7;12137;:16::i;:::-;12132:59;;12162:29;;;;;;;;;;;;;;12132:59;12204:21;12228:10;:8;:10::i;:::-;12204:34;;12281:1;12262:7;12256:21;:26;:87;;;;;;;;;;;;;;;;;12309:7;12318:18;12328:7;12318:9;:18::i;:::-;12292:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12256:87;12249:94;;;12033:318;;;:::o;304:41:8:-;;;:::o;350:47::-;;;:::o;863:28::-;;;;:::o;14318:164:2:-;14415:4;14439:18;:25;14458:5;14439:25;;;;;;;;;;;;;;;:35;14465:8;14439:35;;;;;;;;;;;;;;;;;;;;;;;;;14432:42;;14318:164;;;;:::o;575:158:1:-;1122:13:6;:11;:13::i;:::-;683:4:1::1;660:10:::0;:20:::1;671:8;660:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;693:35;718:8;693:23;:35::i;:::-;575:158:::0;:::o;4734:179:8:-;202:10:1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4798:11:8::1;;;;;;;;;;;4797:12;4788:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4857:4;4843:11;;:18;;;;;;;;;;;;;;;;;;4870:35;4880:8;4890:14;4870:9;:35::i;:::-;4734:179::o:0;1401:132:6:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;15463:281:2:-;15528:4;15584:7;15565:15;:13;:15::i;:::-;:26;;:66;;;;;15618:13;;15608:7;:23;15565:66;:152;;;;;15716:1;1932:8;15669:17;:26;15687:7;15669:26;;;;;;;;;;;;:43;:48;15565:152;15545:172;;15463:281;;;:::o;33892:105::-;33952:7;33979:10;33972:17;;33892:105;:::o;4516:92::-;4572:7;4516:92;:::o;8363:1129::-;8430:7;8450:12;8465:7;8450:22;;8533:4;8514:15;:13;:15::i;:::-;:23;8510:915;;8567:13;;8560:4;:20;8556:869;;;8605:14;8622:17;:23;8640:4;8622:23;;;;;;;;;;;;8605:40;;8738:1;1932:8;8711:6;:23;:28;8707:699;;9230:113;9247:1;9237:6;:11;9230:113;;9290:17;:25;9308:6;;;;;;;9290:25;;;;;;;;;;;;9281:34;;9230:113;;;9376:6;9369:13;;;;;;8707:699;8582:843;8556:869;8510:915;9453:31;;;;;;;;;;;;;;8363:1129;;;;:::o;21304:472::-;21399:27;21428:23;21469:38;21510:15;:24;21526:7;21510:24;;;;;;;;;;;21469:65;;21681:18;21658:41;;21738:19;21732:26;21713:45;;21643:126;21304:472;;;:::o;21889:645::-;22031:11;22193:15;22187:4;22183:26;22175:34;;22352:15;22341:9;22337:31;22324:44;;22499:15;22488:9;22485:30;22478:4;22467:9;22464:19;22461:55;22451:65;;21889:645;;;;;:::o;32725:159::-;;;;;:::o;31037:309::-;31172:7;31192:16;2333:3;31218:19;:40;;31192:67;;2333:3;31285:31;31296:4;31302:2;31306:9;31285:10;:31::i;:::-;31277:40;;:61;;31270:68;;;31037:309;;;;;:::o;10961:447::-;11041:14;11209:15;11202:5;11198:27;11189:36;;11383:5;11369:11;11345:22;11341:40;11338:51;11331:5;11328:62;11318:72;;10961:447;;;;:::o;33543:158::-;;;;;:::o;15828:112::-;15905:27;15915:2;15919:8;15905:27;;;;;;;;;;;;:9;:27::i;:::-;15828:112;;:::o;2503:191:6:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;2376:289:7:-;1778:1;2506:7;;:19;2498:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2639:7;:18;;;;2376:289::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;6963:184:2:-;7032:7;1162:13;1299:2;7060:18;:25;7079:5;7060:25;;;;;;;;;;;;;;;;:49;;7059:80;7052:87;;6963:184;;;:::o;2673:213:7:-;1734:1;2856:7;:22;;;;2673:213::o;1179:190:5:-;1304:4;1357;1328:25;1341:5;1348:4;1328:12;:25::i;:::-;:33;1321:40;;1179:190;;;;;:::o;29539:716:2:-;29702:4;29748:2;29723:45;;;29769:19;:17;:19::i;:::-;29790:4;29796:7;29805:5;29723:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29719:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30023:1;30006:6;:13;:18;30002:235;;30052:40;;;;;;;;;;;;;;30002:235;30195:6;30189:13;30180:6;30176:2;30172:15;30165:38;29719:529;29892:54;;;29882:64;;;:6;:64;;;;29875:71;;;29539:716;;;;;;:::o;1358:98:8:-;1410:13;1441:7;1434:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1358:98;:::o;34103:1968:2:-;34168:17;34587:3;34580:4;34574:11;34570:21;34563:28;;34678:3;34672:4;34665:17;34784:3;35240:5;35370:1;35365:3;35361:11;35354:18;;35507:2;35501:4;35497:13;35493:2;35489:22;35484:3;35476:36;35548:2;35542:4;35538:13;35530:21;;35132:697;35567:4;35132:697;;;35758:1;35753:3;35749:11;35742:18;;35809:2;35803:4;35799:13;35795:2;35791:22;35786:3;35778:36;35662:2;35656:4;35652:13;35644:21;;35132:697;;;35136:430;35868:3;35863;35859:13;35983:2;35978:3;35974:12;35967:19;;36046:6;36041:3;36034:19;34207:1857;;34103:1968;;;:::o;2142:201:6:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;31922:147:2:-;32059:6;31922:147;;;;;:::o;16356:689::-;16487:19;16493:2;16497:8;16487:5;:19::i;:::-;16566:1;16548:2;:14;;;:19;16544:483;;16588:11;16602:13;;16588:27;;16634:13;16656:8;16650:3;:14;16634:30;;16683:233;16714:62;16753:1;16757:2;16761:7;;;;;;16770:5;16714:30;:62::i;:::-;16709:167;;16812:40;;;;;;;;;;;;;;16709:167;16911:3;16903:5;:11;16683:233;;16998:3;16981:13;;:20;16977:34;;17003:8;;;16977:34;16569:458;;16544:483;16356:689;;;:::o;2046:296:5:-;2129:7;2149:20;2172:4;2149:27;;2192:9;2187:118;2211:5;:12;2207:1;:16;2187:118;;;2260:33;2270:12;2284:5;2290:1;2284:8;;;;;;;;:::i;:::-;;;;;;;;2260:9;:33::i;:::-;2245:48;;2225:3;;;;;:::i;:::-;;;;2187:118;;;;2322:12;2315:19;;;2046:296;;;;:::o;17318:1537:2:-;17391:20;17414:13;;17391:36;;17456:1;17442:16;;:2;:16;;;17438:48;;17467:19;;;;;;;;;;;;;;17438:48;17513:1;17501:8;:13;17497:44;;17523:18;;;;;;;;;;;;;;17497:44;17554:61;17584:1;17588:2;17592:12;17606:8;17554:21;:61::i;:::-;18097:1;1299:2;18068:1;:25;;18067:31;18055:8;:44;18029:18;:22;18048:2;18029:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;18376:139;18413:2;18467:33;18490:1;18494:2;18498:1;18467:14;:33::i;:::-;18434:30;18455:8;18434:20;:30::i;:::-;:66;18376:18;:139::i;:::-;18342:17;:31;18360:12;18342:31;;;;;;;;;;;:173;;;;18532:15;18550:12;18532:30;;18577:11;18606:8;18591:12;:23;18577:37;;18629:101;18681:9;;;;;;18677:2;18656:35;;18673:1;18656:35;;;;;;;;;;;;18725:3;18715:7;:13;18629:101;;18762:3;18746:13;:19;;;;17803:974;;18787:60;18816:1;18820:2;18824:12;18838:8;18787:20;:60::i;:::-;17380:1475;17318:1537;;:::o;8253:149:5:-;8316:7;8347:1;8343;:5;:51;;8374:20;8389:1;8392;8374:14;:20::i;:::-;8343:51;;;8351:20;8366:1;8369;8351:14;:20::i;:::-;8343:51;8336:58;;8253:149;;;;:::o;12799:322:2:-;12869:14;13100:1;13090:8;13087:15;13062:23;13058:45;13048:55;;12799:322;;;:::o;8410:268:5:-;8478:13;8585:1;8579:4;8572:15;8614:1;8608:4;8601:15;8655:4;8649;8639:21;8630:30;;8410:268;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:329::-;4117:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:119;;;4172:79;;:::i;:::-;4134:119;4292:1;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4263:117;4058:329;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:77::-;6239:7;6268:5;6257:16;;6202:77;;;:::o;6285:118::-;6372:24;6390:5;6372:24;:::i;:::-;6367:3;6360:37;6285:118;;:::o;6409:222::-;6502:4;6540:2;6529:9;6525:18;6517:26;;6553:71;6621:1;6610:9;6606:17;6597:6;6553:71;:::i;:::-;6409:222;;;;:::o;6637:116::-;6707:21;6722:5;6707:21;:::i;:::-;6700:5;6697:32;6687:60;;6743:1;6740;6733:12;6687:60;6637:116;:::o;6759:133::-;6802:5;6840:6;6827:20;6818:29;;6856:30;6880:5;6856:30;:::i;:::-;6759:133;;;;:::o;6898:468::-;6963:6;6971;7020:2;7008:9;6999:7;6995:23;6991:32;6988:119;;;7026:79;;:::i;:::-;6988:119;7146:1;7171:53;7216:7;7207:6;7196:9;7192:22;7171:53;:::i;:::-;7161:63;;7117:117;7273:2;7299:50;7341:7;7332:6;7321:9;7317:22;7299:50;:::i;:::-;7289:60;;7244:115;6898:468;;;;;:::o;7372:117::-;7481:1;7478;7471:12;7495:117;7604:1;7601;7594:12;7618:117;7727:1;7724;7717:12;7755:553;7813:8;7823:6;7873:3;7866:4;7858:6;7854:17;7850:27;7840:122;;7881:79;;:::i;:::-;7840:122;7994:6;7981:20;7971:30;;8024:18;8016:6;8013:30;8010:117;;;8046:79;;:::i;:::-;8010:117;8160:4;8152:6;8148:17;8136:29;;8214:3;8206:4;8198:6;8194:17;8184:8;8180:32;8177:41;8174:128;;;8221:79;;:::i;:::-;8174:128;7755:553;;;;;:::o;8314:529::-;8385:6;8393;8442:2;8430:9;8421:7;8417:23;8413:32;8410:119;;;8448:79;;:::i;:::-;8410:119;8596:1;8585:9;8581:17;8568:31;8626:18;8618:6;8615:30;8612:117;;;8648:79;;:::i;:::-;8612:117;8761:65;8818:7;8809:6;8798:9;8794:22;8761:65;:::i;:::-;8743:83;;;;8539:297;8314:529;;;;;:::o;8866:568::-;8939:8;8949:6;8999:3;8992:4;8984:6;8980:17;8976:27;8966:122;;9007:79;;:::i;:::-;8966:122;9120:6;9107:20;9097:30;;9150:18;9142:6;9139:30;9136:117;;;9172:79;;:::i;:::-;9136:117;9286:4;9278:6;9274:17;9262:29;;9340:3;9332:4;9324:6;9320:17;9310:8;9306:32;9303:41;9300:128;;;9347:79;;:::i;:::-;9300:128;8866:568;;;;;:::o;9457:::-;9530:8;9540:6;9590:3;9583:4;9575:6;9571:17;9567:27;9557:122;;9598:79;;:::i;:::-;9557:122;9711:6;9698:20;9688:30;;9741:18;9733:6;9730:30;9727:117;;;9763:79;;:::i;:::-;9727:117;9877:4;9869:6;9865:17;9853:29;;9931:3;9923:4;9915:6;9911:17;9901:8;9897:32;9894:41;9891:128;;;9938:79;;:::i;:::-;9891:128;9457:568;;;;;:::o;10031:934::-;10153:6;10161;10169;10177;10226:2;10214:9;10205:7;10201:23;10197:32;10194:119;;;10232:79;;:::i;:::-;10194:119;10380:1;10369:9;10365:17;10352:31;10410:18;10402:6;10399:30;10396:117;;;10432:79;;:::i;:::-;10396:117;10545:80;10617:7;10608:6;10597:9;10593:22;10545:80;:::i;:::-;10527:98;;;;10323:312;10702:2;10691:9;10687:18;10674:32;10733:18;10725:6;10722:30;10719:117;;;10755:79;;:::i;:::-;10719:117;10868:80;10940:7;10931:6;10920:9;10916:22;10868:80;:::i;:::-;10850:98;;;;10645:313;10031:934;;;;;;;:::o;10971:122::-;11044:24;11062:5;11044:24;:::i;:::-;11037:5;11034:35;11024:63;;11083:1;11080;11073:12;11024:63;10971:122;:::o;11099:139::-;11145:5;11183:6;11170:20;11161:29;;11199:33;11226:5;11199:33;:::i;:::-;11099:139;;;;:::o;11244:329::-;11303:6;11352:2;11340:9;11331:7;11327:23;11323:32;11320:119;;;11358:79;;:::i;:::-;11320:119;11478:1;11503:53;11548:7;11539:6;11528:9;11524:22;11503:53;:::i;:::-;11493:63;;11449:117;11244:329;;;;:::o;11579:180::-;11627:77;11624:1;11617:88;11724:4;11721:1;11714:15;11748:4;11745:1;11738:15;11765:281;11848:27;11870:4;11848:27;:::i;:::-;11840:6;11836:40;11978:6;11966:10;11963:22;11942:18;11930:10;11927:34;11924:62;11921:88;;;11989:18;;:::i;:::-;11921:88;12029:10;12025:2;12018:22;11808:238;11765:281;;:::o;12052:129::-;12086:6;12113:20;;:::i;:::-;12103:30;;12142:33;12170:4;12162:6;12142:33;:::i;:::-;12052:129;;;:::o;12187:311::-;12264:4;12354:18;12346:6;12343:30;12340:56;;;12376:18;;:::i;:::-;12340:56;12426:4;12418:6;12414:17;12406:25;;12486:4;12480;12476:15;12468:23;;12187:311;;;:::o;12521:710::-;12617:5;12642:81;12658:64;12715:6;12658:64;:::i;:::-;12642:81;:::i;:::-;12633:90;;12743:5;12772:6;12765:5;12758:21;12806:4;12799:5;12795:16;12788:23;;12859:4;12851:6;12847:17;12839:6;12835:30;12888:3;12880:6;12877:15;12874:122;;;12907:79;;:::i;:::-;12874:122;13022:6;13005:220;13039:6;13034:3;13031:15;13005:220;;;13114:3;13143:37;13176:3;13164:10;13143:37;:::i;:::-;13138:3;13131:50;13210:4;13205:3;13201:14;13194:21;;13081:144;13065:4;13060:3;13056:14;13049:21;;13005:220;;;13009:21;12623:608;;12521:710;;;;;:::o;13254:370::-;13325:5;13374:3;13367:4;13359:6;13355:17;13351:27;13341:122;;13382:79;;:::i;:::-;13341:122;13499:6;13486:20;13524:94;13614:3;13606:6;13599:4;13591:6;13587:17;13524:94;:::i;:::-;13515:103;;13331:293;13254:370;;;;:::o;13630:829::-;13732:6;13740;13748;13797:2;13785:9;13776:7;13772:23;13768:32;13765:119;;;13803:79;;:::i;:::-;13765:119;13923:1;13948:53;13993:7;13984:6;13973:9;13969:22;13948:53;:::i;:::-;13938:63;;13894:117;14078:2;14067:9;14063:18;14050:32;14109:18;14101:6;14098:30;14095:117;;;14131:79;;:::i;:::-;14095:117;14236:78;14306:7;14297:6;14286:9;14282:22;14236:78;:::i;:::-;14226:88;;14021:303;14363:2;14389:53;14434:7;14425:6;14414:9;14410:22;14389:53;:::i;:::-;14379:63;;14334:118;13630:829;;;;;:::o;14465:474::-;14533:6;14541;14590:2;14578:9;14569:7;14565:23;14561:32;14558:119;;;14596:79;;:::i;:::-;14558:119;14716:1;14741:53;14786:7;14777:6;14766:9;14762:22;14741:53;:::i;:::-;14731:63;;14687:117;14843:2;14869:53;14914:7;14905:6;14894:9;14890:22;14869:53;:::i;:::-;14859:63;;14814:118;14465:474;;;;;:::o;14945:829::-;15047:6;15055;15063;15112:2;15100:9;15091:7;15087:23;15083:32;15080:119;;;15118:79;;:::i;:::-;15080:119;15266:1;15255:9;15251:17;15238:31;15296:18;15288:6;15285:30;15282:117;;;15318:79;;:::i;:::-;15282:117;15423:78;15493:7;15484:6;15473:9;15469:22;15423:78;:::i;:::-;15413:88;;15209:302;15550:2;15576:53;15621:7;15612:6;15601:9;15597:22;15576:53;:::i;:::-;15566:63;;15521:118;15678:2;15704:53;15749:7;15740:6;15729:9;15725:22;15704:53;:::i;:::-;15694:63;;15649:118;14945:829;;;;;:::o;15780:117::-;15889:1;15886;15879:12;15903:307;15964:4;16054:18;16046:6;16043:30;16040:56;;;16076:18;;:::i;:::-;16040:56;16114:29;16136:6;16114:29;:::i;:::-;16106:37;;16198:4;16192;16188:15;16180:23;;15903:307;;;:::o;16216:146::-;16313:6;16308:3;16303;16290:30;16354:1;16345:6;16340:3;16336:16;16329:27;16216:146;;;:::o;16368:423::-;16445:5;16470:65;16486:48;16527:6;16486:48;:::i;:::-;16470:65;:::i;:::-;16461:74;;16558:6;16551:5;16544:21;16596:4;16589:5;16585:16;16634:3;16625:6;16620:3;16616:16;16613:25;16610:112;;;16641:79;;:::i;:::-;16610:112;16731:54;16778:6;16773:3;16768;16731:54;:::i;:::-;16451:340;16368:423;;;;;:::o;16810:338::-;16865:5;16914:3;16907:4;16899:6;16895:17;16891:27;16881:122;;16922:79;;:::i;:::-;16881:122;17039:6;17026:20;17064:78;17138:3;17130:6;17123:4;17115:6;17111:17;17064:78;:::i;:::-;17055:87;;16871:277;16810:338;;;;:::o;17154:943::-;17249:6;17257;17265;17273;17322:3;17310:9;17301:7;17297:23;17293:33;17290:120;;;17329:79;;:::i;:::-;17290:120;17449:1;17474:53;17519:7;17510:6;17499:9;17495:22;17474:53;:::i;:::-;17464:63;;17420:117;17576:2;17602:53;17647:7;17638:6;17627:9;17623:22;17602:53;:::i;:::-;17592:63;;17547:118;17704:2;17730:53;17775:7;17766:6;17755:9;17751:22;17730:53;:::i;:::-;17720:63;;17675:118;17860:2;17849:9;17845:18;17832:32;17891:18;17883:6;17880:30;17877:117;;;17913:79;;:::i;:::-;17877:117;18018:62;18072:7;18063:6;18052:9;18048:22;18018:62;:::i;:::-;18008:72;;17803:287;17154:943;;;;;;;:::o;18103:462::-;18165:6;18173;18222:2;18210:9;18201:7;18197:23;18193:32;18190:119;;;18228:79;;:::i;:::-;18190:119;18348:1;18373:50;18415:7;18406:6;18395:9;18391:22;18373:50;:::i;:::-;18363:60;;18319:114;18472:2;18498:50;18540:7;18531:6;18520:9;18516:22;18498:50;:::i;:::-;18488:60;;18443:115;18103:462;;;;;:::o;18571:474::-;18639:6;18647;18696:2;18684:9;18675:7;18671:23;18667:32;18664:119;;;18702:79;;:::i;:::-;18664:119;18822:1;18847:53;18892:7;18883:6;18872:9;18868:22;18847:53;:::i;:::-;18837:63;;18793:117;18949:2;18975:53;19020:7;19011:6;19000:9;18996:22;18975:53;:::i;:::-;18965:63;;18920:118;18571:474;;;;;:::o;19051:180::-;19099:77;19096:1;19089:88;19196:4;19193:1;19186:15;19220:4;19217:1;19210:15;19237:320;19281:6;19318:1;19312:4;19308:12;19298:22;;19365:1;19359:4;19355:12;19386:18;19376:81;;19442:4;19434:6;19430:17;19420:27;;19376:81;19504:2;19496:6;19493:14;19473:18;19470:38;19467:84;;19523:18;;:::i;:::-;19467:84;19288:269;19237:320;;;:::o;19563:170::-;19703:22;19699:1;19691:6;19687:14;19680:46;19563:170;:::o;19739:366::-;19881:3;19902:67;19966:2;19961:3;19902:67;:::i;:::-;19895:74;;19978:93;20067:3;19978:93;:::i;:::-;20096:2;20091:3;20087:12;20080:19;;19739:366;;;:::o;20111:419::-;20277:4;20315:2;20304:9;20300:18;20292:26;;20364:9;20358:4;20354:20;20350:1;20339:9;20335:17;20328:47;20392:131;20518:4;20392:131;:::i;:::-;20384:139;;20111:419;;;:::o;20536:180::-;20584:77;20581:1;20574:88;20681:4;20678:1;20671:15;20705:4;20702:1;20695:15;20722:348;20762:7;20785:20;20803:1;20785:20;:::i;:::-;20780:25;;20819:20;20837:1;20819:20;:::i;:::-;20814:25;;21007:1;20939:66;20935:74;20932:1;20929:81;20924:1;20917:9;20910:17;20906:105;20903:131;;;21014:18;;:::i;:::-;20903:131;21062:1;21059;21055:9;21044:20;;20722:348;;;;:::o;21076:180::-;21124:77;21121:1;21114:88;21221:4;21218:1;21211:15;21245:4;21242:1;21235:15;21262:185;21302:1;21319:20;21337:1;21319:20;:::i;:::-;21314:25;;21353:20;21371:1;21353:20;:::i;:::-;21348:25;;21392:1;21382:35;;21397:18;;:::i;:::-;21382:35;21439:1;21436;21432:9;21427:14;;21262:185;;;;:::o;21453:147::-;21554:11;21591:3;21576:18;;21453:147;;;;:::o;21606:114::-;;:::o;21726:398::-;21885:3;21906:83;21987:1;21982:3;21906:83;:::i;:::-;21899:90;;21998:93;22087:3;21998:93;:::i;:::-;22116:1;22111:3;22107:11;22100:18;;21726:398;;;:::o;22130:379::-;22314:3;22336:147;22479:3;22336:147;:::i;:::-;22329:154;;22500:3;22493:10;;22130:379;;;:::o;22515:165::-;22655:17;22651:1;22643:6;22639:14;22632:41;22515:165;:::o;22686:366::-;22828:3;22849:67;22913:2;22908:3;22849:67;:::i;:::-;22842:74;;22925:93;23014:3;22925:93;:::i;:::-;23043:2;23038:3;23034:12;23027:19;;22686:366;;;:::o;23058:419::-;23224:4;23262:2;23251:9;23247:18;23239:26;;23311:9;23305:4;23301:20;23297:1;23286:9;23282:17;23275:47;23339:131;23465:4;23339:131;:::i;:::-;23331:139;;23058:419;;;:::o;23483:165::-;23623:17;23619:1;23611:6;23607:14;23600:41;23483:165;:::o;23654:366::-;23796:3;23817:67;23881:2;23876:3;23817:67;:::i;:::-;23810:74;;23893:93;23982:3;23893:93;:::i;:::-;24011:2;24006:3;24002:12;23995:19;;23654:366;;;:::o;24026:419::-;24192:4;24230:2;24219:9;24215:18;24207:26;;24279:9;24273:4;24269:20;24265:1;24254:9;24250:17;24243:47;24307:131;24433:4;24307:131;:::i;:::-;24299:139;;24026:419;;;:::o;24451:97::-;24510:6;24538:3;24528:13;;24451:97;;;;:::o;24554:141::-;24603:4;24626:3;24618:11;;24649:3;24646:1;24639:14;24683:4;24680:1;24670:18;24662:26;;24554:141;;;:::o;24701:93::-;24738:6;24785:2;24780;24773:5;24769:14;24765:23;24755:33;;24701:93;;;:::o;24800:107::-;24844:8;24894:5;24888:4;24884:16;24863:37;;24800:107;;;;:::o;24913:393::-;24982:6;25032:1;25020:10;25016:18;25055:97;25085:66;25074:9;25055:97;:::i;:::-;25173:39;25203:8;25192:9;25173:39;:::i;:::-;25161:51;;25245:4;25241:9;25234:5;25230:21;25221:30;;25294:4;25284:8;25280:19;25273:5;25270:30;25260:40;;24989:317;;24913:393;;;;;:::o;25312:60::-;25340:3;25361:5;25354:12;;25312:60;;;:::o;25378:142::-;25428:9;25461:53;25479:34;25488:24;25506:5;25488:24;:::i;:::-;25479:34;:::i;:::-;25461:53;:::i;:::-;25448:66;;25378:142;;;:::o;25526:75::-;25569:3;25590:5;25583:12;;25526:75;;;:::o;25607:269::-;25717:39;25748:7;25717:39;:::i;:::-;25778:91;25827:41;25851:16;25827:41;:::i;:::-;25819:6;25812:4;25806:11;25778:91;:::i;:::-;25772:4;25765:105;25683:193;25607:269;;;:::o;25882:73::-;25927:3;25882:73;:::o;25961:189::-;26038:32;;:::i;:::-;26079:65;26137:6;26129;26123:4;26079:65;:::i;:::-;26014:136;25961:189;;:::o;26156:186::-;26216:120;26233:3;26226:5;26223:14;26216:120;;;26287:39;26324:1;26317:5;26287:39;:::i;:::-;26260:1;26253:5;26249:13;26240:22;;26216:120;;;26156:186;;:::o;26348:543::-;26449:2;26444:3;26441:11;26438:446;;;26483:38;26515:5;26483:38;:::i;:::-;26567:29;26585:10;26567:29;:::i;:::-;26557:8;26553:44;26750:2;26738:10;26735:18;26732:49;;;26771:8;26756:23;;26732:49;26794:80;26850:22;26868:3;26850:22;:::i;:::-;26840:8;26836:37;26823:11;26794:80;:::i;:::-;26453:431;;26438:446;26348:543;;;:::o;26897:117::-;26951:8;27001:5;26995:4;26991:16;26970:37;;26897:117;;;;:::o;27020:169::-;27064:6;27097:51;27145:1;27141:6;27133:5;27130:1;27126:13;27097:51;:::i;:::-;27093:56;27178:4;27172;27168:15;27158:25;;27071:118;27020:169;;;;:::o;27194:295::-;27270:4;27416:29;27441:3;27435:4;27416:29;:::i;:::-;27408:37;;27478:3;27475:1;27471:11;27465:4;27462:21;27454:29;;27194:295;;;;:::o;27494:1403::-;27618:44;27658:3;27653;27618:44;:::i;:::-;27727:18;27719:6;27716:30;27713:56;;;27749:18;;:::i;:::-;27713:56;27793:38;27825:4;27819:11;27793:38;:::i;:::-;27878:67;27938:6;27930;27924:4;27878:67;:::i;:::-;27972:1;28001:2;27993:6;27990:14;28018:1;28013:632;;;;28689:1;28706:6;28703:84;;;28762:9;28757:3;28753:19;28740:33;28731:42;;28703:84;28813:67;28873:6;28866:5;28813:67;:::i;:::-;28807:4;28800:81;28662:229;27983:908;;28013:632;28065:4;28061:9;28053:6;28049:22;28099:37;28131:4;28099:37;:::i;:::-;28158:1;28172:215;28186:7;28183:1;28180:14;28172:215;;;28272:9;28267:3;28263:19;28250:33;28242:6;28235:49;28323:1;28315:6;28311:14;28301:24;;28370:2;28359:9;28355:18;28342:31;;28209:4;28206:1;28202:12;28197:17;;28172:215;;;28415:6;28406:7;28403:19;28400:186;;;28480:9;28475:3;28471:19;28458:33;28523:48;28565:4;28557:6;28553:17;28542:9;28523:48;:::i;:::-;28515:6;28508:64;28423:163;28400:186;28632:1;28628;28620:6;28616:14;28612:22;28606:4;28599:36;28020:625;;;27983:908;;27593:1304;;;27494:1403;;;:::o;28927:317::-;29025:3;29046:71;29110:6;29105:3;29046:71;:::i;:::-;29039:78;;29127:56;29176:6;29171:3;29164:5;29127:56;:::i;:::-;29208:29;29230:6;29208:29;:::i;:::-;29203:3;29199:39;29192:46;;28927:317;;;;;:::o;29250:333::-;29373:4;29411:2;29400:9;29396:18;29388:26;;29460:9;29454:4;29450:20;29446:1;29435:9;29431:17;29424:47;29488:88;29571:4;29562:6;29554;29488:88;:::i;:::-;29480:96;;29250:333;;;;;:::o;29589:166::-;29729:18;29725:1;29717:6;29713:14;29706:42;29589:166;:::o;29761:366::-;29903:3;29924:67;29988:2;29983:3;29924:67;:::i;:::-;29917:74;;30000:93;30089:3;30000:93;:::i;:::-;30118:2;30113:3;30109:12;30102:19;;29761:366;;;:::o;30133:419::-;30299:4;30337:2;30326:9;30322:18;30314:26;;30386:9;30380:4;30376:20;30372:1;30361:9;30357:17;30350:47;30414:131;30540:4;30414:131;:::i;:::-;30406:139;;30133:419;;;:::o;30558:182::-;30698:34;30694:1;30686:6;30682:14;30675:58;30558:182;:::o;30746:366::-;30888:3;30909:67;30973:2;30968:3;30909:67;:::i;:::-;30902:74;;30985:93;31074:3;30985:93;:::i;:::-;31103:2;31098:3;31094:12;31087:19;;30746:366;;;:::o;31118:419::-;31284:4;31322:2;31311:9;31307:18;31299:26;;31371:9;31365:4;31361:20;31357:1;31346:9;31342:17;31335:47;31399:131;31525:4;31399:131;:::i;:::-;31391:139;;31118:419;;;:::o;31543:180::-;31591:77;31588:1;31581:88;31688:4;31685:1;31678:15;31712:4;31709:1;31702:15;31729:191;31769:3;31788:20;31806:1;31788:20;:::i;:::-;31783:25;;31822:20;31840:1;31822:20;:::i;:::-;31817:25;;31865:1;31862;31858:9;31851:16;;31886:3;31883:1;31880:10;31877:36;;;31893:18;;:::i;:::-;31877:36;31729:191;;;;:::o;31926:233::-;31965:3;31988:24;32006:5;31988:24;:::i;:::-;31979:33;;32034:66;32027:5;32024:77;32021:103;;32104:18;;:::i;:::-;32021:103;32151:1;32144:5;32140:13;32133:20;;31926:233;;;:::o;32165:160::-;32305:12;32301:1;32293:6;32289:14;32282:36;32165:160;:::o;32331:366::-;32473:3;32494:67;32558:2;32553:3;32494:67;:::i;:::-;32487:74;;32570:93;32659:3;32570:93;:::i;:::-;32688:2;32683:3;32679:12;32672:19;;32331:366;;;:::o;32703:419::-;32869:4;32907:2;32896:9;32892:18;32884:26;;32956:9;32950:4;32946:20;32942:1;32931:9;32927:17;32920:47;32984:131;33110:4;32984:131;:::i;:::-;32976:139;;32703:419;;;:::o;33128:177::-;33268:29;33264:1;33256:6;33252:14;33245:53;33128:177;:::o;33311:366::-;33453:3;33474:67;33538:2;33533:3;33474:67;:::i;:::-;33467:74;;33550:93;33639:3;33550:93;:::i;:::-;33668:2;33663:3;33659:12;33652:19;;33311:366;;;:::o;33683:419::-;33849:4;33887:2;33876:9;33872:18;33864:26;;33936:9;33930:4;33926:20;33922:1;33911:9;33907:17;33900:47;33964:131;34090:4;33964:131;:::i;:::-;33956:139;;33683:419;;;:::o;34108:164::-;34248:16;34244:1;34236:6;34232:14;34225:40;34108:164;:::o;34278:366::-;34420:3;34441:67;34505:2;34500:3;34441:67;:::i;:::-;34434:74;;34517:93;34606:3;34517:93;:::i;:::-;34635:2;34630:3;34626:12;34619:19;;34278:366;;;:::o;34650:419::-;34816:4;34854:2;34843:9;34839:18;34831:26;;34903:9;34897:4;34893:20;34889:1;34878:9;34874:17;34867:47;34931:131;35057:4;34931:131;:::i;:::-;34923:139;;34650:419;;;:::o;35075:162::-;35215:14;35211:1;35203:6;35199:14;35192:38;35075:162;:::o;35243:366::-;35385:3;35406:67;35470:2;35465:3;35406:67;:::i;:::-;35399:74;;35482:93;35571:3;35482:93;:::i;:::-;35600:2;35595:3;35591:12;35584:19;;35243:366;;;:::o;35615:419::-;35781:4;35819:2;35808:9;35804:18;35796:26;;35868:9;35862:4;35858:20;35854:1;35843:9;35839:17;35832:47;35896:131;36022:4;35896:131;:::i;:::-;35888:139;;35615:419;;;:::o;36040:94::-;36073:8;36121:5;36117:2;36113:14;36092:35;;36040:94;;;:::o;36140:::-;36179:7;36208:20;36222:5;36208:20;:::i;:::-;36197:31;;36140:94;;;:::o;36240:100::-;36279:7;36308:26;36328:5;36308:26;:::i;:::-;36297:37;;36240:100;;;:::o;36346:157::-;36451:45;36471:24;36489:5;36471:24;:::i;:::-;36451:45;:::i;:::-;36446:3;36439:58;36346:157;;:::o;36509:79::-;36548:7;36577:5;36566:16;;36509:79;;;:::o;36594:157::-;36699:45;36719:24;36737:5;36719:24;:::i;:::-;36699:45;:::i;:::-;36694:3;36687:58;36594:157;;:::o;36757:397::-;36897:3;36912:75;36983:3;36974:6;36912:75;:::i;:::-;37012:2;37007:3;37003:12;36996:19;;37025:75;37096:3;37087:6;37025:75;:::i;:::-;37125:2;37120:3;37116:12;37109:19;;37145:3;37138:10;;36757:397;;;;;:::o;37160:79::-;37199:7;37228:5;37217:16;;37160:79;;;:::o;37245:157::-;37350:45;37370:24;37388:5;37370:24;:::i;:::-;37350:45;:::i;:::-;37345:3;37338:58;37245:157;;:::o;37408:256::-;37520:3;37535:75;37606:3;37597:6;37535:75;:::i;:::-;37635:2;37630:3;37626:12;37619:19;;37655:3;37648:10;;37408:256;;;;:::o;37670:165::-;37810:17;37806:1;37798:6;37794:14;37787:41;37670:165;:::o;37841:366::-;37983:3;38004:67;38068:2;38063:3;38004:67;:::i;:::-;37997:74;;38080:93;38169:3;38080:93;:::i;:::-;38198:2;38193:3;38189:12;38182:19;;37841:366;;;:::o;38213:419::-;38379:4;38417:2;38406:9;38402:18;38394:26;;38466:9;38460:4;38456:20;38452:1;38441:9;38437:17;38430:47;38494:131;38620:4;38494:131;:::i;:::-;38486:139;;38213:419;;;:::o;38638:168::-;38778:20;38774:1;38766:6;38762:14;38755:44;38638:168;:::o;38812:366::-;38954:3;38975:67;39039:2;39034:3;38975:67;:::i;:::-;38968:74;;39051:93;39140:3;39051:93;:::i;:::-;39169:2;39164:3;39160:12;39153:19;;38812:366;;;:::o;39184:419::-;39350:4;39388:2;39377:9;39373:18;39365:26;;39437:9;39431:4;39427:20;39423:1;39412:9;39408:17;39401:47;39465:131;39591:4;39465:131;:::i;:::-;39457:139;;39184:419;;;:::o;39609:169::-;39749:21;39745:1;39737:6;39733:14;39726:45;39609:169;:::o;39784:366::-;39926:3;39947:67;40011:2;40006:3;39947:67;:::i;:::-;39940:74;;40023:93;40112:3;40023:93;:::i;:::-;40141:2;40136:3;40132:12;40125:19;;39784:366;;;:::o;40156:419::-;40322:4;40360:2;40349:9;40345:18;40337:26;;40409:9;40403:4;40399:20;40395:1;40384:9;40380:17;40373:47;40437:131;40563:4;40437:131;:::i;:::-;40429:139;;40156:419;;;:::o;40581:168::-;40721:20;40717:1;40709:6;40705:14;40698:44;40581:168;:::o;40755:366::-;40897:3;40918:67;40982:2;40977:3;40918:67;:::i;:::-;40911:74;;40994:93;41083:3;40994:93;:::i;:::-;41112:2;41107:3;41103:12;41096:19;;40755:366;;;:::o;41127:419::-;41293:4;41331:2;41320:9;41316:18;41308:26;;41380:9;41374:4;41370:20;41366:1;41355:9;41351:17;41344:47;41408:131;41534:4;41408:131;:::i;:::-;41400:139;;41127:419;;;:::o;41552:148::-;41654:11;41691:3;41676:18;;41552:148;;;;:::o;41706:390::-;41812:3;41840:39;41873:5;41840:39;:::i;:::-;41895:89;41977:6;41972:3;41895:89;:::i;:::-;41888:96;;41993:65;42051:6;42046:3;42039:4;42032:5;42028:16;41993:65;:::i;:::-;42083:6;42078:3;42074:16;42067:23;;41816:280;41706:390;;;;:::o;42102:435::-;42282:3;42304:95;42395:3;42386:6;42304:95;:::i;:::-;42297:102;;42416:95;42507:3;42498:6;42416:95;:::i;:::-;42409:102;;42528:3;42521:10;;42102:435;;;;;:::o;42543:165::-;42683:17;42679:1;42671:6;42667:14;42660:41;42543:165;:::o;42714:366::-;42856:3;42877:67;42941:2;42936:3;42877:67;:::i;:::-;42870:74;;42953:93;43042:3;42953:93;:::i;:::-;43071:2;43066:3;43062:12;43055:19;;42714:366;;;:::o;43086:419::-;43252:4;43290:2;43279:9;43275:18;43267:26;;43339:9;43333:4;43329:20;43325:1;43314:9;43310:17;43303:47;43367:131;43493:4;43367:131;:::i;:::-;43359:139;;43086:419;;;:::o;43511:182::-;43651:34;43647:1;43639:6;43635:14;43628:58;43511:182;:::o;43699:366::-;43841:3;43862:67;43926:2;43921:3;43862:67;:::i;:::-;43855:74;;43938:93;44027:3;43938:93;:::i;:::-;44056:2;44051:3;44047:12;44040:19;;43699:366;;;:::o;44071:419::-;44237:4;44275:2;44264:9;44260:18;44252:26;;44324:9;44318:4;44314:20;44310:1;44299:9;44295:17;44288:47;44352:131;44478:4;44352:131;:::i;:::-;44344:139;;44071:419;;;:::o;44496:181::-;44636:33;44632:1;44624:6;44620:14;44613:57;44496:181;:::o;44683:366::-;44825:3;44846:67;44910:2;44905:3;44846:67;:::i;:::-;44839:74;;44922:93;45011:3;44922:93;:::i;:::-;45040:2;45035:3;45031:12;45024:19;;44683:366;;;:::o;45055:419::-;45221:4;45259:2;45248:9;45244:18;45236:26;;45308:9;45302:4;45298:20;45294:1;45283:9;45279:17;45272:47;45336:131;45462:4;45336:131;:::i;:::-;45328:139;;45055:419;;;:::o;45480:98::-;45531:6;45565:5;45559:12;45549:22;;45480:98;;;:::o;45584:168::-;45667:11;45701:6;45696:3;45689:19;45741:4;45736:3;45732:14;45717:29;;45584:168;;;;:::o;45758:373::-;45844:3;45872:38;45904:5;45872:38;:::i;:::-;45926:70;45989:6;45984:3;45926:70;:::i;:::-;45919:77;;46005:65;46063:6;46058:3;46051:4;46044:5;46040:16;46005:65;:::i;:::-;46095:29;46117:6;46095:29;:::i;:::-;46090:3;46086:39;46079:46;;45848:283;45758:373;;;;:::o;46137:640::-;46332:4;46370:3;46359:9;46355:19;46347:27;;46384:71;46452:1;46441:9;46437:17;46428:6;46384:71;:::i;:::-;46465:72;46533:2;46522:9;46518:18;46509:6;46465:72;:::i;:::-;46547;46615:2;46604:9;46600:18;46591:6;46547:72;:::i;:::-;46666:9;46660:4;46656:20;46651:2;46640:9;46636:18;46629:48;46694:76;46765:4;46756:6;46694:76;:::i;:::-;46686:84;;46137:640;;;;;;;:::o;46783:141::-;46839:5;46870:6;46864:13;46855:22;;46886:32;46912:5;46886:32;:::i;:::-;46783:141;;;;:::o;46930:349::-;46999:6;47048:2;47036:9;47027:7;47023:23;47019:32;47016:119;;;47054:79;;:::i;:::-;47016:119;47174:1;47199:63;47254:7;47245:6;47234:9;47230:22;47199:63;:::i;:::-;47189:73;;47145:127;46930:349;;;;:::o;47285:225::-;47425:34;47421:1;47413:6;47409:14;47402:58;47494:8;47489:2;47481:6;47477:15;47470:33;47285:225;:::o;47516:366::-;47658:3;47679:67;47743:2;47738:3;47679:67;:::i;:::-;47672:74;;47755:93;47844:3;47755:93;:::i;:::-;47873:2;47868:3;47864:12;47857:19;;47516:366;;;:::o;47888:419::-;48054:4;48092:2;48081:9;48077:18;48069:26;;48141:9;48135:4;48131:20;48127:1;48116:9;48112:17;48105:47;48169:131;48295:4;48169:131;:::i;:::-;48161:139;;47888:419;;;:::o
Swarm Source
ipfs://da5ba92eb40640f7355676c0451a23c6696b88e61c283b4db22eaf467b6d3b48
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.