Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
777 GUMMY
Holders
277
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 GUMMYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GummyInvasions
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 GummyInvasions is Delegated, ReentrancyGuard, ERC721A { using Strings for uint256; uint256 public immutable maxSupply = 777; uint256 public personalCap = 3; uint256 public teamAllocation = 22; bool public teamClaimed = false; string public baseURI; string public uriSuffix = ".json"; bool public isPresaleActive; bool public isPublicSaleActive; bytes32 public merkleRoot; uint256 public mintPrice = 444000000000000000; uint256 public whitelistSold; address public registry = 0x53Fc2d449Ca9A5eA311081C545D5Bb7BB0b802D8; mapping(address => uint256) public whitelistAccountAmounts; event BaseURI(string baseUri); constructor() Delegated() ERC721A("Gummy Invasions", "GUMMY") { } function setBaseURI(string calldata _baseUri) external onlyOwner onlyDelegates { baseURI = _baseUri; emit BaseURI(_baseUri); } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Token doesn't exist"); return string(abi.encodePacked(baseURI, _tokenId.toString(), uriSuffix)); } function setMerkleRoot(bytes32 root) external onlyOwner { merkleRoot = root; } function setPersonalCap(uint256 _personalCap) public onlyOwner onlyDelegates { personalCap = _personalCap; } function setMintPrice(uint256 _mintPrice) external onlyOwner onlyDelegates { mintPrice = _mintPrice; } function setSaleConfig( bool presaleState, bool publicState ) external onlyOwner onlyDelegates{ isPresaleActive = presaleState; isPublicSaleActive = publicState; } 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)))) ); } function mint(bytes32[] memory proof, uint256 alloc, uint256 qty) external payable nonReentrant { require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints"); require(totalSupply() + qty <= maxSupply, "max supply"); require(msg.value == qty * mintPrice, "wrong amount"); if (isPublicSaleActive) { require(isPublicSaleActive, "public auction not started yet"); } else if (isPresaleActive) { require(isWhitelisted(_msgSender(), proof, alloc), "not whitelisted"); require(whitelistAccountAmounts[_msgSender()] + qty <= alloc, "Auction is over, all tokens claimed"); whitelistSold += qty; whitelistAccountAmounts[_msgSender()] += qty; } else{ revert( "auction not active" ); } _safeMint(_msgSender(), qty); } function crossmint(address _to, uint256 qty) public payable nonReentrant { require(isPublicSaleActive, "public auction not started yet"); require(msg.value == qty * mintPrice, "wrong amount"); require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints"); require(totalSupply() + qty <= maxSupply, "max supply"); require(msg.sender == 0xdAb1a1854214684acE522439684a145E62505233, "This function is for Crossmint only." ); _safeMint(_to, qty); } function setFailSafeRegistry(address _registry) external onlyOwner onlyDelegates { registry = _registry; } function withdraw() external onlyOwner onlyDelegates { (bool success, ) = payable(registry).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 <= maxSupply, "max supply"); for( uint256 i = 0; i < qty.length; ++i ){ _safeMint(recipients[i], qty[i]); } } function airdropTeam() external onlyOwner onlyDelegates{ require( !teamClaimed, "already claimed" ); teamClaimed = true; _safeMint(msg.sender, 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 1; } /** * @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
[{"inputs":[],"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":"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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","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":"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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"alloc","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_registry","type":"address"}],"name":"setFailSafeRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_personalCap","type":"uint256"}],"name":"setPersonalCap","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":"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":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"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
60a06040526103096080908152506003600b556016600c556000600d60006101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f908162000078919062000654565b5067062967a5c84600006012557353fc2d449ca9a5ea311081c545d5bb7bb0b802d8601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000e757600080fd5b506040518060400160405280600f81526020017f47756d6d7920496e766173696f6e7300000000000000000000000000000000008152506040518060400160405280600581526020017f47554d4d590000000000000000000000000000000000000000000000000000008152506200017462000168620001e060201b60201c565b620001e860201b60201c565b6200019662000188620002ac60201b60201c565b6001620002d560201b60201c565b60016002819055508160059081620001af919062000654565b508060069081620001c1919062000654565b50620001d26200034060201b60201c565b6003819055505050620007be565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002e56200034960201b60201c565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006001905090565b62000359620001e060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200037f620002ac60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cf906200079c565b60405180910390fd5b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045c57607f821691505b60208210810362000472576200047162000414565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004dc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049d565b620004e886836200049d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005356200052f620005298462000500565b6200050a565b62000500565b9050919050565b6000819050919050565b620005518362000514565b6200056962000560826200053c565b848454620004aa565b825550505050565b600090565b6200058062000571565b6200058d81848462000546565b505050565b5b81811015620005b557620005a960008262000576565b60018101905062000593565b5050565b601f8211156200060457620005ce8162000478565b620005d9846200048d565b81016020851015620005e9578190505b62000601620005f8856200048d565b83018262000592565b50505b505050565b600082821c905092915050565b6000620006296000198460080262000609565b1980831691505092915050565b600062000644838362000616565b9150826002028217905092915050565b6200065f82620003da565b67ffffffffffffffff8111156200067b576200067a620003e5565b5b62000687825462000443565b62000694828285620005b9565b600060209050601f831160018114620006cc5760008415620006b7578287015190505b620006c3858262000636565b86555062000733565b601f198416620006dc8662000478565b60005b828110156200070657848901518255600182019150602085019450602081019050620006df565b8683101562000726578489015162000722601f89168262000616565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007846020836200073b565b915062000791826200074c565b602082019050919050565b60006020820190508181036000830152620007b78162000775565b9050919050565b608051614b44620007ef60003960008181610dd10152818161189001528181611ade015261235c0152614b446000f3fe6080604052600436106102725760003560e01c80636c0360eb1161014f578063a923625c116100c1578063e78b9d0b1161007a578063e78b9d0b14610929578063e985e9c514610954578063f2fde38b14610991578063f4a0a528146109ba578063f760f228146109e3578063ff45f00f14610a0c57610272565b8063a923625c1461081b578063b88d4fde14610844578063bfb396971461086d578063c7c2aee314610896578063c87b56dd146108c1578063d5abeb01146108fe57610272565b806385a8c9371161011357806385a8c937146106f95780638da5cb5b1461073657806391d6fc281461076157806395d89b411461078a578063a22cb465146107b5578063a371a062146107de57610272565b80636c0360eb1461062657806370a0823114610651578063715018a61461068e5780637b103999146106a55780637cb64759146106d057610272565b80633ccfd60b116101e857806358891a37116101ac57806358891a371461053057806360d938dc1461054c5780636352211e146105775780636673c4c2146105b45780636816521a146105d05780636817c76c146105fb57610272565b80633ccfd60b1461047357806342842e0e1461048a5780634a994eef146104b35780635503a0e8146104dc57806355f804b31461050757610272565b806314bf9af61161023a57806314bf9af61461038257806318160ddd1461039e5780631e84c413146103c957806323b872dd146103f45780632eb4a7ab1461041d5780632f3346521461044857610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613281565b610a23565b6040516102ab91906132c9565b60405180910390f35b3480156102c057600080fd5b506102c9610ab5565b6040516102d69190613374565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906133f4565b610b47565b60405161031391906132c9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613457565b610ba5565b6040516103509190613493565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134ae565b610c24565b005b61039c6004803603810190610397919061366c565b610d68565b005b3480156103aa57600080fd5b506103b36110cb565b6040516103c091906136ea565b60405180910390f35b3480156103d557600080fd5b506103de6110e2565b6040516103eb91906132c9565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613705565b6110f5565b005b34801561042957600080fd5b50610432611417565b60405161043f9190613767565b60405180910390f35b34801561045457600080fd5b5061045d61141d565b60405161046a91906132c9565b60405180910390f35b34801561047f57600080fd5b50610488611430565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613705565b611595565b005b3480156104bf57600080fd5b506104da60048036038101906104d591906137ae565b6115b5565b005b3480156104e857600080fd5b506104f1611618565b6040516104fe9190613374565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613849565b6116a6565b005b61054a600480360381019061054591906134ae565b611789565b005b34801561055857600080fd5b5061056161199b565b60405161056e91906132c9565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613457565b6119ae565b6040516105ab9190613493565b60405180910390f35b6105ce60048036038101906105c99190613942565b6119c0565b005b3480156105dc57600080fd5b506105e5611bc2565b6040516105f291906136ea565b60405180910390f35b34801561060757600080fd5b50610610611bc8565b60405161061d91906136ea565b60405180910390f35b34801561063257600080fd5b5061063b611bce565b6040516106489190613374565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906133f4565b611c5c565b60405161068591906136ea565b60405180910390f35b34801561069a57600080fd5b506106a3611d14565b005b3480156106b157600080fd5b506106ba611d28565b6040516106c79190613493565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906139c3565b611d4e565b005b34801561070557600080fd5b50610720600480360381019061071b91906133f4565b611d60565b60405161072d91906136ea565b60405180910390f35b34801561074257600080fd5b5061074b611d78565b6040516107589190613493565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906133f4565b611da1565b005b34801561079657600080fd5b5061079f611e79565b6040516107ac9190613374565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906137ae565b611f0b565b005b3480156107ea57600080fd5b50610805600480360381019061080091906139f0565b612082565b60405161081291906132c9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613a5f565b6120e8565b005b34801561085057600080fd5b5061086b60048036038101906108669190613b54565b612196565b005b34801561087957600080fd5b50610894600480360381019061088f9190613bd7565b612209565b005b3480156108a257600080fd5b506108ab6122d5565b6040516108b891906136ea565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613457565b6122db565b6040516108f59190613374565b60405180910390f35b34801561090a57600080fd5b5061091361235a565b60405161092091906136ea565b60405180910390f35b34801561093557600080fd5b5061093e61237e565b60405161094b91906136ea565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190613c17565b612384565b60405161098891906132c9565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b391906133f4565b612418565b005b3480156109c657600080fd5b506109e160048036038101906109dc9190613457565b612483565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613457565b612521565b005b348015610a1857600080fd5b50610a216125bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aae5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac490613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613c86565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b516126cc565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb08261274a565b610be6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826119ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610c506127a9565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c776127a9565b612384565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d706127b1565b600b5481610d84610d7f6127fe565b612806565b610d8e9190613ce6565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690613d66565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610df96110cb565b610e039190613ce6565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613dd2565b60405180910390fd5b60125481610e529190613df2565b3414610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613e98565b60405180910390fd5b601060019054906101000a900460ff1615610efc57601060019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f04565b60405180910390fd5b6110ad565b601060009054906101000a900460ff161561107157610f23610f1c6127fe565b8484612082565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990613f70565b60405180910390fd5b818160156000610f706127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb59190613ce6565b1115610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90614002565b60405180910390fd5b80601360008282546110089190613ce6565b92505081905550806015600061101c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110659190613ce6565b925050819055506110ac565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061406e565b60405180910390fd5b5b6110be6110b86127fe565b8261285d565b6110c661287b565b505050565b60006110d5612885565b6004546003540303905090565b601060019054906101000a900460ff1681565b60006111008261288e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611167576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111738461295a565b9150915061118981876111846127a9565b612981565b6111d55761119e866111996127a9565b612384565b6111d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361123b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61124886868660016129c5565b801561125357600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611321856112fd8888876129cb565b7c0200000000000000000000000000000000000000000000000000000000176129f3565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113a757600060018501905060006007600083815260200190815260200160002054036113a55760035481146113a4578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461140f8686866001612a1e565b505050505050565b60115481565b600d60009054906101000a900460ff1681565b6114386126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906140da565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161150c9061412b565b60006040518083038185875af1925050503d8060008114611549576040519150601f19603f3d011682016040523d82523d6000602084013e61154e565b606091505b5050905080611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061418c565b60405180910390fd5b50565b6115b083838360405180602001604052806000815250612196565b505050565b6115bd6126cc565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f805461162590613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461165190613c86565b801561169e5780601f106116735761010080835404028352916020019161169e565b820191906000526020600020905b81548152906001019060200180831161168157829003601f168201915b505050505081565b6116ae6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906140da565b60405180910390fd5b8181600e918261174b929190614363565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161177d929190614460565b60405180910390a15050565b6117916127b1565b601060019054906101000a900460ff166117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613f04565b60405180910390fd5b601254816117ee9190613df2565b341461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613e98565b60405180910390fd5b600b548161184361183e6127fe565b612806565b61184d9190613ce6565b111561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590613d66565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118b86110cb565b6118c29190613ce6565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613dd2565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c906144f6565b60405180910390fd5b61198f828261285d565b61199761287b565b5050565b601060009054906101000a900460ff1681565b60006119b98261288e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906140da565b60405180910390fd5b818190508484905014611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90614562565b60405180910390fd5b6000805b85859050811015611adb57858582818110611ab657611ab5614582565b5b9050602002013582611ac89190613ce6565b915080611ad4906145b1565b9050611a98565b507f000000000000000000000000000000000000000000000000000000000000000081611b066110cb565b611b109190613ce6565b1115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613dd2565b60405180910390fd5b60005b85859050811015611bba57611ba9848483818110611b7557611b74614582565b5b9050602002016020810190611b8a91906133f4565b878784818110611b9d57611b9c614582565b5b9050602002013561285d565b80611bb3906145b1565b9050611b54565b505050505050565b600c5481565b60125481565b600e8054611bdb90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0790613c86565b8015611c545780601f10611c2957610100808354040283529160200191611c54565b820191906000526020600020905b815481529060010190602001808311611c3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d1c6126cc565b611d266000612a24565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d566126cc565b8060118190555050565b60156020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611da96126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140da565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060068054611e8890613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb490613c86565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b611f136127a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f846127a9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120316127a9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161207691906132c9565b60405180910390a35050565b60006120df83601154868560405160200161209e929190614662565b604051602081830303815290604052805190602001206040516020016120c491906146af565b60405160208183030381529060405280519060200120612ae8565b90509392505050565b6120f06126cc565b6040518060200160405280612103611d78565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000612184836119ae565b90506121918183856110f5565b505050565b6121a18484846110f5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612203576121cc84848484612aff565b612202576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6122116126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906140da565b60405180910390fd5b81601060006101000a81548160ff02191690831515021790555080601060016101000a81548160ff0219169083151502179055505050565b600b5481565b60606122e68261274a565b612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614716565b60405180910390fd5b600e61233083612c4f565b600f604051602001612344939291906147f5565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60135481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124206126cc565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061248081612d1d565b50565b61248b6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906140da565b60405180910390fd5b8060128190555050565b6125296126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906140da565b60405180910390fd5b80600b8190555050565b6125c76126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906140da565b60405180910390fd5b600d60009054906101000a900460ff16156126a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269a90614872565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055506126ca33600c5461285d565b565b6126d46127fe565b73ffffffffffffffffffffffffffffffffffffffff166126f2611d78565b73ffffffffffffffffffffffffffffffffffffffff1614612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906148de565b60405180910390fd5b565b600081612755612885565b11158015612764575060035482105b80156127a2575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60028054036127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec9061494a565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612877828260405180602001604052806000815250612da0565b5050565b6001600281905550565b60006001905090565b6000808290508061289d612885565b11612923576003548110156129225760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612920575b600081036129165760076000836001900393508381526020019081526020016000205490506128ec565b8092505050612955565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129e2868684612e3e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612af58584612e47565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b256127a9565b8786866040518563ffffffff1660e01b8152600401612b4794939291906149bf565b6020604051808303816000875af1925050508015612b8357506040513d601f19601f82011682018060405250810190612b809190614a20565b60015b612bfc573d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b506000815103612bf4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612c5e84612e9d565b01905060008167ffffffffffffffff811115612c7d57612c7c6134f3565b5b6040519080825280601f01601f191660200182016040528015612caf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d12578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d0657612d05614a4d565b5b04945060008503612cbd575b819350505050919050565b612d256126cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b90614aee565b60405180910390fd5b612d9d81612a24565b50565b612daa8383612ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e395760006003549050600083820390505b612deb6000868380600101945086612aff565b612e21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd8578160035414612e3657600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612e9257612e7d82868381518110612e7057612e6f614582565b5b60200260200101516131c3565b91508080612e8a906145b1565b915050612e50565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612efb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ef157612ef0614a4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f38576d04ee2d6d415b85acef81000000008381612f2e57612f2d614a4d565b5b0492506020810190505b662386f26fc100008310612f6757662386f26fc100008381612f5d57612f5c614a4d565b5b0492506010810190505b6305f5e1008310612f90576305f5e1008381612f8657612f85614a4d565b5b0492506008810190505b6127108310612fb5576127108381612fab57612faa614a4d565b5b0492506004810190505b60648310612fd85760648381612fce57612fcd614a4d565b5b0492506002810190505b600a8310612fe7576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361305d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613097576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130a460008483856129c5565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311b8361310c60008660006129cb565b613115856131ee565b176129f3565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313f578060038190555050506131be6000848385612a1e565b505050565b60008183106131db576131d682846131fe565b6131e6565b6131e583836131fe565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325e81613229565b811461326957600080fd5b50565b60008135905061327b81613255565b92915050565b6000602082840312156132975761329661321f565b5b60006132a58482850161326c565b91505092915050565b60008115159050919050565b6132c3816132ae565b82525050565b60006020820190506132de60008301846132ba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331e578082015181840152602081019050613303565b60008484015250505050565b6000601f19601f8301169050919050565b6000613346826132e4565b61335081856132ef565b9350613360818560208601613300565b6133698161332a565b840191505092915050565b6000602082019050818103600083015261338e818461333b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c182613396565b9050919050565b6133d1816133b6565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a5761340961321f565b5b6000613418848285016133df565b91505092915050565b6000819050919050565b61343481613421565b811461343f57600080fd5b50565b6000813590506134518161342b565b92915050565b60006020828403121561346d5761346c61321f565b5b600061347b84828501613442565b91505092915050565b61348d816133b6565b82525050565b60006020820190506134a86000830184613484565b92915050565b600080604083850312156134c5576134c461321f565b5b60006134d3858286016133df565b92505060206134e485828601613442565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b8261332a565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613215565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135b28161359f565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b60006135e86135e38461356e565b613553565b9050808382526020820190506020840283018581111561360b5761360a61359a565b5b835b81811015613634578061362088826135c0565b84526020840193505060208101905061360d565b5050509392505050565b600082601f830112613653576136526134ee565b5b81356136638482602086016135d5565b91505092915050565b6000806000606084860312156136855761368461321f565b5b600084013567ffffffffffffffff8111156136a3576136a2613224565b5b6136af8682870161363e565b93505060206136c086828701613442565b92505060406136d186828701613442565b9150509250925092565b6136e481613421565b82525050565b60006020820190506136ff60008301846136db565b92915050565b60008060006060848603121561371e5761371d61321f565b5b600061372c868287016133df565b935050602061373d868287016133df565b925050604061374e86828701613442565b9150509250925092565b6137618161359f565b82525050565b600060208201905061377c6000830184613758565b92915050565b61378b816132ae565b811461379657600080fd5b50565b6000813590506137a881613782565b92915050565b600080604083850312156137c5576137c461321f565b5b60006137d3858286016133df565b92505060206137e485828601613799565b9150509250929050565b600080fd5b60008083601f840112613809576138086134ee565b5b8235905067ffffffffffffffff811115613826576138256137ee565b5b6020830191508360018202830111156138425761384161359a565b5b9250929050565b600080602083850312156138605761385f61321f565b5b600083013567ffffffffffffffff81111561387e5761387d613224565b5b61388a858286016137f3565b92509250509250929050565b60008083601f8401126138ac576138ab6134ee565b5b8235905067ffffffffffffffff8111156138c9576138c86137ee565b5b6020830191508360208202830111156138e5576138e461359a565b5b9250929050565b60008083601f840112613902576139016134ee565b5b8235905067ffffffffffffffff81111561391f5761391e6137ee565b5b60208301915083602082028301111561393b5761393a61359a565b5b9250929050565b6000806000806040858703121561395c5761395b61321f565b5b600085013567ffffffffffffffff81111561397a57613979613224565b5b61398687828801613896565b9450945050602085013567ffffffffffffffff8111156139a9576139a8613224565b5b6139b5878288016138ec565b925092505092959194509250565b6000602082840312156139d9576139d861321f565b5b60006139e7848285016135c0565b91505092915050565b600080600060608486031215613a0957613a0861321f565b5b6000613a17868287016133df565b935050602084013567ffffffffffffffff811115613a3857613a37613224565b5b613a448682870161363e565b9250506040613a5586828701613442565b9150509250925092565b60008060408385031215613a7657613a7561321f565b5b6000613a8485828601613442565b9250506020613a95858286016133df565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613abf57613abe6134f3565b5b613ac88261332a565b9050602081019050919050565b82818337600083830152505050565b6000613af7613af284613aa4565b613553565b905082815260208101848484011115613b1357613b12613a9f565b5b613b1e848285613ad5565b509392505050565b600082601f830112613b3b57613b3a6134ee565b5b8135613b4b848260208601613ae4565b91505092915050565b60008060008060808587031215613b6e57613b6d61321f565b5b6000613b7c878288016133df565b9450506020613b8d878288016133df565b9350506040613b9e87828801613442565b925050606085013567ffffffffffffffff811115613bbf57613bbe613224565b5b613bcb87828801613b26565b91505092959194509250565b60008060408385031215613bee57613bed61321f565b5b6000613bfc85828601613799565b9250506020613c0d85828601613799565b9150509250929050565b60008060408385031215613c2e57613c2d61321f565b5b6000613c3c858286016133df565b9250506020613c4d858286016133df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9e57607f821691505b602082108103613cb157613cb0613c57565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cf182613421565b9150613cfc83613421565b9250828201905080821115613d1457613d13613cb7565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613d50600e836132ef565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613dbc600a836132ef565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b6000613dfd82613421565b9150613e0883613421565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4157613e40613cb7565b5b828202905092915050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000613e82600c836132ef565b9150613e8d82613e4c565b602082019050919050565b60006020820190508181036000830152613eb181613e75565b9050919050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b6000613eee601e836132ef565b9150613ef982613eb8565b602082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613f5a600f836132ef565b9150613f6582613f24565b602082019050919050565b60006020820190508181036000830152613f8981613f4d565b9050919050565b7f41756374696f6e206973206f7665722c20616c6c20746f6b656e7320636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b6000613fec6023836132ef565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b7f61756374696f6e206e6f74206163746976650000000000000000000000000000600082015250565b60006140586012836132ef565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b60006140c46010836132ef565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b600081905092915050565b50565b60006141156000836140fa565b915061412082614105565b600082019050919050565b600061413682614108565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614176600f836132ef565b915061418182614140565b602082019050919050565b600060208201905081810360008301526141a581614169565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826141dc565b61422386836141dc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061426061425b61425684613421565b61423b565b613421565b9050919050565b6000819050919050565b61427a83614245565b61428e61428682614267565b8484546141e9565b825550505050565b600090565b6142a3614296565b6142ae818484614271565b505050565b5b818110156142d2576142c760008261429b565b6001810190506142b4565b5050565b601f821115614317576142e8816141b7565b6142f1846141cc565b81016020851015614300578190505b61431461430c856141cc565b8301826142b3565b50505b505050565b600082821c905092915050565b600061433a6000198460080261431c565b1980831691505092915050565b60006143538383614329565b9150826002028217905092915050565b61436d83836141ac565b67ffffffffffffffff811115614386576143856134f3565b5b6143908254613c86565b61439b8282856142d6565b6000601f8311600181146143ca57600084156143b8578287013590505b6143c28582614347565b86555061442a565b601f1984166143d8866141b7565b60005b82811015614400578489013582556001820191506020850194506020810190506143db565b8683101561441d5784890135614419601f891682614329565b8355505b6001600288020188555050505b50505050505050565b600061443f83856132ef565b935061444c838584613ad5565b6144558361332a565b840190509392505050565b6000602082019050818103600083015261447b818486614433565b90509392505050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e06024836132ef565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b600061454c6020836132ef565b915061455782614516565b602082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145bc82613421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ee576145ed613cb7565b5b600182019050919050565b60008160601b9050919050565b6000614611826145f9565b9050919050565b600061462382614606565b9050919050565b61463b614636826133b6565b614618565b82525050565b6000819050919050565b61465c61465782613421565b614641565b82525050565b600061466e828561462a565b60148201915061467e828461464b565b6020820191508190509392505050565b6000819050919050565b6146a96146a48261359f565b61468e565b82525050565b60006146bb8284614698565b60208201915081905092915050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147006013836132ef565b915061470b826146ca565b602082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b600081905092915050565b6000815461474e81613c86565b6147588186614736565b945060018216600081146147735760018114614788576147bb565b60ff19831686528115158202860193506147bb565b614791856141b7565b60005b838110156147b357815481890152600182019150602081019050614794565b838801955050505b50505092915050565b60006147cf826132e4565b6147d98185614736565b93506147e9818560208601613300565b80840191505092915050565b60006148018286614741565b915061480d82856147c4565b91506148198284614741565b9150819050949350505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061485c600f836132ef565b915061486782614826565b602082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148c86020836132ef565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614934601f836132ef565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149918261496a565b61499b8185614975565b93506149ab818560208601613300565b6149b48161332a565b840191505092915050565b60006080820190506149d46000830187613484565b6149e16020830186613484565b6149ee60408301856136db565b8181036060830152614a008184614986565b905095945050505050565b600081519050614a1a81613255565b92915050565b600060208284031215614a3657614a3561321f565b5b6000614a4484828501614a0b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ad86026836132ef565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b905091905056fea2646970667358221220f7c3ed133b2428d9713bad50e192bd0404c59e25878013b9a99d64931f46a59b64736f6c63430008100033
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636c0360eb1161014f578063a923625c116100c1578063e78b9d0b1161007a578063e78b9d0b14610929578063e985e9c514610954578063f2fde38b14610991578063f4a0a528146109ba578063f760f228146109e3578063ff45f00f14610a0c57610272565b8063a923625c1461081b578063b88d4fde14610844578063bfb396971461086d578063c7c2aee314610896578063c87b56dd146108c1578063d5abeb01146108fe57610272565b806385a8c9371161011357806385a8c937146106f95780638da5cb5b1461073657806391d6fc281461076157806395d89b411461078a578063a22cb465146107b5578063a371a062146107de57610272565b80636c0360eb1461062657806370a0823114610651578063715018a61461068e5780637b103999146106a55780637cb64759146106d057610272565b80633ccfd60b116101e857806358891a37116101ac57806358891a371461053057806360d938dc1461054c5780636352211e146105775780636673c4c2146105b45780636816521a146105d05780636817c76c146105fb57610272565b80633ccfd60b1461047357806342842e0e1461048a5780634a994eef146104b35780635503a0e8146104dc57806355f804b31461050757610272565b806314bf9af61161023a57806314bf9af61461038257806318160ddd1461039e5780631e84c413146103c957806323b872dd146103f45780632eb4a7ab1461041d5780632f3346521461044857610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c578063095ea7b314610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613281565b610a23565b6040516102ab91906132c9565b60405180910390f35b3480156102c057600080fd5b506102c9610ab5565b6040516102d69190613374565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906133f4565b610b47565b60405161031391906132c9565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613457565b610ba5565b6040516103509190613493565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134ae565b610c24565b005b61039c6004803603810190610397919061366c565b610d68565b005b3480156103aa57600080fd5b506103b36110cb565b6040516103c091906136ea565b60405180910390f35b3480156103d557600080fd5b506103de6110e2565b6040516103eb91906132c9565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613705565b6110f5565b005b34801561042957600080fd5b50610432611417565b60405161043f9190613767565b60405180910390f35b34801561045457600080fd5b5061045d61141d565b60405161046a91906132c9565b60405180910390f35b34801561047f57600080fd5b50610488611430565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613705565b611595565b005b3480156104bf57600080fd5b506104da60048036038101906104d591906137ae565b6115b5565b005b3480156104e857600080fd5b506104f1611618565b6040516104fe9190613374565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613849565b6116a6565b005b61054a600480360381019061054591906134ae565b611789565b005b34801561055857600080fd5b5061056161199b565b60405161056e91906132c9565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613457565b6119ae565b6040516105ab9190613493565b60405180910390f35b6105ce60048036038101906105c99190613942565b6119c0565b005b3480156105dc57600080fd5b506105e5611bc2565b6040516105f291906136ea565b60405180910390f35b34801561060757600080fd5b50610610611bc8565b60405161061d91906136ea565b60405180910390f35b34801561063257600080fd5b5061063b611bce565b6040516106489190613374565b60405180910390f35b34801561065d57600080fd5b50610678600480360381019061067391906133f4565b611c5c565b60405161068591906136ea565b60405180910390f35b34801561069a57600080fd5b506106a3611d14565b005b3480156106b157600080fd5b506106ba611d28565b6040516106c79190613493565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906139c3565b611d4e565b005b34801561070557600080fd5b50610720600480360381019061071b91906133f4565b611d60565b60405161072d91906136ea565b60405180910390f35b34801561074257600080fd5b5061074b611d78565b6040516107589190613493565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906133f4565b611da1565b005b34801561079657600080fd5b5061079f611e79565b6040516107ac9190613374565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906137ae565b611f0b565b005b3480156107ea57600080fd5b50610805600480360381019061080091906139f0565b612082565b60405161081291906132c9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613a5f565b6120e8565b005b34801561085057600080fd5b5061086b60048036038101906108669190613b54565b612196565b005b34801561087957600080fd5b50610894600480360381019061088f9190613bd7565b612209565b005b3480156108a257600080fd5b506108ab6122d5565b6040516108b891906136ea565b60405180910390f35b3480156108cd57600080fd5b506108e860048036038101906108e39190613457565b6122db565b6040516108f59190613374565b60405180910390f35b34801561090a57600080fd5b5061091361235a565b60405161092091906136ea565b60405180910390f35b34801561093557600080fd5b5061093e61237e565b60405161094b91906136ea565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190613c17565b612384565b60405161098891906132c9565b60405180910390f35b34801561099d57600080fd5b506109b860048036038101906109b391906133f4565b612418565b005b3480156109c657600080fd5b506109e160048036038101906109dc9190613457565b612483565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613457565b612521565b005b348015610a1857600080fd5b50610a216125bf565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aae5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac490613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054610af090613c86565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b516126cc565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb08261274a565b610be6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826119ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610c506127a9565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c776127a9565b612384565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d706127b1565b600b5481610d84610d7f6127fe565b612806565b610d8e9190613ce6565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690613d66565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000030981610df96110cb565b610e039190613ce6565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613dd2565b60405180910390fd5b60125481610e529190613df2565b3414610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613e98565b60405180910390fd5b601060019054906101000a900460ff1615610efc57601060019054906101000a900460ff16610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f04565b60405180910390fd5b6110ad565b601060009054906101000a900460ff161561107157610f23610f1c6127fe565b8484612082565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990613f70565b60405180910390fd5b818160156000610f706127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb59190613ce6565b1115610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90614002565b60405180910390fd5b80601360008282546110089190613ce6565b92505081905550806015600061101c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110659190613ce6565b925050819055506110ac565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061406e565b60405180910390fd5b5b6110be6110b86127fe565b8261285d565b6110c661287b565b505050565b60006110d5612885565b6004546003540303905090565b601060019054906101000a900460ff1681565b60006111008261288e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611167576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111738461295a565b9150915061118981876111846127a9565b612981565b6111d55761119e866111996127a9565b612384565b6111d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361123b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61124886868660016129c5565b801561125357600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611321856112fd8888876129cb565b7c0200000000000000000000000000000000000000000000000000000000176129f3565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036113a757600060018501905060006007600083815260200190815260200160002054036113a55760035481146113a4578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461140f8686866001612a1e565b505050505050565b60115481565b600d60009054906101000a900460ff1681565b6114386126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906140da565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161150c9061412b565b60006040518083038185875af1925050503d8060008114611549576040519150601f19603f3d011682016040523d82523d6000602084013e61154e565b606091505b5050905080611592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115899061418c565b60405180910390fd5b50565b6115b083838360405180602001604052806000815250612196565b505050565b6115bd6126cc565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600f805461162590613c86565b80601f016020809104026020016040519081016040528092919081815260200182805461165190613c86565b801561169e5780601f106116735761010080835404028352916020019161169e565b820191906000526020600020905b81548152906001019060200180831161168157829003601f168201915b505050505081565b6116ae6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906140da565b60405180910390fd5b8181600e918261174b929190614363565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161177d929190614460565b60405180910390a15050565b6117916127b1565b601060019054906101000a900460ff166117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613f04565b60405180910390fd5b601254816117ee9190613df2565b341461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690613e98565b60405180910390fd5b600b548161184361183e6127fe565b612806565b61184d9190613ce6565b111561188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590613d66565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000309816118b86110cb565b6118c29190613ce6565b1115611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613dd2565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c906144f6565b60405180910390fd5b61198f828261285d565b61199761287b565b5050565b601060009054906101000a900460ff1681565b60006119b98261288e565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906140da565b60405180910390fd5b818190508484905014611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90614562565b60405180910390fd5b6000805b85859050811015611adb57858582818110611ab657611ab5614582565b5b9050602002013582611ac89190613ce6565b915080611ad4906145b1565b9050611a98565b507f000000000000000000000000000000000000000000000000000000000000030981611b066110cb565b611b109190613ce6565b1115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613dd2565b60405180910390fd5b60005b85859050811015611bba57611ba9848483818110611b7557611b74614582565b5b9050602002016020810190611b8a91906133f4565b878784818110611b9d57611b9c614582565b5b9050602002013561285d565b80611bb3906145b1565b9050611b54565b505050505050565b600c5481565b60125481565b600e8054611bdb90613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0790613c86565b8015611c545780601f10611c2957610100808354040283529160200191611c54565b820191906000526020600020905b815481529060010190602001808311611c3757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d1c6126cc565b611d266000612a24565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d566126cc565b8060118190555050565b60156020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611da96126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140da565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060068054611e8890613c86565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb490613c86565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b611f136127a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f77576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f846127a9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120316127a9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161207691906132c9565b60405180910390a35050565b60006120df83601154868560405160200161209e929190614662565b604051602081830303815290604052805190602001206040516020016120c491906146af565b60405160208183030381529060405280519060200120612ae8565b90509392505050565b6120f06126cc565b6040518060200160405280612103611d78565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506000612184836119ae565b90506121918183856110f5565b505050565b6121a18484846110f5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612203576121cc84848484612aff565b612202576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6122116126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906140da565b60405180910390fd5b81601060006101000a81548160ff02191690831515021790555080601060016101000a81548160ff0219169083151502179055505050565b600b5481565b60606122e68261274a565b612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614716565b60405180910390fd5b600e61233083612c4f565b600f604051602001612344939291906147f5565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000030981565b60135481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124206126cc565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061248081612d1d565b50565b61248b6126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906140da565b60405180910390fd5b8060128190555050565b6125296126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906140da565b60405180910390fd5b80600b8190555050565b6125c76126cc565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906140da565b60405180910390fd5b600d60009054906101000a900460ff16156126a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269a90614872565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055506126ca33600c5461285d565b565b6126d46127fe565b73ffffffffffffffffffffffffffffffffffffffff166126f2611d78565b73ffffffffffffffffffffffffffffffffffffffff1614612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906148de565b60405180910390fd5b565b600081612755612885565b11158015612764575060035482105b80156127a2575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60028054036127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec9061494a565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612877828260405180602001604052806000815250612da0565b5050565b6001600281905550565b60006001905090565b6000808290508061289d612885565b11612923576003548110156129225760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612920575b600081036129165760076000836001900393508381526020019081526020016000205490506128ec565b8092505050612955565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129e2868684612e3e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612af58584612e47565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b256127a9565b8786866040518563ffffffff1660e01b8152600401612b4794939291906149bf565b6020604051808303816000875af1925050508015612b8357506040513d601f19601f82011682018060405250810190612b809190614a20565b60015b612bfc573d8060008114612bb3576040519150601f19603f3d011682016040523d82523d6000602084013e612bb8565b606091505b506000815103612bf4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612c5e84612e9d565b01905060008167ffffffffffffffff811115612c7d57612c7c6134f3565b5b6040519080825280601f01601f191660200182016040528015612caf5781602001600182028036833780820191505090505b509050600082602001820190505b600115612d12578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612d0657612d05614a4d565b5b04945060008503612cbd575b819350505050919050565b612d256126cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b90614aee565b60405180910390fd5b612d9d81612a24565b50565b612daa8383612ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e395760006003549050600083820390505b612deb6000868380600101945086612aff565b612e21576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd8578160035414612e3657600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015612e9257612e7d82868381518110612e7057612e6f614582565b5b60200260200101516131c3565b91508080612e8a906145b1565b915050612e50565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612efb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ef157612ef0614a4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f38576d04ee2d6d415b85acef81000000008381612f2e57612f2d614a4d565b5b0492506020810190505b662386f26fc100008310612f6757662386f26fc100008381612f5d57612f5c614a4d565b5b0492506010810190505b6305f5e1008310612f90576305f5e1008381612f8657612f85614a4d565b5b0492506008810190505b6127108310612fb5576127108381612fab57612faa614a4d565b5b0492506004810190505b60648310612fd85760648381612fce57612fcd614a4d565b5b0492506002810190505b600a8310612fe7576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361305d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613097576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130a460008483856129c5565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311b8361310c60008660006129cb565b613115856131ee565b176129f3565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313f578060038190555050506131be6000848385612a1e565b505050565b60008183106131db576131d682846131fe565b6131e6565b6131e583836131fe565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325e81613229565b811461326957600080fd5b50565b60008135905061327b81613255565b92915050565b6000602082840312156132975761329661321f565b5b60006132a58482850161326c565b91505092915050565b60008115159050919050565b6132c3816132ae565b82525050565b60006020820190506132de60008301846132ba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331e578082015181840152602081019050613303565b60008484015250505050565b6000601f19601f8301169050919050565b6000613346826132e4565b61335081856132ef565b9350613360818560208601613300565b6133698161332a565b840191505092915050565b6000602082019050818103600083015261338e818461333b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c182613396565b9050919050565b6133d1816133b6565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a5761340961321f565b5b6000613418848285016133df565b91505092915050565b6000819050919050565b61343481613421565b811461343f57600080fd5b50565b6000813590506134518161342b565b92915050565b60006020828403121561346d5761346c61321f565b5b600061347b84828501613442565b91505092915050565b61348d816133b6565b82525050565b60006020820190506134a86000830184613484565b92915050565b600080604083850312156134c5576134c461321f565b5b60006134d3858286016133df565b92505060206134e485828601613442565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b8261332a565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613215565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135b28161359f565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b60006135e86135e38461356e565b613553565b9050808382526020820190506020840283018581111561360b5761360a61359a565b5b835b81811015613634578061362088826135c0565b84526020840193505060208101905061360d565b5050509392505050565b600082601f830112613653576136526134ee565b5b81356136638482602086016135d5565b91505092915050565b6000806000606084860312156136855761368461321f565b5b600084013567ffffffffffffffff8111156136a3576136a2613224565b5b6136af8682870161363e565b93505060206136c086828701613442565b92505060406136d186828701613442565b9150509250925092565b6136e481613421565b82525050565b60006020820190506136ff60008301846136db565b92915050565b60008060006060848603121561371e5761371d61321f565b5b600061372c868287016133df565b935050602061373d868287016133df565b925050604061374e86828701613442565b9150509250925092565b6137618161359f565b82525050565b600060208201905061377c6000830184613758565b92915050565b61378b816132ae565b811461379657600080fd5b50565b6000813590506137a881613782565b92915050565b600080604083850312156137c5576137c461321f565b5b60006137d3858286016133df565b92505060206137e485828601613799565b9150509250929050565b600080fd5b60008083601f840112613809576138086134ee565b5b8235905067ffffffffffffffff811115613826576138256137ee565b5b6020830191508360018202830111156138425761384161359a565b5b9250929050565b600080602083850312156138605761385f61321f565b5b600083013567ffffffffffffffff81111561387e5761387d613224565b5b61388a858286016137f3565b92509250509250929050565b60008083601f8401126138ac576138ab6134ee565b5b8235905067ffffffffffffffff8111156138c9576138c86137ee565b5b6020830191508360208202830111156138e5576138e461359a565b5b9250929050565b60008083601f840112613902576139016134ee565b5b8235905067ffffffffffffffff81111561391f5761391e6137ee565b5b60208301915083602082028301111561393b5761393a61359a565b5b9250929050565b6000806000806040858703121561395c5761395b61321f565b5b600085013567ffffffffffffffff81111561397a57613979613224565b5b61398687828801613896565b9450945050602085013567ffffffffffffffff8111156139a9576139a8613224565b5b6139b5878288016138ec565b925092505092959194509250565b6000602082840312156139d9576139d861321f565b5b60006139e7848285016135c0565b91505092915050565b600080600060608486031215613a0957613a0861321f565b5b6000613a17868287016133df565b935050602084013567ffffffffffffffff811115613a3857613a37613224565b5b613a448682870161363e565b9250506040613a5586828701613442565b9150509250925092565b60008060408385031215613a7657613a7561321f565b5b6000613a8485828601613442565b9250506020613a95858286016133df565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613abf57613abe6134f3565b5b613ac88261332a565b9050602081019050919050565b82818337600083830152505050565b6000613af7613af284613aa4565b613553565b905082815260208101848484011115613b1357613b12613a9f565b5b613b1e848285613ad5565b509392505050565b600082601f830112613b3b57613b3a6134ee565b5b8135613b4b848260208601613ae4565b91505092915050565b60008060008060808587031215613b6e57613b6d61321f565b5b6000613b7c878288016133df565b9450506020613b8d878288016133df565b9350506040613b9e87828801613442565b925050606085013567ffffffffffffffff811115613bbf57613bbe613224565b5b613bcb87828801613b26565b91505092959194509250565b60008060408385031215613bee57613bed61321f565b5b6000613bfc85828601613799565b9250506020613c0d85828601613799565b9150509250929050565b60008060408385031215613c2e57613c2d61321f565b5b6000613c3c858286016133df565b9250506020613c4d858286016133df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9e57607f821691505b602082108103613cb157613cb0613c57565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cf182613421565b9150613cfc83613421565b9250828201905080821115613d1457613d13613cb7565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b6000613d50600e836132ef565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000613dbc600a836132ef565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b6000613dfd82613421565b9150613e0883613421565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4157613e40613cb7565b5b828202905092915050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000613e82600c836132ef565b9150613e8d82613e4c565b602082019050919050565b60006020820190508181036000830152613eb181613e75565b9050919050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b6000613eee601e836132ef565b9150613ef982613eb8565b602082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613f5a600f836132ef565b9150613f6582613f24565b602082019050919050565b60006020820190508181036000830152613f8981613f4d565b9050919050565b7f41756374696f6e206973206f7665722c20616c6c20746f6b656e7320636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b6000613fec6023836132ef565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b7f61756374696f6e206e6f74206163746976650000000000000000000000000000600082015250565b60006140586012836132ef565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b60006140c46010836132ef565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b600081905092915050565b50565b60006141156000836140fa565b915061412082614105565b600082019050919050565b600061413682614108565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614176600f836132ef565b915061418182614140565b602082019050919050565b600060208201905081810360008301526141a581614169565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826141dc565b61422386836141dc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061426061425b61425684613421565b61423b565b613421565b9050919050565b6000819050919050565b61427a83614245565b61428e61428682614267565b8484546141e9565b825550505050565b600090565b6142a3614296565b6142ae818484614271565b505050565b5b818110156142d2576142c760008261429b565b6001810190506142b4565b5050565b601f821115614317576142e8816141b7565b6142f1846141cc565b81016020851015614300578190505b61431461430c856141cc565b8301826142b3565b50505b505050565b600082821c905092915050565b600061433a6000198460080261431c565b1980831691505092915050565b60006143538383614329565b9150826002028217905092915050565b61436d83836141ac565b67ffffffffffffffff811115614386576143856134f3565b5b6143908254613c86565b61439b8282856142d6565b6000601f8311600181146143ca57600084156143b8578287013590505b6143c28582614347565b86555061442a565b601f1984166143d8866141b7565b60005b82811015614400578489013582556001820191506020850194506020810190506143db565b8683101561441d5784890135614419601f891682614329565b8355505b6001600288020188555050505b50505050505050565b600061443f83856132ef565b935061444c838584613ad5565b6144558361332a565b840190509392505050565b6000602082019050818103600083015261447b818486614433565b90509392505050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e06024836132ef565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b600061454c6020836132ef565b915061455782614516565b602082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145bc82613421565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ee576145ed613cb7565b5b600182019050919050565b60008160601b9050919050565b6000614611826145f9565b9050919050565b600061462382614606565b9050919050565b61463b614636826133b6565b614618565b82525050565b6000819050919050565b61465c61465782613421565b614641565b82525050565b600061466e828561462a565b60148201915061467e828461464b565b6020820191508190509392505050565b6000819050919050565b6146a96146a48261359f565b61468e565b82525050565b60006146bb8284614698565b60208201915081905092915050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147006013836132ef565b915061470b826146ca565b602082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b600081905092915050565b6000815461474e81613c86565b6147588186614736565b945060018216600081146147735760018114614788576147bb565b60ff19831686528115158202860193506147bb565b614791856141b7565b60005b838110156147b357815481890152600182019150602081019050614794565b838801955050505b50505092915050565b60006147cf826132e4565b6147d98185614736565b93506147e9818560208601613300565b80840191505092915050565b60006148018286614741565b915061480d82856147c4565b91506148198284614741565b9150819050949350505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061485c600f836132ef565b915061486782614826565b602082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148c86020836132ef565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614934601f836132ef565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149918261496a565b61499b8185614975565b93506149ab818560208601613300565b6149b48161332a565b840191505092915050565b60006080820190506149d46000830187613484565b6149e16020830186613484565b6149ee60408301856136db565b8181036060830152614a008184614986565b905095945050505050565b600081519050614a1a81613255565b92915050565b600060208284031215614a3657614a3561321f565b5b6000614a4484828501614a0b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ad86026836132ef565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b905091905056fea2646970667358221220f7c3ed133b2428d9713bad50e192bd0404c59e25878013b9a99d64931f46a59b64736f6c63430008100033
Deployed Bytecode Sourcemap
207:5013:3:-: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;:::-;;2305:821:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5000:323:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:30:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:2800:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;597:25:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;426:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3766:183;;;;;;;;;;;;;:::i;:::-;;14553:185:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;459:112:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;488:33:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;978:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3134:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;530:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11470:152:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3957:457:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;387:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;629:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6649:232:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:7;;;;;;;;;;;;;:::i;:::-;;712:68:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1475:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;791:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3644:114:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11858:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13939:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1996:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4989:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14809:399:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1812:176:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;352:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1229:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;307:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;679:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;575:158:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1694:110:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1570:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4422:179;;;;;;;;;;;;;:::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:7;: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;2305:821:3:-;2296:21:8;:19;:21::i;:::-;2453:11:3::1;;2446:3;2416:27;2430:12;:10;:12::i;:::-;2416:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2408:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2521:9;2514:3;2498:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;2490:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2579:9;;2573:3;:15;;;;:::i;:::-;2560:9;:28;2552:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2618:18;;;;;;;;;;;2614:470;;;2657:18;;;;;;;;;;;2649:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2614:470;;;2733:15;;;;;;;;;;;2729:355;;;2767:41;2781:12;:10;:12::i;:::-;2795:5;2802;2767:13;:41::i;:::-;2759:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2892:5;2885:3;2845:23;:37;2869:12;:10;:12::i;:::-;2845:37;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:52;;2837:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;2963:3;2946:13;;:20;;;;;;;:::i;:::-;;;;;;;;3016:3;2975:23;:37;2999:12;:10;:12::i;:::-;2975:37;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;2729:355;;;3046:30;;;;;;;;;;:::i;:::-;;;;;;;;2729:355;2614:470;3092:28;3102:12;:10;:12::i;:::-;3116:3;3092:9;:28::i;:::-;2340:20:8::0;:18;:20::i;:::-;2305:821:3;;;:::o;5000:323:2:-;5061:7;5289:15;:13;:15::i;:::-;5274:12;;5258:13;;:28;:46;5251:53;;5000:323;:::o;562:30:3:-;;;;;;;;;;;;;:::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;597:25:3:-;;;;:::o;426:31::-;;;;;;;;;;;;;:::o;3766:183::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3827:12:3::2;3853:8;;;;;;;;;;;3845:22;;3875:21;3845:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3826:75;;;3916:7;3908:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3819:130;3766:183::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:7;:11;:13::i;:::-;555:11:1::1;536:10;:16;547:4;536:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;459:112:::0;;:::o;488:33:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;978:139::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1074:8:3::2;;1064:7;:18;;;;;;;:::i;:::-;;1094:17;1102:8;;1094:17;;;;;;;:::i;:::-;;;;;;;;978:139:::0;;:::o;3134:502::-;2296:21:8;:19;:21::i;:::-;3222:18:3::1;;;;;;;;;;;3214:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3309:9;;3303:3;:15;;;;:::i;:::-;3290:9;:28;3282:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3387:11;;3380:3;3350:27;3364:12;:10;:12::i;:::-;3350:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;3342:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3455:9;3448:3;3432:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3424:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:42;3494:56;;:10;:56;;;3486:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;3611:19;3621:3;3626;3611:9;:19::i;:::-;2340:20:8::0;:18;:20::i;:::-;3134:502:3;;:::o;530:27::-;;;;;;;;;;;;;:::o;11470:152:2:-;11542:7;11585:27;11604:7;11585:18;:27::i;:::-;11562:52;;11470:152;;;:::o;3957:457:3:-;202:10:1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4088:10:3::1;;:17;;4074:3;;:10;;:31;4066:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4150:13;4179:9:::0;4174:73:::1;4198:3;;:10;;4194:1;:14;4174:73;;;4233:3;;4237:1;4233:6;;;;;;;:::i;:::-;;;;;;;;4224:15;;;;;:::i;:::-;;;4210:3;;;;:::i;:::-;;;4174:73;;;;4286:9;4277:5;4261:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;4253:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4322:9;4317:92;4341:3;;:10;;4337:1;:14;4317:92;;;4367:32;4377:10;;4388:1;4377:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4392:3;;4396:1;4392:6;;;;;;;:::i;:::-;;;;;;;;4367:9;:32::i;:::-;4353:3;;;;:::i;:::-;;;4317:92;;;;4059:355;3957:457:::0;;;;:::o;387:34::-;;;;:::o;629:45::-;;;;:::o;462: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:7:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;712:68:3:-;;;;;;;;;;;;;:::o;1475:86::-;1122:13:7;:11;:13::i;:::-;1551:4:3::1;1538:10;:17;;;;1475:86:::0;:::o;791:58::-;;;;;;;;;;;;;;;;;:::o;1236:87:7:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;3644:114:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3743:9:3::2;3732:8;;:20;;;;;;;;;;;;;;;;;;3644:114:::0;:::o;11858:104:2:-;11914:13;11947:7;11940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11858:104;:::o;13939:308::-;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;1996:300:3:-;2116:4;2143:147;2172:5;2188:10;;2263:7;2272:5;2246:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2236:43;;;;;;2219:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;2209:72;;;;;;2143:18;:147::i;:::-;2129:161;;1996:300;;;;;:::o;4989:226::-;1122:13:7;:11;:13::i;:::-;5095:25:3::1;;;;;;;;5112:7;:5;:7::i;:::-;5095:25;;;;::::0;5068:15:::1;:24;5084:7;5068:24;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5127:12;5142:18;5151:7;5142;:18::i;:::-;5127:33;;5167:40;5181:4;5187:9;5198:7;5167:12;:40::i;:::-;5061:154;4989:226:::0;;:::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;1812:176:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:12:3::2;1913:15;;:30;;;;;;;;;;;;;;;;;;1971:11;1950:18;;:32;;;;;;;;;;;;;;;;;;1812:176:::0;;:::o;352:30::-;;;;:::o;1229:238::-;1303:13;1337:17;1345:8;1337:7;:17::i;:::-;1329:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1420:7;1429:19;:8;:17;:19::i;:::-;1450:9;1403:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1389:72;;1229:238;;;:::o;307:40::-;;;:::o;679: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:7;: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;1694:110:3:-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1788:10:3::2;1776:9;:22;;;;1694:110:::0;:::o;1570:116::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1668:12:3::2;1654:11;:26;;;;1570:116:::0;:::o;4422:179::-;1122:13:7;:11;:13::i;:::-;202:10:1::1;:22;213:10;202:22;;;;;;;;;;;;;;;;;;;;;;;;;194:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4494:11:3::2;;;;;;;;;;;4493:12;4484:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4547:4;4533:11;;:18;;;;;;;;;;;;;;;;;;4558:37;4568:10;4580:14;;4558:9;:37::i;:::-;4422:179::o:0;1401:132:7:-;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;2376:289:8:-;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;15828:112::-;15905:27;15915:2;15919:8;15905:27;;;;;;;;;;;;:9;:27::i;:::-;15828:112;;:::o;2673:213:8:-;1734:1;2856:7;:22;;;;2673:213::o;4516:92:2:-;4572:7;4599:1;4592:8;;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;2503:191:7:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;1179:190:6:-;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;427::9:-;483:13;534:14;571:1;551:17;562:5;551:10;:17::i;:::-;:21;534:38;;587:20;621:6;610:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:41;;643:11;772:6;768:2;764:15;756:6;752:28;745:35;;809:288;816:4;809:288;;;841:5;;;;;;;;983:8;978:2;971:5;967:14;962:30;957:3;949:44;1039:2;1030:11;;;;;;:::i;:::-;;;;;1073:1;1064:5;:10;809:288;1060:21;809:288;1118:6;1111:13;;;;;427:716;;;:::o;2142:201:7:-;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;16356:689:2:-;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;31922:147::-;32059:6;31922:147;;;;;:::o;2046:296:6:-;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;10146:922:5:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::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:6:-;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:6:-;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:117::-;5334:1;5331;5324:12;5348:180;5396:77;5393:1;5386:88;5493:4;5490:1;5483:15;5517:4;5514:1;5507:15;5534:281;5617:27;5639:4;5617:27;:::i;:::-;5609:6;5605:40;5747:6;5735:10;5732:22;5711:18;5699:10;5696:34;5693:62;5690:88;;;5758:18;;:::i;:::-;5690:88;5798:10;5794:2;5787:22;5577:238;5534:281;;:::o;5821:129::-;5855:6;5882:20;;:::i;:::-;5872:30;;5911:33;5939:4;5931:6;5911:33;:::i;:::-;5821:129;;;:::o;5956:311::-;6033:4;6123:18;6115:6;6112:30;6109:56;;;6145:18;;:::i;:::-;6109:56;6195:4;6187:6;6183:17;6175:25;;6255:4;6249;6245:15;6237:23;;5956:311;;;:::o;6273:117::-;6382:1;6379;6372:12;6396:77;6433:7;6462:5;6451:16;;6396:77;;;:::o;6479:122::-;6552:24;6570:5;6552:24;:::i;:::-;6545:5;6542:35;6532:63;;6591:1;6588;6581:12;6532:63;6479:122;:::o;6607:139::-;6653:5;6691:6;6678:20;6669:29;;6707:33;6734:5;6707:33;:::i;:::-;6607:139;;;;:::o;6769:710::-;6865:5;6890:81;6906:64;6963:6;6906:64;:::i;:::-;6890:81;:::i;:::-;6881:90;;6991:5;7020:6;7013:5;7006:21;7054:4;7047:5;7043:16;7036:23;;7107:4;7099:6;7095:17;7087:6;7083:30;7136:3;7128:6;7125:15;7122:122;;;7155:79;;:::i;:::-;7122:122;7270:6;7253:220;7287:6;7282:3;7279:15;7253:220;;;7362:3;7391:37;7424:3;7412:10;7391:37;:::i;:::-;7386:3;7379:50;7458:4;7453:3;7449:14;7442:21;;7329:144;7313:4;7308:3;7304:14;7297:21;;7253:220;;;7257:21;6871:608;;6769:710;;;;;:::o;7502:370::-;7573:5;7622:3;7615:4;7607:6;7603:17;7599:27;7589:122;;7630:79;;:::i;:::-;7589:122;7747:6;7734:20;7772:94;7862:3;7854:6;7847:4;7839:6;7835:17;7772:94;:::i;:::-;7763:103;;7579:293;7502:370;;;;:::o;7878:829::-;7980:6;7988;7996;8045:2;8033:9;8024:7;8020:23;8016:32;8013:119;;;8051:79;;:::i;:::-;8013:119;8199:1;8188:9;8184:17;8171:31;8229:18;8221:6;8218:30;8215:117;;;8251:79;;:::i;:::-;8215:117;8356:78;8426:7;8417:6;8406:9;8402:22;8356:78;:::i;:::-;8346:88;;8142:302;8483:2;8509:53;8554:7;8545:6;8534:9;8530:22;8509:53;:::i;:::-;8499:63;;8454:118;8611:2;8637:53;8682:7;8673:6;8662:9;8658:22;8637:53;:::i;:::-;8627:63;;8582:118;7878:829;;;;;:::o;8713:118::-;8800:24;8818:5;8800:24;:::i;:::-;8795:3;8788:37;8713:118;;:::o;8837:222::-;8930:4;8968:2;8957:9;8953:18;8945:26;;8981:71;9049:1;9038:9;9034:17;9025:6;8981:71;:::i;:::-;8837:222;;;;:::o;9065:619::-;9142:6;9150;9158;9207:2;9195:9;9186:7;9182:23;9178:32;9175:119;;;9213:79;;:::i;:::-;9175:119;9333:1;9358:53;9403:7;9394:6;9383:9;9379:22;9358:53;:::i;:::-;9348:63;;9304:117;9460:2;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;:::i;:::-;9476:63;;9431:118;9588:2;9614:53;9659:7;9650:6;9639:9;9635:22;9614:53;:::i;:::-;9604:63;;9559:118;9065:619;;;;;:::o;9690:118::-;9777:24;9795:5;9777:24;:::i;:::-;9772:3;9765:37;9690:118;;:::o;9814:222::-;9907:4;9945:2;9934:9;9930:18;9922:26;;9958:71;10026:1;10015:9;10011:17;10002:6;9958:71;:::i;:::-;9814:222;;;;:::o;10042:116::-;10112:21;10127:5;10112:21;:::i;:::-;10105:5;10102:32;10092:60;;10148:1;10145;10138:12;10092:60;10042:116;:::o;10164:133::-;10207:5;10245:6;10232:20;10223:29;;10261:30;10285:5;10261:30;:::i;:::-;10164:133;;;;:::o;10303:468::-;10368:6;10376;10425:2;10413:9;10404:7;10400:23;10396:32;10393:119;;;10431:79;;:::i;:::-;10393:119;10551:1;10576:53;10621:7;10612:6;10601:9;10597:22;10576:53;:::i;:::-;10566:63;;10522:117;10678:2;10704:50;10746:7;10737:6;10726:9;10722:22;10704:50;:::i;:::-;10694:60;;10649:115;10303:468;;;;;:::o;10777:117::-;10886:1;10883;10876:12;10914:553;10972:8;10982:6;11032:3;11025:4;11017:6;11013:17;11009:27;10999:122;;11040:79;;:::i;:::-;10999:122;11153:6;11140:20;11130:30;;11183:18;11175:6;11172:30;11169:117;;;11205:79;;:::i;:::-;11169:117;11319:4;11311:6;11307:17;11295:29;;11373:3;11365:4;11357:6;11353:17;11343:8;11339:32;11336:41;11333:128;;;11380:79;;:::i;:::-;11333:128;10914:553;;;;;:::o;11473:529::-;11544:6;11552;11601:2;11589:9;11580:7;11576:23;11572:32;11569:119;;;11607:79;;:::i;:::-;11569:119;11755:1;11744:9;11740:17;11727:31;11785:18;11777:6;11774:30;11771:117;;;11807:79;;:::i;:::-;11771:117;11920:65;11977:7;11968:6;11957:9;11953:22;11920:65;:::i;:::-;11902:83;;;;11698:297;11473:529;;;;;:::o;12025:568::-;12098:8;12108:6;12158:3;12151:4;12143:6;12139:17;12135:27;12125:122;;12166:79;;:::i;:::-;12125:122;12279:6;12266:20;12256:30;;12309:18;12301:6;12298:30;12295:117;;;12331:79;;:::i;:::-;12295:117;12445:4;12437:6;12433:17;12421:29;;12499:3;12491:4;12483:6;12479:17;12469:8;12465:32;12462:41;12459:128;;;12506:79;;:::i;:::-;12459:128;12025:568;;;;;:::o;12616:::-;12689:8;12699:6;12749:3;12742:4;12734:6;12730:17;12726:27;12716:122;;12757:79;;:::i;:::-;12716:122;12870:6;12857:20;12847:30;;12900:18;12892:6;12889:30;12886:117;;;12922:79;;:::i;:::-;12886:117;13036:4;13028:6;13024:17;13012:29;;13090:3;13082:4;13074:6;13070:17;13060:8;13056:32;13053:41;13050:128;;;13097:79;;:::i;:::-;13050:128;12616:568;;;;;:::o;13190:934::-;13312:6;13320;13328;13336;13385:2;13373:9;13364:7;13360:23;13356:32;13353:119;;;13391:79;;:::i;:::-;13353:119;13539:1;13528:9;13524:17;13511:31;13569:18;13561:6;13558:30;13555:117;;;13591:79;;:::i;:::-;13555:117;13704:80;13776:7;13767:6;13756:9;13752:22;13704:80;:::i;:::-;13686:98;;;;13482:312;13861:2;13850:9;13846:18;13833:32;13892:18;13884:6;13881:30;13878:117;;;13914:79;;:::i;:::-;13878:117;14027:80;14099:7;14090:6;14079:9;14075:22;14027:80;:::i;:::-;14009:98;;;;13804:313;13190:934;;;;;;;:::o;14130:329::-;14189:6;14238:2;14226:9;14217:7;14213:23;14209:32;14206:119;;;14244:79;;:::i;:::-;14206:119;14364:1;14389:53;14434:7;14425:6;14414:9;14410:22;14389:53;:::i;:::-;14379:63;;14335:117;14130:329;;;;:::o;14465:829::-;14567:6;14575;14583;14632:2;14620:9;14611:7;14607:23;14603:32;14600:119;;;14638:79;;:::i;:::-;14600:119;14758:1;14783:53;14828:7;14819:6;14808:9;14804:22;14783:53;:::i;:::-;14773:63;;14729:117;14913:2;14902:9;14898:18;14885:32;14944:18;14936:6;14933:30;14930:117;;;14966:79;;:::i;:::-;14930:117;15071:78;15141:7;15132:6;15121:9;15117:22;15071:78;:::i;:::-;15061:88;;14856:303;15198:2;15224:53;15269:7;15260:6;15249:9;15245:22;15224:53;:::i;:::-;15214:63;;15169:118;14465:829;;;;;:::o;15300:474::-;15368:6;15376;15425:2;15413:9;15404:7;15400:23;15396:32;15393:119;;;15431:79;;:::i;:::-;15393:119;15551:1;15576:53;15621:7;15612:6;15601:9;15597:22;15576:53;:::i;:::-;15566:63;;15522:117;15678:2;15704:53;15749:7;15740:6;15729:9;15725:22;15704:53;:::i;:::-;15694:63;;15649:118;15300:474;;;;;:::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:180::-;19611:77;19608:1;19601:88;19708:4;19705:1;19698:15;19732:4;19729:1;19722:15;19749:191;19789:3;19808:20;19826:1;19808:20;:::i;:::-;19803:25;;19842:20;19860:1;19842:20;:::i;:::-;19837:25;;19885:1;19882;19878:9;19871:16;;19906:3;19903:1;19900:10;19897:36;;;19913:18;;:::i;:::-;19897:36;19749:191;;;;:::o;19946:164::-;20086:16;20082:1;20074:6;20070:14;20063:40;19946:164;:::o;20116:366::-;20258:3;20279:67;20343:2;20338:3;20279:67;:::i;:::-;20272:74;;20355:93;20444:3;20355:93;:::i;:::-;20473:2;20468:3;20464:12;20457:19;;20116:366;;;:::o;20488:419::-;20654:4;20692:2;20681:9;20677:18;20669:26;;20741:9;20735:4;20731:20;20727:1;20716:9;20712:17;20705:47;20769:131;20895:4;20769:131;:::i;:::-;20761:139;;20488:419;;;:::o;20913:160::-;21053:12;21049:1;21041:6;21037:14;21030:36;20913:160;:::o;21079:366::-;21221:3;21242:67;21306:2;21301:3;21242:67;:::i;:::-;21235:74;;21318:93;21407:3;21318:93;:::i;:::-;21436:2;21431:3;21427:12;21420:19;;21079:366;;;:::o;21451:419::-;21617:4;21655:2;21644:9;21640:18;21632:26;;21704:9;21698:4;21694:20;21690:1;21679:9;21675:17;21668:47;21732:131;21858:4;21732:131;:::i;:::-;21724:139;;21451:419;;;:::o;21876:348::-;21916:7;21939:20;21957:1;21939:20;:::i;:::-;21934:25;;21973:20;21991:1;21973:20;:::i;:::-;21968:25;;22161:1;22093:66;22089:74;22086:1;22083:81;22078:1;22071:9;22064:17;22060:105;22057:131;;;22168:18;;:::i;:::-;22057:131;22216:1;22213;22209:9;22198:20;;21876:348;;;;:::o;22230:162::-;22370:14;22366:1;22358:6;22354:14;22347:38;22230:162;:::o;22398:366::-;22540:3;22561:67;22625:2;22620:3;22561:67;:::i;:::-;22554:74;;22637:93;22726:3;22637:93;:::i;:::-;22755:2;22750:3;22746:12;22739:19;;22398:366;;;:::o;22770:419::-;22936:4;22974:2;22963:9;22959:18;22951:26;;23023:9;23017:4;23013:20;23009:1;22998:9;22994:17;22987:47;23051:131;23177:4;23051:131;:::i;:::-;23043:139;;22770:419;;;:::o;23195:180::-;23335:32;23331:1;23323:6;23319:14;23312:56;23195:180;:::o;23381:366::-;23523:3;23544:67;23608:2;23603:3;23544:67;:::i;:::-;23537:74;;23620:93;23709:3;23620:93;:::i;:::-;23738:2;23733:3;23729:12;23722:19;;23381:366;;;:::o;23753:419::-;23919:4;23957:2;23946:9;23942:18;23934:26;;24006:9;24000:4;23996:20;23992:1;23981:9;23977:17;23970:47;24034:131;24160:4;24034:131;:::i;:::-;24026:139;;23753:419;;;:::o;24178:165::-;24318:17;24314:1;24306:6;24302:14;24295:41;24178:165;:::o;24349:366::-;24491:3;24512:67;24576:2;24571:3;24512:67;:::i;:::-;24505:74;;24588:93;24677:3;24588:93;:::i;:::-;24706:2;24701:3;24697:12;24690:19;;24349:366;;;:::o;24721:419::-;24887:4;24925:2;24914:9;24910:18;24902:26;;24974:9;24968:4;24964:20;24960:1;24949:9;24945:17;24938:47;25002:131;25128:4;25002:131;:::i;:::-;24994:139;;24721:419;;;:::o;25146:222::-;25286:34;25282:1;25274:6;25270:14;25263:58;25355:5;25350:2;25342:6;25338:15;25331:30;25146:222;:::o;25374:366::-;25516:3;25537:67;25601:2;25596:3;25537:67;:::i;:::-;25530:74;;25613:93;25702:3;25613:93;:::i;:::-;25731:2;25726:3;25722:12;25715:19;;25374:366;;;:::o;25746:419::-;25912:4;25950:2;25939:9;25935:18;25927:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26027:131;26153:4;26027:131;:::i;:::-;26019:139;;25746:419;;;:::o;26171:168::-;26311:20;26307:1;26299:6;26295:14;26288:44;26171:168;:::o;26345:366::-;26487:3;26508:67;26572:2;26567:3;26508:67;:::i;:::-;26501:74;;26584:93;26673:3;26584:93;:::i;:::-;26702:2;26697:3;26693:12;26686:19;;26345:366;;;:::o;26717:419::-;26883:4;26921:2;26910:9;26906:18;26898:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26998:131;27124:4;26998:131;:::i;:::-;26990:139;;26717:419;;;:::o;27142:166::-;27282:18;27278:1;27270:6;27266:14;27259:42;27142:166;:::o;27314:366::-;27456:3;27477:67;27541:2;27536:3;27477:67;:::i;:::-;27470:74;;27553:93;27642:3;27553:93;:::i;:::-;27671:2;27666:3;27662:12;27655:19;;27314:366;;;:::o;27686:419::-;27852:4;27890:2;27879:9;27875:18;27867:26;;27939:9;27933:4;27929:20;27925:1;27914:9;27910:17;27903:47;27967:131;28093:4;27967:131;:::i;:::-;27959:139;;27686:419;;;:::o;28111:147::-;28212:11;28249:3;28234:18;;28111:147;;;;:::o;28264:114::-;;:::o;28384:398::-;28543:3;28564:83;28645:1;28640:3;28564:83;:::i;:::-;28557:90;;28656:93;28745:3;28656:93;:::i;:::-;28774:1;28769:3;28765:11;28758:18;;28384:398;;;:::o;28788:379::-;28972:3;28994:147;29137:3;28994:147;:::i;:::-;28987:154;;29158:3;29151:10;;28788:379;;;:::o;29173:165::-;29313:17;29309:1;29301:6;29297:14;29290:41;29173:165;:::o;29344:366::-;29486:3;29507:67;29571:2;29566:3;29507:67;:::i;:::-;29500:74;;29583:93;29672:3;29583:93;:::i;:::-;29701:2;29696:3;29692:12;29685:19;;29344:366;;;:::o;29716:419::-;29882:4;29920:2;29909:9;29905:18;29897:26;;29969:9;29963:4;29959:20;29955:1;29944:9;29940:17;29933:47;29997:131;30123:4;29997:131;:::i;:::-;29989:139;;29716:419;;;:::o;30141:97::-;30200:6;30228:3;30218:13;;30141:97;;;;:::o;30244:141::-;30293:4;30316:3;30308:11;;30339:3;30336:1;30329:14;30373:4;30370:1;30360:18;30352:26;;30244:141;;;:::o;30391:93::-;30428:6;30475:2;30470;30463:5;30459:14;30455:23;30445:33;;30391:93;;;:::o;30490:107::-;30534:8;30584:5;30578:4;30574:16;30553:37;;30490:107;;;;:::o;30603:393::-;30672:6;30722:1;30710:10;30706:18;30745:97;30775:66;30764:9;30745:97;:::i;:::-;30863:39;30893:8;30882:9;30863:39;:::i;:::-;30851:51;;30935:4;30931:9;30924:5;30920:21;30911:30;;30984:4;30974:8;30970:19;30963:5;30960:30;30950:40;;30679:317;;30603:393;;;;;:::o;31002:60::-;31030:3;31051:5;31044:12;;31002:60;;;:::o;31068:142::-;31118:9;31151:53;31169:34;31178:24;31196:5;31178:24;:::i;:::-;31169:34;:::i;:::-;31151:53;:::i;:::-;31138:66;;31068:142;;;:::o;31216:75::-;31259:3;31280:5;31273:12;;31216:75;;;:::o;31297:269::-;31407:39;31438:7;31407:39;:::i;:::-;31468:91;31517:41;31541:16;31517:41;:::i;:::-;31509:6;31502:4;31496:11;31468:91;:::i;:::-;31462:4;31455:105;31373:193;31297:269;;;:::o;31572:73::-;31617:3;31572:73;:::o;31651:189::-;31728:32;;:::i;:::-;31769:65;31827:6;31819;31813:4;31769:65;:::i;:::-;31704:136;31651:189;;:::o;31846:186::-;31906:120;31923:3;31916:5;31913:14;31906:120;;;31977:39;32014:1;32007:5;31977:39;:::i;:::-;31950:1;31943:5;31939:13;31930:22;;31906:120;;;31846:186;;:::o;32038:543::-;32139:2;32134:3;32131:11;32128:446;;;32173:38;32205:5;32173:38;:::i;:::-;32257:29;32275:10;32257:29;:::i;:::-;32247:8;32243:44;32440:2;32428:10;32425:18;32422:49;;;32461:8;32446:23;;32422:49;32484:80;32540:22;32558:3;32540:22;:::i;:::-;32530:8;32526:37;32513:11;32484:80;:::i;:::-;32143:431;;32128:446;32038:543;;;:::o;32587:117::-;32641:8;32691:5;32685:4;32681:16;32660:37;;32587:117;;;;:::o;32710:169::-;32754:6;32787:51;32835:1;32831:6;32823:5;32820:1;32816:13;32787:51;:::i;:::-;32783:56;32868:4;32862;32858:15;32848:25;;32761:118;32710:169;;;;:::o;32884:295::-;32960:4;33106:29;33131:3;33125:4;33106:29;:::i;:::-;33098:37;;33168:3;33165:1;33161:11;33155:4;33152:21;33144:29;;32884:295;;;;:::o;33184:1403::-;33308:44;33348:3;33343;33308:44;:::i;:::-;33417:18;33409:6;33406:30;33403:56;;;33439:18;;:::i;:::-;33403:56;33483:38;33515:4;33509:11;33483:38;:::i;:::-;33568:67;33628:6;33620;33614:4;33568:67;:::i;:::-;33662:1;33691:2;33683:6;33680:14;33708:1;33703:632;;;;34379:1;34396:6;34393:84;;;34452:9;34447:3;34443:19;34430:33;34421:42;;34393:84;34503:67;34563:6;34556:5;34503:67;:::i;:::-;34497:4;34490:81;34352:229;33673:908;;33703:632;33755:4;33751:9;33743:6;33739:22;33789:37;33821:4;33789:37;:::i;:::-;33848:1;33862:215;33876:7;33873:1;33870:14;33862:215;;;33962:9;33957:3;33953:19;33940:33;33932:6;33925:49;34013:1;34005:6;34001:14;33991:24;;34060:2;34049:9;34045:18;34032:31;;33899:4;33896:1;33892:12;33887:17;;33862:215;;;34105:6;34096:7;34093:19;34090:186;;;34170:9;34165:3;34161:19;34148:33;34213:48;34255:4;34247:6;34243:17;34232:9;34213:48;:::i;:::-;34205:6;34198:64;34113:163;34090:186;34322:1;34318;34310:6;34306:14;34302:22;34296:4;34289:36;33710:625;;;33673:908;;33283:1304;;;33184:1403;;;:::o;34617:317::-;34715:3;34736:71;34800:6;34795:3;34736:71;:::i;:::-;34729:78;;34817:56;34866:6;34861:3;34854:5;34817:56;:::i;:::-;34898:29;34920:6;34898:29;:::i;:::-;34893:3;34889:39;34882:46;;34617:317;;;;;:::o;34940:333::-;35063:4;35101:2;35090:9;35086:18;35078:26;;35150:9;35144:4;35140:20;35136:1;35125:9;35121:17;35114:47;35178:88;35261:4;35252:6;35244;35178:88;:::i;:::-;35170:96;;34940:333;;;;;:::o;35279:223::-;35419:34;35415:1;35407:6;35403:14;35396:58;35488:6;35483:2;35475:6;35471:15;35464:31;35279:223;:::o;35508:366::-;35650:3;35671:67;35735:2;35730:3;35671:67;:::i;:::-;35664:74;;35747:93;35836:3;35747:93;:::i;:::-;35865:2;35860:3;35856:12;35849:19;;35508:366;;;:::o;35880:419::-;36046:4;36084:2;36073:9;36069:18;36061:26;;36133:9;36127:4;36123:20;36119:1;36108:9;36104:17;36097:47;36161:131;36287:4;36161:131;:::i;:::-;36153:139;;35880:419;;;:::o;36305:182::-;36445:34;36441:1;36433:6;36429:14;36422:58;36305:182;:::o;36493:366::-;36635:3;36656:67;36720:2;36715:3;36656:67;:::i;:::-;36649:74;;36732:93;36821:3;36732:93;:::i;:::-;36850:2;36845:3;36841:12;36834:19;;36493:366;;;:::o;36865:419::-;37031:4;37069:2;37058:9;37054:18;37046:26;;37118:9;37112:4;37108:20;37104:1;37093:9;37089:17;37082:47;37146:131;37272:4;37146:131;:::i;:::-;37138:139;;36865:419;;;:::o;37290:180::-;37338:77;37335:1;37328:88;37435:4;37432:1;37425:15;37459:4;37456:1;37449:15;37476:233;37515:3;37538:24;37556:5;37538:24;:::i;:::-;37529:33;;37584:66;37577:5;37574:77;37571:103;;37654:18;;:::i;:::-;37571:103;37701:1;37694:5;37690:13;37683:20;;37476:233;;;:::o;37715:94::-;37748:8;37796:5;37792:2;37788:14;37767:35;;37715:94;;;:::o;37815:::-;37854:7;37883:20;37897:5;37883:20;:::i;:::-;37872:31;;37815:94;;;:::o;37915:100::-;37954:7;37983:26;38003:5;37983:26;:::i;:::-;37972:37;;37915:100;;;:::o;38021:157::-;38126:45;38146:24;38164:5;38146:24;:::i;:::-;38126:45;:::i;:::-;38121:3;38114:58;38021:157;;:::o;38184:79::-;38223:7;38252:5;38241:16;;38184:79;;;:::o;38269:157::-;38374:45;38394:24;38412:5;38394:24;:::i;:::-;38374:45;:::i;:::-;38369:3;38362:58;38269:157;;:::o;38432:397::-;38572:3;38587:75;38658:3;38649:6;38587:75;:::i;:::-;38687:2;38682:3;38678:12;38671:19;;38700:75;38771:3;38762:6;38700:75;:::i;:::-;38800:2;38795:3;38791:12;38784:19;;38820:3;38813:10;;38432:397;;;;;:::o;38835:79::-;38874:7;38903:5;38892:16;;38835:79;;;:::o;38920:157::-;39025:45;39045:24;39063:5;39045:24;:::i;:::-;39025:45;:::i;:::-;39020:3;39013:58;38920:157;;:::o;39083:256::-;39195:3;39210:75;39281:3;39272:6;39210:75;:::i;:::-;39310:2;39305:3;39301:12;39294:19;;39330:3;39323:10;;39083:256;;;;:::o;39345:169::-;39485:21;39481:1;39473:6;39469:14;39462:45;39345:169;:::o;39520:366::-;39662:3;39683:67;39747:2;39742:3;39683:67;:::i;:::-;39676:74;;39759:93;39848:3;39759:93;:::i;:::-;39877:2;39872:3;39868:12;39861:19;;39520:366;;;:::o;39892:419::-;40058:4;40096:2;40085:9;40081:18;40073:26;;40145:9;40139:4;40135:20;40131:1;40120:9;40116:17;40109:47;40173:131;40299:4;40173:131;:::i;:::-;40165:139;;39892:419;;;:::o;40317:148::-;40419:11;40456:3;40441:18;;40317:148;;;;:::o;40495:874::-;40598:3;40635:5;40629:12;40664:36;40690:9;40664:36;:::i;:::-;40716:89;40798:6;40793:3;40716:89;:::i;:::-;40709:96;;40836:1;40825:9;40821:17;40852:1;40847:166;;;;41027:1;41022:341;;;;40814:549;;40847:166;40931:4;40927:9;40916;40912:25;40907:3;40900:38;40993:6;40986:14;40979:22;40971:6;40967:35;40962:3;40958:45;40951:52;;40847:166;;41022:341;41089:38;41121:5;41089:38;:::i;:::-;41149:1;41163:154;41177:6;41174:1;41171:13;41163:154;;;41251:7;41245:14;41241:1;41236:3;41232:11;41225:35;41301:1;41292:7;41288:15;41277:26;;41199:4;41196:1;41192:12;41187:17;;41163:154;;;41346:6;41341:3;41337:16;41330:23;;41029:334;;40814:549;;40602:767;;40495:874;;;;:::o;41375:390::-;41481:3;41509:39;41542:5;41509:39;:::i;:::-;41564:89;41646:6;41641:3;41564:89;:::i;:::-;41557:96;;41662:65;41720:6;41715:3;41708:4;41701:5;41697:16;41662:65;:::i;:::-;41752:6;41747:3;41743:16;41736:23;;41485:280;41375:390;;;;:::o;41771:583::-;41993:3;42015:92;42103:3;42094:6;42015:92;:::i;:::-;42008:99;;42124:95;42215:3;42206:6;42124:95;:::i;:::-;42117:102;;42236:92;42324:3;42315:6;42236:92;:::i;:::-;42229:99;;42345:3;42338:10;;41771:583;;;;;;:::o;42360:165::-;42500:17;42496:1;42488:6;42484:14;42477:41;42360:165;:::o;42531:366::-;42673:3;42694:67;42758:2;42753:3;42694:67;:::i;:::-;42687:74;;42770:93;42859:3;42770:93;:::i;:::-;42888:2;42883:3;42879:12;42872:19;;42531:366;;;:::o;42903:419::-;43069:4;43107:2;43096:9;43092:18;43084:26;;43156:9;43150:4;43146:20;43142:1;43131:9;43127:17;43120:47;43184:131;43310:4;43184:131;:::i;:::-;43176:139;;42903:419;;;:::o;43328:182::-;43468:34;43464:1;43456:6;43452:14;43445:58;43328:182;:::o;43516:366::-;43658:3;43679:67;43743:2;43738:3;43679:67;:::i;:::-;43672:74;;43755:93;43844:3;43755:93;:::i;:::-;43873:2;43868:3;43864:12;43857:19;;43516:366;;;:::o;43888:419::-;44054:4;44092:2;44081:9;44077:18;44069:26;;44141:9;44135:4;44131:20;44127:1;44116:9;44112:17;44105:47;44169:131;44295:4;44169:131;:::i;:::-;44161:139;;43888:419;;;:::o;44313:181::-;44453:33;44449:1;44441:6;44437:14;44430:57;44313:181;:::o;44500:366::-;44642:3;44663:67;44727:2;44722:3;44663:67;:::i;:::-;44656:74;;44739:93;44828:3;44739:93;:::i;:::-;44857:2;44852:3;44848:12;44841:19;;44500:366;;;:::o;44872:419::-;45038:4;45076:2;45065:9;45061:18;45053:26;;45125:9;45119:4;45115:20;45111:1;45100:9;45096:17;45089:47;45153:131;45279:4;45153:131;:::i;:::-;45145:139;;44872:419;;;:::o;45297:98::-;45348:6;45382:5;45376:12;45366:22;;45297:98;;;:::o;45401:168::-;45484:11;45518:6;45513:3;45506:19;45558:4;45553:3;45549:14;45534:29;;45401:168;;;;:::o;45575:373::-;45661:3;45689:38;45721:5;45689:38;:::i;:::-;45743:70;45806:6;45801:3;45743:70;:::i;:::-;45736:77;;45822:65;45880:6;45875:3;45868:4;45861:5;45857:16;45822:65;:::i;:::-;45912:29;45934:6;45912:29;:::i;:::-;45907:3;45903:39;45896:46;;45665:283;45575:373;;;;:::o;45954:640::-;46149:4;46187:3;46176:9;46172:19;46164:27;;46201:71;46269:1;46258:9;46254:17;46245:6;46201:71;:::i;:::-;46282:72;46350:2;46339:9;46335:18;46326:6;46282:72;:::i;:::-;46364;46432:2;46421:9;46417:18;46408:6;46364:72;:::i;:::-;46483:9;46477:4;46473:20;46468:2;46457:9;46453:18;46446:48;46511:76;46582:4;46573:6;46511:76;:::i;:::-;46503:84;;45954:640;;;;;;;:::o;46600:141::-;46656:5;46687:6;46681:13;46672:22;;46703:32;46729:5;46703:32;:::i;:::-;46600:141;;;;:::o;46747:349::-;46816:6;46865:2;46853:9;46844:7;46840:23;46836:32;46833:119;;;46871:79;;:::i;:::-;46833:119;46991:1;47016:63;47071:7;47062:6;47051:9;47047:22;47016:63;:::i;:::-;47006:73;;46962:127;46747:349;;;;:::o;47102:180::-;47150:77;47147:1;47140:88;47247:4;47244:1;47237:15;47271:4;47268:1;47261:15;47288:225;47428:34;47424:1;47416:6;47412:14;47405:58;47497:8;47492:2;47484:6;47480:15;47473:33;47288:225;:::o;47519:366::-;47661:3;47682:67;47746:2;47741:3;47682:67;:::i;:::-;47675:74;;47758:93;47847:3;47758:93;:::i;:::-;47876:2;47871:3;47867:12;47860:19;;47519:366;;;:::o;47891:419::-;48057:4;48095:2;48084:9;48080:18;48072:26;;48144:9;48138:4;48134:20;48130:1;48119:9;48115:17;48108:47;48172:131;48298:4;48172:131;:::i;:::-;48164:139;;47891:419;;;:::o
Swarm Source
ipfs://f7c3ed133b2428d9713bad50e192bd0404c59e25878013b9a99d64931f46a59b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.