ERC-721
Overview
Max Total Supply
1,128 TBB1
Holders
163
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TBB1Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BattleBunnies
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; import "./ERC721A.sol"; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; import "./Percentages.sol"; contract BattleBunnies is ERC721A, Ownable, ReentrancyGuard, Percentages { // Max supply uint256 public maxSupply; IERC721 public TBB_GENESIS; // Merkle Root bytes32 public alRoot; uint256 public price; uint256 public alPrice; uint256 public holderPrice; uint256 maxPerTx = 7; // 0 - closed // 1 - holder only // 2 - allow list only // 3 - public price only // 4 - holder and allow list only // 5 - holder and public // 6 - allow list and public uint256 public state; mapping(address => bool) private isAdmin; event minted(address minter, uint256 price, address recipient, uint256 amount); event stateChanged(uint256 _state); event genesisChanged(address _project); modifier onlyAdmin { require(isAdmin[_msgSender()] == true, "onlyAdmin: Sender must be admin"); _; } struct Wallets { uint256 percentage; address wallet; } Wallets[] public wallets; constructor( string memory name, // The Battle Bunnies string memory symbol, // TBB uint256 _maxSupply, // 5001 uint256 _price, // 90000000000000000 WEI uint256 _alPrice, // 80000000000000000 WEI uint256 _holderPrice // 70000000000000000 WEI ) ERC721A(name, symbol, 100, _maxSupply) { maxSupply = _maxSupply; price = _price; alPrice = _alPrice; holderPrice = _holderPrice; TBB_GENESIS = IERC721(0xF8e9776840639b0fFEa1EcB31fADF974Cf48A435); _safeMint(0x0000000000000000000000000000000000000000, 1); URI = "https://us-central1-battle-bunnies-mint.cloudfunctions.net/get-metadata?tokenid="; isAdmin[_msgSender()] = true; wallets.push(Wallets(35, 0x644580B17fd98F42B37B56773e71dcfD81eff4cB)); wallets.push(Wallets(25, 0x1954e9bE7E604Ff1A0f6D20dabC54F4DD86d8e46)); wallets.push(Wallets(15, 0x8245508E4eeE2Ec32200DeeCD7E85A3050Af7C49)); wallets.push(Wallets(10, 0x0fDA31E3454F429701082A20380D9CfAaDfefb54)); wallets.push(Wallets(8, 0xd8d3e705C6302bA3c30e4F718920074e2F575102)); wallets.push(Wallets(5, 0x53DE2a775476E35120bc070ff9667044e6732A7f)); wallets.push(Wallets(2, 0x67CE09d244D8CD9Ac49878B76f5955AB4aC0A478)); } function isAllowListed(address _recipient, bytes32[] calldata _merkleProof) public view returns(bool) { bytes32 leaf = keccak256(abi.encodePacked(_recipient)); bool isal = MerkleProof.verify(_merkleProof, alRoot, leaf); return isal; } function isHolder(address _recipient) public view returns(bool) { return TBB_GENESIS.balanceOf(_recipient) > 0; } function mint(uint256 amount, bytes32[] calldata _merkleProof) external payable nonReentrant { require(state > 0, "Sale is closed"); require(totalSupply() + amount <= maxSupply, "exceeds max supply"); require(amount <= maxPerTx, "exceeds max per tx"); uint256 mintPrice = price; if(state == 1 || state == 4 || state == 5) { if(state == 1) { require(isHolder(_msgSender()), "Must hold a genesis NFT"); mintPrice = holderPrice; } else if(state == 4) { require(isHolder(_msgSender()) || isAllowListed(_msgSender(), _merkleProof), "Only holders and allow list can mint"); if(isHolder(_msgSender())) { mintPrice = holderPrice; } else if(isAllowListed(_msgSender(), _merkleProof)) { mintPrice = alPrice; } } else if(state == 5) { if(isHolder(_msgSender())) { mintPrice = holderPrice; } } } else if(state == 2 || state == 6) { if(state == 2) { bool isal = isAllowListed(_msgSender(), _merkleProof); require(isal, "Allow list only"); mintPrice = alPrice; } else if (state == 6) { if(isAllowListed(_msgSender(), _merkleProof)) { mintPrice = alPrice; } } } require(msg.value == mintPrice * amount, "incorrect amount of ETH sent"); _safeMint(_msgSender(), amount); emit minted(_msgSender(), msg.value, _msgSender(), amount); } function ownerMint(uint amount, address _recipient) external onlyAdmin { require(totalSupply() + amount <= maxSupply, "exceeds max supply"); _safeMint(_recipient, amount); emit minted(_msgSender(), 0, _recipient, amount); } function withdraw(uint256 amount, address payable recipient) external onlyOwner { (bool success,) = recipient.call{value: amount}(""); require(success, "Transfer fail"); } function setURI(string memory _uri) external onlyOwner { URI = _uri; } function setState(uint256 _state) external onlyAdmin { require(_state <= 6, "State can only be from 0 to 6, inclusive"); state = _state; emit stateChanged(state); } function setHolderPrice(uint256 _holderPrice) external onlyOwner { holderPrice = _holderPrice; } function setMaxPerTx(uint256 _maxPerTx) external onlyAdmin { maxPerTx = _maxPerTx; } function setALRoot(bytes32 root) external onlyAdmin { alRoot = root; } function splitWithdraw() external onlyAdmin nonReentrant{ uint256 balance = address(this).balance; uint256 payout1 = percentageOf(balance, wallets[0].percentage); (bool success1,) = wallets[0].wallet.call{value: payout1 }(""); require(success1, 'Transfer fail'); uint256 payout2 = percentageOf(balance, wallets[1].percentage); (bool success2,) = wallets[1].wallet.call{value: payout2 }(""); require(success2, 'Transfer fail'); uint256 payout3 = percentageOf(balance, wallets[2].percentage); (bool success3,) = wallets[2].wallet.call{value: payout3 }(""); require(success3, 'Transfer fail'); uint256 payout4 = percentageOf(balance, wallets[3].percentage); (bool success4,) = wallets[3].wallet.call{value: payout4 }(""); require(success4, 'Transfer fail'); uint256 payout5 = percentageOf(balance, wallets[4].percentage); (bool success5,) = wallets[4].wallet.call{value: payout5 }(""); require(success5, 'Transfer fail'); uint256 payout6 = percentageOf(balance, wallets[5].percentage); (bool success6,) = wallets[5].wallet.call{value: payout6 }(""); require(success6, 'Transfer fail'); uint256 payout7 = percentageOf(balance, wallets[6].percentage); (bool success7,) = wallets[6].wallet.call{value: payout7 }(""); require(success7, 'Transfer fail'); } function setGenesis(address _genesis) external onlyAdmin { TBB_GENESIS = ERC721A(_genesis); emit genesisChanged(_genesis); } function changePaySplits(uint256 indexToChange, uint256 _percentage, address payable _wallet) external onlyOwner { wallets[indexToChange].percentage = _percentage; wallets[indexToChange].wallet = _wallet; } function addAdmin(address _adm) external onlyOwner { isAdmin[_adm] = true; } function revokeAdmin(address _adm) external onlyOwner { isAdmin[_adm] = false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; //https://google-project/nft/123 } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; //https://google-project/nft/ } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; //import "@openzeppelin/contracts/utils/Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; //require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); //require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract Percentages{ function percentageOf(uint256 value, uint256 percentage) public pure returns(uint256){ require(value >= 100, "Value must be >= 100"); uint256 onePC = value / 100; return onePC * percentage; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_alPrice","type":"uint256"},{"internalType":"uint256","name":"_holderPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_project","type":"address"}],"name":"genesisChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_state","type":"uint256"}],"name":"stateChanged","type":"event"},{"inputs":[],"name":"TBB_GENESIS","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adm","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexToChange","type":"uint256"},{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"address payable","name":"_wallet","type":"address"}],"name":"changePaySplits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_recipient","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"percentageOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adm","type":"address"}],"name":"revokeAdmin","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":"bytes32","name":"root","type":"bytes32"}],"name":"setALRoot","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":"address","name":"_genesis","type":"address"}],"name":"setGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_holderPrice","type":"uint256"}],"name":"setHolderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260008055600060085560076011553480156200001f57600080fd5b50604051620046f4380380620046f4833981016040819052620000429162000970565b858560648660008111620000b45760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001165760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620000ab565b600162000124858262000a8a565b50600262000133848262000a8a565b5060a091909152608052506200014b90503362000466565b6001600a819055600b859055600e849055600f8390556010829055600c80546001600160a01b03191673f8e9776840639b0ffea1ecb31fadf974cf48a4351790556200019a90600090620004b8565b6040518060800160405280605081526020016200468460509139600790620001c3908262000a8a565b50503360009081526013602090815260408083208054600160ff199091168117909155815180830183526023815273644580b17fd98f42b37b56773e71dcfd81eff4cb81850190815260148054808501825581885292517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec60029485028181019290925592517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ed91820180546001600160a01b03199081166001600160a01b03938416179091558751808901895260198152731954e9be7e604ff1a0f6d20dabc54f4dd86d8e46818b019081528554808a018755868d52915191880280880192909255519084018054831691841691909117905587518089018952600f8152738245508e4eee2ec32200deecd7e85a3050af7c49818b019081528554808a018755868d52915191880280880192909255519084018054831691841691909117905587518089018952600a8152730fda31e3454f429701082a20380d9cfaadfefb54818b019081528554808a018755868d529151918802808801929092555190840180548316918416919091179055875180890189526008815273d8d3e705c6302ba3c30e4f718920074e2f575102818b019081528554808a018755868d52915191880280880192909255519084018054831691841691909117905587518089018952600581527353de2a775476e35120bc070ff9667044e6732a7f818b019081528554808a018755868d52915191880280880192909255519084018054831691841691909117905587518089019098528588527367ce09d244d8cd9ac49878b76f5955ab4ac0a47898880198895283549687018455929098529451939092029081019290925592519101805490921692169190911790555062000c3f9350505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004da828260405180602001604052806000815250620004de60201b60201c565b5050565b60005460a051831115620005405760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401620000ab565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906200059e90879062000b6c565b6001600160801b03168152602001858360200151620005be919062000b6c565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015620007225760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4620006a4600088848862000737565b620006fd5760405162461bcd60e51b81526020600482015260336024820152600080516020620046d483398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620000ab565b81620007098162000b9a565b9250508080620007199062000b9a565b91505062000654565b5060008190555b505050505050565b50505050565b600062000758846001600160a01b03166200089460201b620026231760201c565b156200088857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200079290339089908890889060040162000bb6565b6020604051808303816000875af1925050508015620007d0575060408051601f3d908101601f19168201909252620007cd9181019062000c0c565b60015b6200086d573d80801562000801576040519150601f19603f3d011682016040523d82523d6000602084013e62000806565b606091505b508051600003620008655760405162461bcd60e51b81526020600482015260336024820152600080516020620046d483398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620000ab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200088c565b5060015b949350505050565b3b151590565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620008cd578181015183820152602001620008b3565b83811115620007315750506000910152565b600082601f830112620008f157600080fd5b81516001600160401b03808211156200090e576200090e6200089a565b604051601f8301601f19908116603f011681019082821181831017156200093957620009396200089a565b816040528381528660208588010111156200095357600080fd5b62000966846020830160208901620008b0565b9695505050505050565b60008060008060008060c087890312156200098a57600080fd5b86516001600160401b0380821115620009a257600080fd5b620009b08a838b01620008df565b97506020890151915080821115620009c757600080fd5b50620009d689828a01620008df565b95505060408701519350606087015192506080870151915060a087015190509295509295509295565b600181811c9082168062000a1457607f821691505b60208210810362000a3557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a8557600081815260208120601f850160051c8101602086101562000a645750805b601f850160051c820191505b81811015620007295782815560010162000a70565b505050565b81516001600160401b0381111562000aa65762000aa66200089a565b62000abe8162000ab78454620009ff565b8462000a3b565b602080601f83116001811462000af6576000841562000add5750858301515b600019600386901b1c1916600185901b17855562000729565b600085815260208120601f198616915b8281101562000b275788860151825594840194600190910190840162000b06565b508582101562000b465787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0382811684821680830382111562000b915762000b9162000b56565b01949350505050565b60006001820162000baf5762000baf62000b56565b5060010190565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000bf58160a0850160208701620008b0565b601f01601f19169190910160a00195945050505050565b60006020828403121562000c1f57600080fd5b81516001600160e01b03198116811462000c3857600080fd5b9392505050565b60805160a051613a1462000c7060003960008181612a8801528181612ab20152612f93015260005050613a146000f3fe6080604052600436106102e65760003560e01c80638da5cb5b11610184578063c2218fdd116100d6578063d52c57e01161008a578063e985e9c511610064578063e985e9c5146107e2578063eb14b3531461082b578063f2fde38b1461084b57600080fd5b8063d52c57e014610796578063d5abeb01146107b6578063d7224ba0146107cc57600080fd5b8063c87b56dd116100bb578063c87b56dd14610736578063d3ca2e4314610756578063d4d7b19a1461077657600080fd5b8063c2218fdd146106f6578063c6f6f2161461071657600080fd5b8063a9e966b711610138578063b88d4fde11610112578063b88d4fde146106ad578063ba41b0c6146106cd578063c19d93fb146106e057600080fd5b8063a9e966b714610658578063af573db214610678578063b71051e21461068d57600080fd5b806395d89b411161016957806395d89b411461060d578063a035b1fe14610622578063a22cb4651461063857600080fd5b80638da5cb5b146105d957806394a81c70146105f757600080fd5b80632d3456701161023d5780636352211e116101f157806370a08231116101cb57806370a0823114610567578063715018a6146105875780637ad71f721461059c57600080fd5b80636352211e146105075780636776216914610527578063704802751461054757600080fd5b806342842e0e1161022257806342842e0e146104b15780634f6ccce7146104d157806355ea7328146104f157600080fd5b80632d345670146104715780632f745c591461049157600080fd5b8063095ea7b31161029f5780631b8926a9116102795780631b8926a91461041b5780631d1e715b1461043157806323b872dd1461045157600080fd5b8063095ea7b3146103bc5780630b74f6ee146103dc57806318160ddd146103fc57600080fd5b806302fe5305116102d057806302fe53051461034257806306fdde0314610362578063081812fc1461038457600080fd5b8062f714ce146102eb57806301ffc9a71461030d575b600080fd5b3480156102f757600080fd5b5061030b61030636600461326c565b61086b565b005b34801561031957600080fd5b5061032d6103283660046132b2565b610962565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5061030b61035d36600461335b565b610a33565b34801561036e57600080fd5b50610377610a9d565b60405161033991906133fc565b34801561039057600080fd5b506103a461039f36600461340f565b610b2f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b5061030b6103d7366004613428565b610bca565b3480156103e857600080fd5b5061030b6103f736600461340f565b610cf7565b34801561040857600080fd5b506000545b604051908152602001610339565b34801561042757600080fd5b5061040d600f5481565b34801561043d57600080fd5b5061030b61044c366004613454565b610d56565b34801561045d57600080fd5b5061030b61046c36600461348d565b610e27565b34801561047d57600080fd5b5061030b61048c3660046134ce565b610e32565b34801561049d57600080fd5b5061040d6104ac366004613428565b610ead565b3480156104bd57600080fd5b5061030b6104cc36600461348d565b611043565b3480156104dd57600080fd5b5061040d6104ec36600461340f565b61105e565b3480156104fd57600080fd5b5061040d60105481565b34801561051357600080fd5b506103a461052236600461340f565b6110da565b34801561053357600080fd5b5061032d610542366004613537565b6110ec565b34801561055357600080fd5b5061030b6105623660046134ce565b611188565b34801561057357600080fd5b5061040d6105823660046134ce565b611206565b34801561059357600080fd5b5061030b6112b2565b3480156105a857600080fd5b506105bc6105b736600461340f565b611318565b604080519283526001600160a01b03909116602083015201610339565b3480156105e557600080fd5b506009546001600160a01b03166103a4565b34801561060357600080fd5b5061040d600d5481565b34801561061957600080fd5b5061037761134f565b34801561062e57600080fd5b5061040d600e5481565b34801561064457600080fd5b5061030b61065336600461358c565b61135e565b34801561066457600080fd5b5061030b61067336600461340f565b611422565b34801561068457600080fd5b5061030b611539565b34801561069957600080fd5b5061040d6106a83660046135bf565b611bf0565b3480156106b957600080fd5b5061030b6106c83660046135e1565b611c64565b61030b6106db366004613661565b611cf3565b3480156106ec57600080fd5b5061040d60125481565b34801561070257600080fd5b5061030b61071136600461340f565b61211d565b34801561072257600080fd5b5061030b61073136600461340f565b612186565b34801561074257600080fd5b5061037761075136600461340f565b6121ef565b34801561076257600080fd5b50600c546103a4906001600160a01b031681565b34801561078257600080fd5b5061032d6107913660046134ce565b6122ca565b3480156107a257600080fd5b5061030b6107b136600461326c565b61235c565b3480156107c257600080fd5b5061040d600b5481565b3480156107d857600080fd5b5061040d60085481565b3480156107ee57600080fd5b5061032d6107fd366004613694565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561083757600080fd5b5061030b6108463660046134ce565b612482565b34801561085757600080fd5b5061030b6108663660046134ce565b612541565b6009546001600160a01b031633146108ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610917576040519150601f19603f3d011682016040523d82523d6000602084013e61091c565b606091505b505090508061095d5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109c557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109f957506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610a2d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6009546001600160a01b03163314610a8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6007610a998282613742565b5050565b606060018054610aac906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad8906136c2565b8015610b255780601f10610afa57610100808354040283529160200191610b25565b820191906000526020600020905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b6000610b3c826000541190565b610bae5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084016108c1565b506000908152600560205260409020546001600160a01b031690565b6000610bd5826110da565b9050806001600160a01b0316836001600160a01b031603610c5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b336001600160a01b0382161480610c7a5750610c7a81336107fd565b610cec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108c1565b61095d838383612629565b6009546001600160a01b03163314610d515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b601055565b6009546001600160a01b03163314610db05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b8160148481548110610dc457610dc4613802565b9060005260206000209060020201600001819055508060148481548110610ded57610ded613802565b906000526020600020906002020160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61095d838383612692565b6009546001600160a01b03163314610e8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000610eb883611206565b8210610f2c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f647300000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b600080549080805b83811015610fd4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610f8757805192505b876001600160a01b0316836001600160a01b031603610fc157868403610fb357509350610a2d92505050565b83610fbd8161382e565b9450505b5080610fcc8161382e565b915050610f34565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e64657800000000000000000000000000000000000060648201526084016108c1565b61095d83838360405180602001604052806000815250611c64565b6000805482106110d65760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e6473000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b5090565b60006110e5826129f3565b5192915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660208201526000908190603401604051602081830303815290604052805190602001209050600061117e85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d549150859050612bbe565b9695505050505050565b6009546001600160a01b031633146111e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60006001600160a01b0382166112845760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016108c1565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b6009546001600160a01b0316331461130c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6113166000612bd4565b565b6014818154811061132857600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b031682565b606060028054610aac906136c2565b336001600160a01b038316036113b65760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108c1565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526013602052604090205460ff1615156001146114865760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b60068111156114fd5760405162461bcd60e51b815260206004820152602860248201527f53746174652063616e206f6e6c792062652066726f6d203020746f20362c206960448201527f6e636c757369766500000000000000000000000000000000000000000000000060648201526084016108c1565b60128190556040518181527f8fd8f487a1d703cca2ded1250c8e7c8c1ae6f0b6cdc81883a282e0863a6d7283906020015b60405180910390a150565b3360009081526013602052604090205460ff16151560011461159d5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b6002600a54036115ef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c1565b6002600a55601480544791600091611628918491849061161157611611613802565b906000526020600020906002020160000154611bf0565b90506000601460008154811061164057611640613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d806000811461169c576040519150601f19603f3d011682016040523d82523d6000602084013e6116a1565b606091505b50509050806116e25760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006116fc84601460018154811061161157611611613802565b90506000601460018154811061171457611714613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611770576040519150601f19603f3d011682016040523d82523d6000602084013e611775565b606091505b50509050806117b65760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006117d086601460028154811061161157611611613802565b9050600060146002815481106117e8576117e8613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611844576040519150601f19603f3d011682016040523d82523d6000602084013e611849565b606091505b505090508061188a5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006118a488601460038154811061161157611611613802565b9050600060146003815481106118bc576118bc613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611918576040519150601f19603f3d011682016040523d82523d6000602084013e61191d565b606091505b505090508061195e5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006119788a601460048154811061161157611611613802565b90506000601460048154811061199057611990613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d80600081146119ec576040519150601f19603f3d011682016040523d82523d6000602084013e6119f1565b606091505b5050905080611a325760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b6000611a4c8c601460058154811061161157611611613802565b905060006014600581548110611a6457611a64613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611ac0576040519150601f19603f3d011682016040523d82523d6000602084013e611ac5565b606091505b5050905080611b065760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b6000611b208e601460068154811061161157611611613802565b905060006014600681548110611b3857611b38613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5050905080611bda5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b50506001600a5550505050505050505050505050565b60006064831015611c435760405162461bcd60e51b815260206004820152601460248201527f56616c7565206d757374206265203e3d2031303000000000000000000000000060448201526064016108c1565b6000611c5060648561385e565b9050611c5c8382613872565b949350505050565b611c6f848484612692565b611c7b84848484612c33565b611ced5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b50505050565b6002600a5403611d455760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c1565b6002600a55601254611d995760405162461bcd60e51b815260206004820152600e60248201527f53616c6520697320636c6f73656400000000000000000000000000000000000060448201526064016108c1565b600b5483611da660005490565b611db09190613891565b1115611dfe5760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820737570706c79000000000000000000000000000060448201526064016108c1565b601154831115611e505760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820706572207478000000000000000000000000000060448201526064016108c1565b600e5460125460011480611e6657506012546004145b80611e7357506012546005145b15611fc657601254600103611ee057611e8b336122ca565b611ed75760405162461bcd60e51b815260206004820152601760248201527f4d75737420686f6c6420612067656e65736973204e465400000000000000000060448201526064016108c1565b5060105461206b565b601254600403611fa557611ef3336122ca565b80611f055750611f05335b84846110ec565b611f765760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920686f6c6465727320616e6420616c6c6f77206c6973742063616e2060448201527f6d696e740000000000000000000000000000000000000000000000000000000060648201526084016108c1565b611f7f336122ca565b15611f8d575060105461206b565b611f9633611efe565b15611fa05750600f545b61206b565b601254600503611fa057611fb8336122ca565b15611fa0575060105461206b565b60125460021480611fd957506012546006145b1561206b5760125460020361204e576000611ff53385856110ec565b9050806120445760405162461bcd60e51b815260206004820152600f60248201527f416c6c6f77206c697374206f6e6c79000000000000000000000000000000000060448201526064016108c1565b5050600f5461206b565b60125460060361206b5761206133611efe565b1561206b5750600f545b6120758482613872565b34146120c35760405162461bcd60e51b815260206004820152601c60248201527f696e636f727265637420616d6f756e74206f66204554482073656e740000000060448201526064016108c1565b6120cd3385612dbc565b6040805133808252346020830152818301526060810186905290517f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a9181900360800190a150506001600a555050565b3360009081526013602052604090205460ff1615156001146121815760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600d55565b3360009081526013602052604090205460ff1615156001146121ea5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b601155565b60606121fc826000541190565b61226e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108c1565b6000612278612dd6565b9050600081511161229857604051806020016040528060008152506122c3565b806122a284612de5565b6040516020016122b39291906138a9565b6040516020818303038152906040525b9392505050565b600c546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015612331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235591906138d8565b1192915050565b3360009081526013602052604090205460ff1615156001146123c05760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600b54826123cd60005490565b6123d79190613891565b11156124255760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820737570706c79000000000000000000000000000060448201526064016108c1565b61242f8183612dbc565b60408051338152600060208201526001600160a01b038316818301526060810184905290517f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a9181900360800190a15050565b3360009081526013602052604090205460ff1615156001146124e65760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f6bfb3e852628f17e1e2a92c9d70a476c2246895bafc4330295244904f86ac5cc9060200161152e565b6009546001600160a01b0316331461259b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b0381166126175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108c1565b61262081612bd4565b50565b3b151590565b600082815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061269d826129f3565b80519091506000906001600160a01b0316336001600160a01b031614806126d45750336126c984610b2f565b6001600160a01b0316145b806126e6575081516126e690336107fd565b90508061275b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016108c1565b846001600160a01b031682600001516001600160a01b0316146127e65760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e6572000000000000000000000000000000000000000000000000000060648201526084016108c1565b6127f66000848460000151612629565b6001600160a01b03851660009081526004602052604081208054600192906128319084906fffffffffffffffffffffffffffffffff166138f1565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261288691859116613922565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612917846001613891565b6000818152600360205260409020549091506001600160a01b03166129a957612941816000541190565b156129a95760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152612a12826000541190565b612a845760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e0000000000000000000000000000000000000000000060648201526084016108c1565b60007f00000000000000000000000000000000000000000000000000000000000000008310612ae557612ad77f00000000000000000000000000000000000000000000000000000000000000008461394d565b612ae2906001613891565b90505b825b818110612b4f576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612b3c57949350505050565b5080612b4781613964565b915050612ae7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e000000000000000000000000000000000060648201526084016108c1565b600082612bcb8584612f1a565b14949350505050565b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15612db1576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612c9090339089908890889060040161397b565b6020604051808303816000875af1925050508015612ccb575060408051601f3d908101601f19168201909252612cc8918101906139ad565b60015b612d7e573d808015612cf9576040519150601f19603f3d011682016040523d82523d6000602084013e612cfe565b606091505b508051600003612d765760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611c5c565b506001949350505050565b610a99828260405180602001604052806000815250612f8e565b606060078054610aac906136c2565b606081600003612e2857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e525780612e3c8161382e565b9150612e4b9050600a8361385e565b9150612e2c565b60008167ffffffffffffffff811115612e6d57612e6d6132cf565b6040519080825280601f01601f191660200182016040528015612e97576020820181803683370190505b5090505b8415611c5c57612eac60018361394d565b9150612eb9600a866139ca565b612ec4906030613891565b60f81b818381518110612ed957612ed9613802565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f13600a8661385e565b9450612e9b565b600081815b8451811015612f86576000858281518110612f3c57612f3c613802565b60200260200101519050808311612f625760008381526020829052604090209250612f73565b600081815260208490526040902092505b5080612f7e8161382e565b915050612f1f565b509392505050565b6000547f00000000000000000000000000000000000000000000000000000000000000008311156130275760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f676800000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190613099908790613922565b6fffffffffffffffffffffffffffffffff1681526020018583602001516130c09190613922565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260046020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561324c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131ba6000888488612c33565b61322c5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b816132368161382e565b92505080806132449061382e565b91505061316d565b5060008190556129eb565b6001600160a01b038116811461262057600080fd5b6000806040838503121561327f57600080fd5b82359150602083013561329181613257565b809150509250929050565b6001600160e01b03198116811461262057600080fd5b6000602082840312156132c457600080fd5b81356122c38161329c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613300576133006132cf565b604051601f8501601f19908116603f01168101908282118183101715613328576133286132cf565b8160405280935085815286868601111561334157600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561336d57600080fd5b813567ffffffffffffffff81111561338457600080fd5b8201601f8101841361339557600080fd5b611c5c848235602084016132e5565b60005b838110156133bf5781810151838201526020016133a7565b83811115611ced5750506000910152565b600081518084526133e88160208601602086016133a4565b601f01601f19169290920160200192915050565b6020815260006122c360208301846133d0565b60006020828403121561342157600080fd5b5035919050565b6000806040838503121561343b57600080fd5b823561344681613257565b946020939093013593505050565b60008060006060848603121561346957600080fd5b8335925060208401359150604084013561348281613257565b809150509250925092565b6000806000606084860312156134a257600080fd5b83356134ad81613257565b925060208401356134bd81613257565b929592945050506040919091013590565b6000602082840312156134e057600080fd5b81356122c381613257565b60008083601f8401126134fd57600080fd5b50813567ffffffffffffffff81111561351557600080fd5b6020830191508360208260051b850101111561353057600080fd5b9250929050565b60008060006040848603121561354c57600080fd5b833561355781613257565b9250602084013567ffffffffffffffff81111561357357600080fd5b61357f868287016134eb565b9497909650939450505050565b6000806040838503121561359f57600080fd5b82356135aa81613257565b91506020830135801515811461329157600080fd5b600080604083850312156135d257600080fd5b50508035926020909101359150565b600080600080608085870312156135f757600080fd5b843561360281613257565b9350602085013561361281613257565b925060408501359150606085013567ffffffffffffffff81111561363557600080fd5b8501601f8101871361364657600080fd5b613655878235602084016132e5565b91505092959194509250565b60008060006040848603121561367657600080fd5b83359250602084013567ffffffffffffffff81111561357357600080fd5b600080604083850312156136a757600080fd5b82356136b281613257565b9150602083013561329181613257565b600181811c908216806136d657607f821691505b6020821081036136f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561095d57600081815260208120601f850160051c810160208610156137235750805b601f850160051c820191505b818110156129eb5782815560010161372f565b815167ffffffffffffffff81111561375c5761375c6132cf565b6137708161376a84546136c2565b846136fc565b602080601f8311600181146137a5576000841561378d5750858301515b600019600386901b1c1916600185901b1785556129eb565b600085815260208120601f198616915b828110156137d4578886015182559484019460019091019084016137b5565b50858210156137f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361384157613841613818565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261386d5761386d613848565b500490565b600081600019048311821515161561388c5761388c613818565b500290565b600082198211156138a4576138a4613818565b500190565b600083516138bb8184602088016133a4565b8351908301906138cf8183602088016133a4565b01949350505050565b6000602082840312156138ea57600080fd5b5051919050565b60006fffffffffffffffffffffffffffffffff8381169083168181101561391a5761391a613818565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156138cf576138cf613818565b60008282101561395f5761395f613818565b500390565b60008161397357613973613818565b506000190190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261117e60808301846133d0565b6000602082840312156139bf57600080fd5b81516122c38161329c565b6000826139d9576139d9613848565b50069056fea264697066735822122065bc0e4846f33e4ccb446eb96db2afae109d7f73b972a08e055c5865984e9b5964736f6c634300080f003368747470733a2f2f75732d63656e7472616c312d626174746c652d62756e6e6965732d6d696e742e636c6f756466756e6374696f6e732e6e65742f6765742d6d657461646174613f746f6b656e69643d455243373231413a207472616e7366657220746f206e6f6e204552433732315200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001389000000000000000000000000000000000000000000000000013fbe85edc90000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000000000000000001254686520426174746c652042756e6e696573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045442423100000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102e65760003560e01c80638da5cb5b11610184578063c2218fdd116100d6578063d52c57e01161008a578063e985e9c511610064578063e985e9c5146107e2578063eb14b3531461082b578063f2fde38b1461084b57600080fd5b8063d52c57e014610796578063d5abeb01146107b6578063d7224ba0146107cc57600080fd5b8063c87b56dd116100bb578063c87b56dd14610736578063d3ca2e4314610756578063d4d7b19a1461077657600080fd5b8063c2218fdd146106f6578063c6f6f2161461071657600080fd5b8063a9e966b711610138578063b88d4fde11610112578063b88d4fde146106ad578063ba41b0c6146106cd578063c19d93fb146106e057600080fd5b8063a9e966b714610658578063af573db214610678578063b71051e21461068d57600080fd5b806395d89b411161016957806395d89b411461060d578063a035b1fe14610622578063a22cb4651461063857600080fd5b80638da5cb5b146105d957806394a81c70146105f757600080fd5b80632d3456701161023d5780636352211e116101f157806370a08231116101cb57806370a0823114610567578063715018a6146105875780637ad71f721461059c57600080fd5b80636352211e146105075780636776216914610527578063704802751461054757600080fd5b806342842e0e1161022257806342842e0e146104b15780634f6ccce7146104d157806355ea7328146104f157600080fd5b80632d345670146104715780632f745c591461049157600080fd5b8063095ea7b31161029f5780631b8926a9116102795780631b8926a91461041b5780631d1e715b1461043157806323b872dd1461045157600080fd5b8063095ea7b3146103bc5780630b74f6ee146103dc57806318160ddd146103fc57600080fd5b806302fe5305116102d057806302fe53051461034257806306fdde0314610362578063081812fc1461038457600080fd5b8062f714ce146102eb57806301ffc9a71461030d575b600080fd5b3480156102f757600080fd5b5061030b61030636600461326c565b61086b565b005b34801561031957600080fd5b5061032d6103283660046132b2565b610962565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5061030b61035d36600461335b565b610a33565b34801561036e57600080fd5b50610377610a9d565b60405161033991906133fc565b34801561039057600080fd5b506103a461039f36600461340f565b610b2f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b5061030b6103d7366004613428565b610bca565b3480156103e857600080fd5b5061030b6103f736600461340f565b610cf7565b34801561040857600080fd5b506000545b604051908152602001610339565b34801561042757600080fd5b5061040d600f5481565b34801561043d57600080fd5b5061030b61044c366004613454565b610d56565b34801561045d57600080fd5b5061030b61046c36600461348d565b610e27565b34801561047d57600080fd5b5061030b61048c3660046134ce565b610e32565b34801561049d57600080fd5b5061040d6104ac366004613428565b610ead565b3480156104bd57600080fd5b5061030b6104cc36600461348d565b611043565b3480156104dd57600080fd5b5061040d6104ec36600461340f565b61105e565b3480156104fd57600080fd5b5061040d60105481565b34801561051357600080fd5b506103a461052236600461340f565b6110da565b34801561053357600080fd5b5061032d610542366004613537565b6110ec565b34801561055357600080fd5b5061030b6105623660046134ce565b611188565b34801561057357600080fd5b5061040d6105823660046134ce565b611206565b34801561059357600080fd5b5061030b6112b2565b3480156105a857600080fd5b506105bc6105b736600461340f565b611318565b604080519283526001600160a01b03909116602083015201610339565b3480156105e557600080fd5b506009546001600160a01b03166103a4565b34801561060357600080fd5b5061040d600d5481565b34801561061957600080fd5b5061037761134f565b34801561062e57600080fd5b5061040d600e5481565b34801561064457600080fd5b5061030b61065336600461358c565b61135e565b34801561066457600080fd5b5061030b61067336600461340f565b611422565b34801561068457600080fd5b5061030b611539565b34801561069957600080fd5b5061040d6106a83660046135bf565b611bf0565b3480156106b957600080fd5b5061030b6106c83660046135e1565b611c64565b61030b6106db366004613661565b611cf3565b3480156106ec57600080fd5b5061040d60125481565b34801561070257600080fd5b5061030b61071136600461340f565b61211d565b34801561072257600080fd5b5061030b61073136600461340f565b612186565b34801561074257600080fd5b5061037761075136600461340f565b6121ef565b34801561076257600080fd5b50600c546103a4906001600160a01b031681565b34801561078257600080fd5b5061032d6107913660046134ce565b6122ca565b3480156107a257600080fd5b5061030b6107b136600461326c565b61235c565b3480156107c257600080fd5b5061040d600b5481565b3480156107d857600080fd5b5061040d60085481565b3480156107ee57600080fd5b5061032d6107fd366004613694565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561083757600080fd5b5061030b6108463660046134ce565b612482565b34801561085757600080fd5b5061030b6108663660046134ce565b612541565b6009546001600160a01b031633146108ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610917576040519150601f19603f3d011682016040523d82523d6000602084013e61091c565b606091505b505090508061095d5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109c557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109f957506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610a2d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6009546001600160a01b03163314610a8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6007610a998282613742565b5050565b606060018054610aac906136c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad8906136c2565b8015610b255780601f10610afa57610100808354040283529160200191610b25565b820191906000526020600020905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b6000610b3c826000541190565b610bae5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084016108c1565b506000908152600560205260409020546001600160a01b031690565b6000610bd5826110da565b9050806001600160a01b0316836001600160a01b031603610c5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b336001600160a01b0382161480610c7a5750610c7a81336107fd565b610cec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108c1565b61095d838383612629565b6009546001600160a01b03163314610d515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b601055565b6009546001600160a01b03163314610db05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b8160148481548110610dc457610dc4613802565b9060005260206000209060020201600001819055508060148481548110610ded57610ded613802565b906000526020600020906002020160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61095d838383612692565b6009546001600160a01b03163314610e8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000610eb883611206565b8210610f2c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f647300000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b600080549080805b83811015610fd4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610f8757805192505b876001600160a01b0316836001600160a01b031603610fc157868403610fb357509350610a2d92505050565b83610fbd8161382e565b9450505b5080610fcc8161382e565b915050610f34565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e64657800000000000000000000000000000000000060648201526084016108c1565b61095d83838360405180602001604052806000815250611c64565b6000805482106110d65760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e6473000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b5090565b60006110e5826129f3565b5192915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660208201526000908190603401604051602081830303815290604052805190602001209050600061117e85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d549150859050612bbe565b9695505050505050565b6009546001600160a01b031633146111e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60006001600160a01b0382166112845760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016108c1565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b6009546001600160a01b0316331461130c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6113166000612bd4565b565b6014818154811061132857600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b031682565b606060028054610aac906136c2565b336001600160a01b038316036113b65760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108c1565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526013602052604090205460ff1615156001146114865760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b60068111156114fd5760405162461bcd60e51b815260206004820152602860248201527f53746174652063616e206f6e6c792062652066726f6d203020746f20362c206960448201527f6e636c757369766500000000000000000000000000000000000000000000000060648201526084016108c1565b60128190556040518181527f8fd8f487a1d703cca2ded1250c8e7c8c1ae6f0b6cdc81883a282e0863a6d7283906020015b60405180910390a150565b3360009081526013602052604090205460ff16151560011461159d5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b6002600a54036115ef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c1565b6002600a55601480544791600091611628918491849061161157611611613802565b906000526020600020906002020160000154611bf0565b90506000601460008154811061164057611640613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d806000811461169c576040519150601f19603f3d011682016040523d82523d6000602084013e6116a1565b606091505b50509050806116e25760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006116fc84601460018154811061161157611611613802565b90506000601460018154811061171457611714613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611770576040519150601f19603f3d011682016040523d82523d6000602084013e611775565b606091505b50509050806117b65760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006117d086601460028154811061161157611611613802565b9050600060146002815481106117e8576117e8613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611844576040519150601f19603f3d011682016040523d82523d6000602084013e611849565b606091505b505090508061188a5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006118a488601460038154811061161157611611613802565b9050600060146003815481106118bc576118bc613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611918576040519150601f19603f3d011682016040523d82523d6000602084013e61191d565b606091505b505090508061195e5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b60006119788a601460048154811061161157611611613802565b90506000601460048154811061199057611990613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d80600081146119ec576040519150601f19603f3d011682016040523d82523d6000602084013e6119f1565b606091505b5050905080611a325760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b6000611a4c8c601460058154811061161157611611613802565b905060006014600581548110611a6457611a64613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611ac0576040519150601f19603f3d011682016040523d82523d6000602084013e611ac5565b606091505b5050905080611b065760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b6000611b208e601460068154811061161157611611613802565b905060006014600681548110611b3857611b38613802565b600091825260208220600290910201600101546040516001600160a01b039091169184919081818185875af1925050503d8060008114611b94576040519150601f19603f3d011682016040523d82523d6000602084013e611b99565b606091505b5050905080611bda5760405162461bcd60e51b815260206004820152600d60248201526c151c985b9cd9995c8819985a5b609a1b60448201526064016108c1565b50506001600a5550505050505050505050505050565b60006064831015611c435760405162461bcd60e51b815260206004820152601460248201527f56616c7565206d757374206265203e3d2031303000000000000000000000000060448201526064016108c1565b6000611c5060648561385e565b9050611c5c8382613872565b949350505050565b611c6f848484612692565b611c7b84848484612c33565b611ced5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b50505050565b6002600a5403611d455760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c1565b6002600a55601254611d995760405162461bcd60e51b815260206004820152600e60248201527f53616c6520697320636c6f73656400000000000000000000000000000000000060448201526064016108c1565b600b5483611da660005490565b611db09190613891565b1115611dfe5760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820737570706c79000000000000000000000000000060448201526064016108c1565b601154831115611e505760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820706572207478000000000000000000000000000060448201526064016108c1565b600e5460125460011480611e6657506012546004145b80611e7357506012546005145b15611fc657601254600103611ee057611e8b336122ca565b611ed75760405162461bcd60e51b815260206004820152601760248201527f4d75737420686f6c6420612067656e65736973204e465400000000000000000060448201526064016108c1565b5060105461206b565b601254600403611fa557611ef3336122ca565b80611f055750611f05335b84846110ec565b611f765760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920686f6c6465727320616e6420616c6c6f77206c6973742063616e2060448201527f6d696e740000000000000000000000000000000000000000000000000000000060648201526084016108c1565b611f7f336122ca565b15611f8d575060105461206b565b611f9633611efe565b15611fa05750600f545b61206b565b601254600503611fa057611fb8336122ca565b15611fa0575060105461206b565b60125460021480611fd957506012546006145b1561206b5760125460020361204e576000611ff53385856110ec565b9050806120445760405162461bcd60e51b815260206004820152600f60248201527f416c6c6f77206c697374206f6e6c79000000000000000000000000000000000060448201526064016108c1565b5050600f5461206b565b60125460060361206b5761206133611efe565b1561206b5750600f545b6120758482613872565b34146120c35760405162461bcd60e51b815260206004820152601c60248201527f696e636f727265637420616d6f756e74206f66204554482073656e740000000060448201526064016108c1565b6120cd3385612dbc565b6040805133808252346020830152818301526060810186905290517f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a9181900360800190a150506001600a555050565b3360009081526013602052604090205460ff1615156001146121815760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600d55565b3360009081526013602052604090205460ff1615156001146121ea5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b601155565b60606121fc826000541190565b61226e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108c1565b6000612278612dd6565b9050600081511161229857604051806020016040528060008152506122c3565b806122a284612de5565b6040516020016122b39291906138a9565b6040516020818303038152906040525b9392505050565b600c546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015612331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235591906138d8565b1192915050565b3360009081526013602052604090205460ff1615156001146123c05760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600b54826123cd60005490565b6123d79190613891565b11156124255760405162461bcd60e51b815260206004820152601260248201527f65786365656473206d617820737570706c79000000000000000000000000000060448201526064016108c1565b61242f8183612dbc565b60408051338152600060208201526001600160a01b038316818301526060810184905290517f58303c2ecff4b8a524f2f8ca478d8683b492b3419026f7199667453c2f15412a9181900360800190a15050565b3360009081526013602052604090205460ff1615156001146124e65760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c7941646d696e3a2053656e646572206d7573742062652061646d696e0060448201526064016108c1565b600c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f6bfb3e852628f17e1e2a92c9d70a476c2246895bafc4330295244904f86ac5cc9060200161152e565b6009546001600160a01b0316331461259b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c1565b6001600160a01b0381166126175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108c1565b61262081612bd4565b50565b3b151590565b600082815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061269d826129f3565b80519091506000906001600160a01b0316336001600160a01b031614806126d45750336126c984610b2f565b6001600160a01b0316145b806126e6575081516126e690336107fd565b90508061275b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016108c1565b846001600160a01b031682600001516001600160a01b0316146127e65760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e6572000000000000000000000000000000000000000000000000000060648201526084016108c1565b6127f66000848460000151612629565b6001600160a01b03851660009081526004602052604081208054600192906128319084906fffffffffffffffffffffffffffffffff166138f1565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261288691859116613922565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612917846001613891565b6000818152600360205260409020549091506001600160a01b03166129a957612941816000541190565b156129a95760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152612a12826000541190565b612a845760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e0000000000000000000000000000000000000000000060648201526084016108c1565b60007f00000000000000000000000000000000000000000000000000000000000000648310612ae557612ad77f00000000000000000000000000000000000000000000000000000000000000648461394d565b612ae2906001613891565b90505b825b818110612b4f576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612b3c57949350505050565b5080612b4781613964565b915050612ae7565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e000000000000000000000000000000000060648201526084016108c1565b600082612bcb8584612f1a565b14949350505050565b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15612db1576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612c9090339089908890889060040161397b565b6020604051808303816000875af1925050508015612ccb575060408051601f3d908101601f19168201909252612cc8918101906139ad565b60015b612d7e573d808015612cf9576040519150601f19603f3d011682016040523d82523d6000602084013e612cfe565b606091505b508051600003612d765760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611c5c565b506001949350505050565b610a99828260405180602001604052806000815250612f8e565b606060078054610aac906136c2565b606081600003612e2857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e525780612e3c8161382e565b9150612e4b9050600a8361385e565b9150612e2c565b60008167ffffffffffffffff811115612e6d57612e6d6132cf565b6040519080825280601f01601f191660200182016040528015612e97576020820181803683370190505b5090505b8415611c5c57612eac60018361394d565b9150612eb9600a866139ca565b612ec4906030613891565b60f81b818381518110612ed957612ed9613802565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f13600a8661385e565b9450612e9b565b600081815b8451811015612f86576000858281518110612f3c57612f3c613802565b60200260200101519050808311612f625760008381526020829052604090209250612f73565b600081815260208490526040902092505b5080612f7e8161382e565b915050612f1f565b509392505050565b6000547f00000000000000000000000000000000000000000000000000000000000000648311156130275760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f676800000000000000000000000000000000000000000000000000000000000060648201526084016108c1565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190613099908790613922565b6fffffffffffffffffffffffffffffffff1681526020018583602001516130c09190613922565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260046020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561324c5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131ba6000888488612c33565b61322c5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e7465720000000000000000000000000060648201526084016108c1565b816132368161382e565b92505080806132449061382e565b91505061316d565b5060008190556129eb565b6001600160a01b038116811461262057600080fd5b6000806040838503121561327f57600080fd5b82359150602083013561329181613257565b809150509250929050565b6001600160e01b03198116811461262057600080fd5b6000602082840312156132c457600080fd5b81356122c38161329c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613300576133006132cf565b604051601f8501601f19908116603f01168101908282118183101715613328576133286132cf565b8160405280935085815286868601111561334157600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561336d57600080fd5b813567ffffffffffffffff81111561338457600080fd5b8201601f8101841361339557600080fd5b611c5c848235602084016132e5565b60005b838110156133bf5781810151838201526020016133a7565b83811115611ced5750506000910152565b600081518084526133e88160208601602086016133a4565b601f01601f19169290920160200192915050565b6020815260006122c360208301846133d0565b60006020828403121561342157600080fd5b5035919050565b6000806040838503121561343b57600080fd5b823561344681613257565b946020939093013593505050565b60008060006060848603121561346957600080fd5b8335925060208401359150604084013561348281613257565b809150509250925092565b6000806000606084860312156134a257600080fd5b83356134ad81613257565b925060208401356134bd81613257565b929592945050506040919091013590565b6000602082840312156134e057600080fd5b81356122c381613257565b60008083601f8401126134fd57600080fd5b50813567ffffffffffffffff81111561351557600080fd5b6020830191508360208260051b850101111561353057600080fd5b9250929050565b60008060006040848603121561354c57600080fd5b833561355781613257565b9250602084013567ffffffffffffffff81111561357357600080fd5b61357f868287016134eb565b9497909650939450505050565b6000806040838503121561359f57600080fd5b82356135aa81613257565b91506020830135801515811461329157600080fd5b600080604083850312156135d257600080fd5b50508035926020909101359150565b600080600080608085870312156135f757600080fd5b843561360281613257565b9350602085013561361281613257565b925060408501359150606085013567ffffffffffffffff81111561363557600080fd5b8501601f8101871361364657600080fd5b613655878235602084016132e5565b91505092959194509250565b60008060006040848603121561367657600080fd5b83359250602084013567ffffffffffffffff81111561357357600080fd5b600080604083850312156136a757600080fd5b82356136b281613257565b9150602083013561329181613257565b600181811c908216806136d657607f821691505b6020821081036136f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561095d57600081815260208120601f850160051c810160208610156137235750805b601f850160051c820191505b818110156129eb5782815560010161372f565b815167ffffffffffffffff81111561375c5761375c6132cf565b6137708161376a84546136c2565b846136fc565b602080601f8311600181146137a5576000841561378d5750858301515b600019600386901b1c1916600185901b1785556129eb565b600085815260208120601f198616915b828110156137d4578886015182559484019460019091019084016137b5565b50858210156137f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361384157613841613818565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261386d5761386d613848565b500490565b600081600019048311821515161561388c5761388c613818565b500290565b600082198211156138a4576138a4613818565b500190565b600083516138bb8184602088016133a4565b8351908301906138cf8183602088016133a4565b01949350505050565b6000602082840312156138ea57600080fd5b5051919050565b60006fffffffffffffffffffffffffffffffff8381169083168181101561391a5761391a613818565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156138cf576138cf613818565b60008282101561395f5761395f613818565b500390565b60008161397357613973613818565b506000190190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261117e60808301846133d0565b6000602082840312156139bf57600080fd5b81516122c38161329c565b6000826139d9576139d9613848565b50069056fea264697066735822122065bc0e4846f33e4ccb446eb96db2afae109d7f73b972a08e055c5865984e9b5964736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001389000000000000000000000000000000000000000000000000013fbe85edc90000000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000000000000000001254686520426174746c652042756e6e696573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045442423100000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): The Battle Bunnies
Arg [1] : symbol (string): TBB1
Arg [2] : _maxSupply (uint256): 5001
Arg [3] : _price (uint256): 90000000000000000
Arg [4] : _alPrice (uint256): 80000000000000000
Arg [5] : _holderPrice (uint256): 70000000000000000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001389
Arg [3] : 000000000000000000000000000000000000000000000000013fbe85edc90000
Arg [4] : 000000000000000000000000000000000000000000000000011c37937e080000
Arg [5] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [7] : 54686520426174746c652042756e6e6965730000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 5442423100000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
176:7502:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4860:191;;;;;;;;;;-1:-1:-1;4860:191:1;;;;;:::i;:::-;;:::i;:::-;;3880:358:5;;;;;;;;;;-1:-1:-1;3880:358:5;;;;;:::i;:::-;;:::i;:::-;;;1114:14:17;;1107:22;1089:41;;1077:2;1062:18;3880:358:5;;;;;;;;5057:82:1;;;;;;;;;;-1:-1:-1;5057:82:1;;;;;:::i;:::-;;:::i;5544:92:5:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7024:200::-;;;;;;;;;;-1:-1:-1;7024:200:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3641:55:17;;;3623:74;;3611:2;3596:18;7024:200:5;3477:226:17;6602:369:5;;;;;;;;;;-1:-1:-1;6602:369:5;;;;;:::i;:::-;;:::i;5343:108:1:-;;;;;;;;;;-1:-1:-1;5343:108:1;;;;;:::i;:::-;;:::i;2486:92:5:-;;;;;;;;;;-1:-1:-1;2539:7:5;2561:12;2486:92;;;4182:25:17;;;4170:2;4155:18;2486:92:5;4036:177:17;410:22:1;;;;;;;;;;;;;;;;7258:226;;;;;;;;;;-1:-1:-1;7258:226:1;;;;;:::i;:::-;;:::i;7842:136:5:-;;;;;;;;;;-1:-1:-1;7842:136:5;;;;;:::i;:::-;;:::i;7584:92:1:-;;;;;;;;;;-1:-1:-1;7584:92:1;;;;;:::i;:::-;;:::i;3100:721:5:-;;;;;;;;;;-1:-1:-1;3100:721:5;;;;;:::i;:::-;;:::i;8036:151::-;;;;;;;;;;-1:-1:-1;8036:151:5;;;;;:::i;:::-;;:::i;2642:174::-;;;;;;;;;;-1:-1:-1;2642:174:5;;;;;:::i;:::-;;:::i;438:26:1:-;;;;;;;;;;;;;;;;5374:116:5;;;;;;;;;;-1:-1:-1;5374:116:5;;;;;:::i;:::-;;:::i;2514:262:1:-;;;;;;;;;;-1:-1:-1;2514:262:1;;;;;:::i;:::-;;:::i;7490:88::-;;;;;;;;;;-1:-1:-1;7490:88:1;;;;;:::i;:::-;;:::i;4289:208:5:-;;;;;;;;;;-1:-1:-1;4289:208:5;;;;;:::i;:::-;;:::i;1661:101:13:-;;;;;;;;;;;;;:::i;1149:24:1:-;;;;;;;;;;-1:-1:-1;1149:24:1;;;;;:::i;:::-;;:::i;:::-;;;;6490:25:17;;;-1:-1:-1;;;;;6551:55:17;;;6546:2;6531:18;;6524:83;6463:18;1149:24:1;6316:297:17;1029:85:13;;;;;;;;;;-1:-1:-1;1101:6:13;;-1:-1:-1;;;;;1101:6:13;1029:85;;356:21:1;;;;;;;;;;;;;;;;5692:96:5;;;;;;;;;;;;;:::i;384:20:1:-;;;;;;;;;;;;;;;;7283:269:5;;;;;;;;;;-1:-1:-1;7283:269:5;;;;;:::i;:::-;;:::i;5145:192:1:-;;;;;;;;;;-1:-1:-1;5145:192:1;;;;;:::i;:::-;;:::i;5651:1451::-;;;;;;;;;;;;;:::i;90:219:14:-;;;;;;;;;;-1:-1:-1;90:219:14;;;;;:::i;:::-;;:::i;8245:300:5:-;;;;;;;;;;-1:-1:-1;8245:300:5;;;;;:::i;:::-;;:::i;2913:1683:1:-;;;;;;:::i;:::-;;:::i;696:20::-;;;;;;;;;;;;;;;;5563:82;;;;;;;;;;-1:-1:-1;5563:82:1;;;;;:::i;:::-;;:::i;5457:96::-;;;;;;;;;;-1:-1:-1;5457:96:1;;;;;:::i;:::-;;:::i;5846:377:5:-;;;;;;;;;;-1:-1:-1;5846:377:5;;;;;:::i;:::-;;:::i;304:26:1:-;;;;;;;;;;-1:-1:-1;304:26:1;;;;-1:-1:-1;;;;;304:26:1;;;2782:125;;;;;;;;;;-1:-1:-1;2782:125:1;;;;;:::i;:::-;;:::i;4602:252::-;;;;;;;;;;-1:-1:-1;4602:252:1;;;;;:::i;:::-;;:::i;274:24::-;;;;;;;;;;;;;;;;12519:43:5;;;;;;;;;;;;;;;;7610:178;;;;;;;;;;-1:-1:-1;7610:178:5;;;;;:::i;:::-;-1:-1:-1;;;;;7748:25:5;;;7727:4;7748:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7610:178;7108:144:1;;;;;;;;;;-1:-1:-1;7108:144:1;;;;;:::i;:::-;;:::i;1911:198:13:-;;;;;;;;;;-1:-1:-1;1911:198:13;;;;;:::i;:::-;;:::i;4860:191:1:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;;;;;;;;;4951:12:1::1;4968:9;-1:-1:-1::0;;;;;4968:14:1::1;4990:6;4968:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4950:51;;;5019:7;5011:33;;;::::0;-1:-1:-1;;;5011:33:1;;10750:2:17;5011:33:1::1;::::0;::::1;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;5011:33:1::1;10548:337:17::0;5011:33:1::1;4940:111;4860:191:::0;;:::o;3880:358:5:-;4002:4;-1:-1:-1;;;;;;4029:40:5;;4044:25;4029:40;;:98;;-1:-1:-1;;;;;;;4079:48:5;;4094:33;4079:48;4029:98;:158;;;-1:-1:-1;;;;;;;4137:50:5;;4152:35;4137:50;4029:158;:204;;;-1:-1:-1;886:25:3;-1:-1:-1;;;;;;871:40:3;;;4197:36:5;4016:217;3880:358;-1:-1:-1;;3880:358:5:o;5057:82:1:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;5122:3:1::1;:10;5128:4:::0;5122:3;:10:::1;:::i;:::-;;5057:82:::0;:::o;5544:92:5:-;5598:13;5626:5;5619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:92;:::o;7024:200::-;7092:7;7115:16;7123:7;8832:4;8861:12;-1:-1:-1;8851:22:5;8775:103;7115:16;7107:74;;;;-1:-1:-1;;;7107:74:5;;13917:2:17;7107:74:5;;;13899:21:17;13956:2;13936:18;;;13929:30;13995:34;13975:18;;;13968:62;14066:15;14046:18;;;14039:43;14099:19;;7107:74:5;13715:409:17;7107:74:5;-1:-1:-1;7195:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;7195:24:5;;7024:200::o;6602:369::-;6670:13;6686:24;6702:7;6686:15;:24::i;:::-;6670:40;;6730:5;-1:-1:-1;;;;;6724:11:5;:2;-1:-1:-1;;;;;6724:11:5;;6716:58;;;;-1:-1:-1;;;6716:58:5;;14331:2:17;6716:58:5;;;14313:21:17;14370:2;14350:18;;;14343:30;14409:34;14389:18;;;14382:62;14480:4;14460:18;;;14453:32;14502:19;;6716:58:5;14129:398:17;6716:58:5;667:10:2;-1:-1:-1;;;;;6796:21:5;;;;:62;;-1:-1:-1;6821:37:5;6838:5;667:10:2;7610:178:5;:::i;6821:37::-;6781:150;;;;-1:-1:-1;;;6781:150:5;;14734:2:17;6781:150:5;;;14716:21:17;14773:2;14753:18;;;14746:30;14812:34;14792:18;;;14785:62;14883:27;14863:18;;;14856:55;14928:19;;6781:150:5;14532:421:17;6781:150:5;6938:28;6947:2;6951:7;6960:5;6938:8;:28::i;5343:108:1:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;5418:11:1::1;:26:::0;5343:108::o;7258:226::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;7417:11:1::1;7381:7;7389:13;7381:22;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;:47;;;;7470:7;7438;7446:13;7438:22;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;:39;;;;;-1:-1:-1::0;;;;;7438:39:1::1;;;;;-1:-1:-1::0;;;;;7438:39:1::1;;;;;;7258:226:::0;;;:::o;7842:136:5:-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;7584:92:1:-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;-1:-1:-1;;;;;7648:13:1::1;7664:5;7648:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;7648:21:1::1;::::0;;7584:92::o;3100:721:5:-;3205:7;3238:16;3248:5;3238:9;:16::i;:::-;3230:5;:24;3222:71;;;;-1:-1:-1;;;3222:71:5;;15349:2:17;3222:71:5;;;15331:21:17;15388:2;15368:18;;;15361:30;15427:34;15407:18;;;15400:62;15498:4;15478:18;;;15471:32;15520:19;;3222:71:5;15147:398:17;3222:71:5;3299:22;2561:12;;;3299:22;;3416:339;3440:14;3436:1;:18;3416:339;;;3469:31;3503:14;;;:11;:14;;;;;;;;;3469:48;;;;;;;;;-1:-1:-1;;;;;3469:48:5;;;;;-1:-1:-1;;;3469:48:5;;;;;;;;;;;;3529:28;3525:87;;3589:14;;;-1:-1:-1;3525:87:5;3644:5;-1:-1:-1;;;;;3623:26:5;:17;-1:-1:-1;;;;;3623:26:5;;3619:130;;3680:5;3665:11;:20;3661:57;;-1:-1:-1;3706:1:5;-1:-1:-1;3699:8:5;;-1:-1:-1;;;3699:8:5;3661:57;3727:13;;;;:::i;:::-;;;;3619:130;-1:-1:-1;3456:3:5;;;;:::i;:::-;;;;3416:339;;;-1:-1:-1;3760:56:5;;-1:-1:-1;;;3760:56:5;;16141:2:17;3760:56:5;;;16123:21:17;16180:2;16160:18;;;16153:30;16219:34;16199:18;;;16192:62;16290:16;16270:18;;;16263:44;16324:19;;3760:56:5;15939:410:17;8036:151:5;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;2642:174::-;2709:7;2561:12;;2732:5;:21;2724:69;;;;-1:-1:-1;;;2724:69:5;;16556:2:17;2724:69:5;;;16538:21:17;16595:2;16575:18;;;16568:30;16634:34;16614:18;;;16607:62;16705:5;16685:18;;;16678:33;16728:19;;2724:69:5;16354:399:17;2724:69:5;-1:-1:-1;2806:5:5;2642:174::o;5374:116::-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;5374:116;-1:-1:-1;;5374:116:5:o;2514:262:1:-;2651:28;;16920:66:17;16907:2;16903:15;;;16899:88;2651:28:1;;;16887:101:17;2610:4:1;;;;17004:12:17;;2651:28:1;;;;;;;;;;;;2641:39;;;;;;2626:54;;2690:9;2702:46;2721:12;;2702:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2735:6:1;;;-1:-1:-1;2743:4:1;;-1:-1:-1;2702:18:1;:46::i;:::-;2690:58;2514:262;-1:-1:-1;;;;;;2514:262:1:o;7490:88::-;1101:6:13;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;-1:-1:-1;;;;;7551:13:1::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;7551:20:1::1;7567:4;7551:20;::::0;;7490:88::o;4289:208:5:-;4353:7;-1:-1:-1;;;;;4376:19:5;;4368:75;;;;-1:-1:-1;;;4368:75:5;;17229:2:17;4368:75:5;;;17211:21:17;17268:2;17248:18;;;17241:30;17307:34;17287:18;;;17280:62;17378:13;17358:18;;;17351:41;17409:19;;4368:75:5;17027:407:17;4368:75:5;-1:-1:-1;;;;;;4464:19:5;;;;;:12;:19;;;;;:27;;;;4289:208::o;1661:101:13:-;1101:6;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1149:24:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1149:24:1;;:::o;5692:96:5:-;5748:13;5776:7;5769:14;;;;;:::i;7283:269::-;667:10:2;-1:-1:-1;;;;;7373:24:5;;;7365:63;;;;-1:-1:-1;;;7365:63:5;;17641:2:17;7365:63:5;;;17623:21:17;17680:2;17660:18;;;17653:30;17719:28;17699:18;;;17692:56;17765:18;;7365:63:5;17439:350:17;7365:63:5;667:10:2;7435:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;7435:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;7435:53:5;;;;;;;;;;7499:48;;1089:41:17;;;7435:42:5;;667:10:2;7499:48:5;;1062:18:17;7499:48:5;;;;;;;7283:269;;:::o;5145:192:1:-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;5226:1:::1;5216:6;:11;;5208:64;;;::::0;-1:-1:-1;;;5208:64:1;;18356:2:17;5208:64:1::1;::::0;::::1;18338:21:17::0;18395:2;18375:18;;;18368:30;18434:34;18414:18;;;18407:62;18505:10;18485:18;;;18478:38;18533:19;;5208:64:1::1;18154:404:17::0;5208:64:1::1;5282:5;:14:::0;;;5311:19:::1;::::0;4182:25:17;;;5311:19:1::1;::::0;4170:2:17;4155:18;5311:19:1::1;;;;;;;;5145:192:::0;:::o;5651:1451::-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;1680:1:15::1;2259:7;;:19:::0;2251:63:::1;;;::::0;-1:-1:-1;;;2251:63:15;;18765:2:17;2251:63:15::1;::::0;::::1;18747:21:17::0;18804:2;18784:18;;;18777:30;18843:33;18823:18;;;18816:61;18894:18;;2251:63:15::1;18563:355:17::0;2251:63:15::1;1680:1;2389:7;:18:::0;5807:7:1::2;:10:::0;;5735:21:::2;::::0;5717:15:::2;::::0;5785:44:::2;::::0;5735:21;;5717:15;;5807:10:::2;;;;:::i;:::-;;;;;;;;;;;:21;;;5785:12;:44::i;:::-;5767:62;;5840:13;5858:7;5866:1;5858:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;5858:17:1;;::::2;::::0;5888:7;;5858:43;;:10;:43;5888:7;5858:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5839:62;;;5919:8;5911:34;;;::::0;-1:-1:-1;;;5911:34:1;;10750:2:17;5911:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;5911:34:1::2;10548:337:17::0;5911:34:1::2;5964:15;5982:44;5995:7;6004;6012:1;6004:10;;;;;;;;:::i;5982:44::-;5964:62;;6037:13;6055:7;6063:1;6055:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;6055:17:1;;::::2;::::0;6085:7;;6055:43;;:10;:43;6085:7;6055:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6036:62;;;6116:8;6108:34;;;::::0;-1:-1:-1;;;6108:34:1;;10750:2:17;6108:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;6108:34:1::2;10548:337:17::0;6108:34:1::2;6153:15;6171:44;6184:7;6193;6201:1;6193:10;;;;;;;;:::i;6171:44::-;6153:62;;6226:13;6244:7;6252:1;6244:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;6244:17:1;;::::2;::::0;6274:7;;6244:43;;:10;:43;6274:7;6244:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6225:62;;;6305:8;6297:34;;;::::0;-1:-1:-1;;;6297:34:1;;10750:2:17;6297:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;6297:34:1::2;10548:337:17::0;6297:34:1::2;6350:15;6368:44;6381:7;6390;6398:1;6390:10;;;;;;;;:::i;6368:44::-;6350:62;;6423:13;6441:7;6449:1;6441:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;6441:17:1;;::::2;::::0;6471:7;;6441:43;;:10;:43;6471:7;6441:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6422:62;;;6502:8;6494:34;;;::::0;-1:-1:-1;;;6494:34:1;;10750:2:17;6494:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;6494:34:1::2;10548:337:17::0;6494:34:1::2;6539:15;6557:44;6570:7;6579;6587:1;6579:10;;;;;;;;:::i;6557:44::-;6539:62;;6612:13;6630:7;6638:1;6630:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;6630:17:1;;::::2;::::0;6660:7;;6630:43;;:10;:43;6660:7;6630:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6611:62;;;6691:8;6683:34;;;::::0;-1:-1:-1;;;6683:34:1;;10750:2:17;6683:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;6683:34:1::2;10548:337:17::0;6683:34:1::2;6728:15;6746:44;6759:7;6768;6776:1;6768:10;;;;;;;;:::i;6746:44::-;6728:62;;6801:13;6819:7;6827:1;6819:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;6819:17:1;;::::2;::::0;6849:7;;6819:43;;:10;:43;6849:7;6819:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6800:62;;;6880:8;6872:34;;;::::0;-1:-1:-1;;;6872:34:1;;10750:2:17;6872:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;6872:34:1::2;10548:337:17::0;6872:34:1::2;6917:15;6935:44;6948:7;6957;6965:1;6957:10;;;;;;;;:::i;6935:44::-;6917:62;;6990:13;7008:7;7016:1;7008:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:17;;::::0;:43:::2;::::0;-1:-1:-1;;;;;7008:17:1;;::::2;::::0;7038:7;;7008:43;;:10;:43;7038:7;7008:17;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6989:62;;;7069:8;7061:34;;;::::0;-1:-1:-1;;;7061:34:1;;10750:2:17;7061:34:1::2;::::0;::::2;10732:21:17::0;10789:2;10769:18;;;10762:30;-1:-1:-1;;;10808:18:17;;;10801:43;10861:18;;7061:34:1::2;10548:337:17::0;7061:34:1::2;-1:-1:-1::0;;1637:1:15::1;2562:7;:22:::0;-1:-1:-1;;;;;;;;;;;;;5651:1451:1:o;90:219:14:-;167:7;202:3;193:5;:12;;185:45;;;;-1:-1:-1;;;185:45:14;;19125:2:17;185:45:14;;;19107:21:17;19164:2;19144:18;;;19137:30;19203:22;19183:18;;;19176:50;19243:18;;185:45:14;18923:344:17;185:45:14;240:13;256:11;264:3;256:5;:11;:::i;:::-;240:27;-1:-1:-1;284:18:14;292:10;240:27;284:18;:::i;:::-;277:25;90:219;-1:-1:-1;;;;90:219:14:o;8245:300:5:-;8376:28;8386:4;8392:2;8396:7;8376:9;:28::i;:::-;8425:48;8448:4;8454:2;8458:7;8467:5;8425:22;:48::i;:::-;8410:130;;;;-1:-1:-1;;;8410:130:5;;20021:2:17;8410:130:5;;;20003:21:17;20060:2;20040:18;;;20033:30;20099:34;20079:18;;;20072:62;20170:21;20150:18;;;20143:49;20209:19;;8410:130:5;19819:415:17;8410:130:5;8245:300;;;;:::o;2913:1683:1:-;1680:1:15;2259:7;;:19;2251:63;;;;-1:-1:-1;;;2251:63:15;;18765:2:17;2251:63:15;;;18747:21:17;18804:2;18784:18;;;18777:30;18843:33;18823:18;;;18816:61;18894:18;;2251:63:15;18563:355:17;2251:63:15;1680:1;2389:7;:18;3024:5:1::1;::::0;3016:36:::1;;;::::0;-1:-1:-1;;;3016:36:1;;20441:2:17;3016:36:1::1;::::0;::::1;20423:21:17::0;20480:2;20460:18;;;20453:30;20519:16;20499:18;;;20492:44;20553:18;;3016:36:1::1;20239:338:17::0;3016:36:1::1;3096:9;;3086:6;3070:13;2539:7:5::0;2561:12;;2486:92;3070:13:1::1;:22;;;;:::i;:::-;:35;;3062:66;;;::::0;-1:-1:-1;;;3062:66:1;;20917:2:17;3062:66:1::1;::::0;::::1;20899:21:17::0;20956:2;20936:18;;;20929:30;20995:20;20975:18;;;20968:48;21033:18;;3062:66:1::1;20715:342:17::0;3062:66:1::1;3156:8;;3146:6;:18;;3138:49;;;::::0;-1:-1:-1;;;3138:49:1;;21264:2:17;3138:49:1::1;::::0;::::1;21246:21:17::0;21303:2;21283:18;;;21276:30;21342:20;21322:18;;;21315:48;21380:18;;3138:49:1::1;21062:342:17::0;3138:49:1::1;3218:5;::::0;3237::::1;::::0;3246:1:::1;3237:10;::::0;:24:::1;;;3251:5;;3260:1;3251:10;3237:24;:38;;;;3265:5;;3274:1;3265:10;3237:38;3234:1155;;;3294:5;;3303:1;3294:10:::0;3291:681:::1;;3332:22;667:10:2::0;2782:125:1;:::i;3332:22::-:1;3324:58;;;::::0;-1:-1:-1;;;3324:58:1;;21611:2:17;3324:58:1::1;::::0;::::1;21593:21:17::0;21650:2;21630:18;;;21623:30;21689:25;21669:18;;;21662:53;21732:18;;3324:58:1::1;21409:347:17::0;3324:58:1::1;-1:-1:-1::0;3412:11:1::1;::::0;3234:1155:::1;;3291:681;3447:5;;3456:1;3447:10:::0;3444:528:::1;;3485:22;667:10:2::0;2782:125:1;:::i;3485:22::-:1;:67;;;-1:-1:-1::0;3511:41:1::1;667:10:2::0;3525:12:1::1;3539;;3511:13;:41::i;:::-;3477:116;;;::::0;-1:-1:-1;;;3477:116:1;;21963:2:17;3477:116:1::1;::::0;::::1;21945:21:17::0;22002:2;21982:18;;;21975:30;22041:34;22021:18;;;22014:62;22112:6;22092:18;;;22085:34;22136:19;;3477:116:1::1;21761:400:17::0;3477:116:1::1;3614:22;667:10:2::0;2782:125:1;:::i;3614:22::-:1;3611:203;;;-1:-1:-1::0;3672:11:1::1;::::0;3234:1155:::1;;3611:203;3711:41;667:10:2::0;3725:12:1::1;588:96:2::0;3711:41:1::1;3708:106;;;-1:-1:-1::0;3788:7:1::1;::::0;3708:106:::1;3234:1155;;3444:528;3837:5;;3846:1;3837:10:::0;3834:138:::1;;3870:22;667:10:2::0;2782:125:1;:::i;3870:22::-:1;3867:91;;;-1:-1:-1::0;3928:11:1::1;::::0;3234:1155:::1;;;3991:5;;4000:1;3991:10;:24;;;;4005:5;;4014:1;4005:10;3991:24;3988:401;;;4034:5;;4043:1;4034:10:::0;4031:348:::1;;4064:9;4076:41;667:10:2::0;4104:12:1::1;;4076:13;:41::i;:::-;4064:53;;4143:4;4135:32;;;::::0;-1:-1:-1;;;4135:32:1;;22368:2:17;4135:32:1::1;::::0;::::1;22350:21:17::0;22407:2;22387:18;;;22380:30;22446:17;22426:18;;;22419:45;22481:18;;4135:32:1::1;22166:339:17::0;4135:32:1::1;-1:-1:-1::0;;4197:7:1::1;::::0;4031:348:::1;;;4229:5;;4238:1;4229:10:::0;4225:154:::1;;4262:41;667:10:2::0;4276:12:1::1;588:96:2::0;4262:41:1::1;4259:106;;;-1:-1:-1::0;4339:7:1::1;::::0;4259:106:::1;4420:18;4432:6:::0;4420:9;:18:::1;:::i;:::-;4407:9;:31;4399:72;;;::::0;-1:-1:-1;;;4399:72:1;;22712:2:17;4399:72:1::1;::::0;::::1;22694:21:17::0;22751:2;22731:18;;;22724:30;22790;22770:18;;;22763:58;22838:18;;4399:72:1::1;22510:352:17::0;4399:72:1::1;4490:31;667:10:2::0;4514:6:1::1;4490:9;:31::i;:::-;4536:53;::::0;;667:10:2;23159:34:17;;;4557:9:1::1;23224:2:17::0;23209:18;;23202:34;23252:18;;;23245:43;23319:2;23304:18;;23297:34;;;4536:53:1;;::::1;::::0;;;;23085:3:17;4536:53:1;;::::1;-1:-1:-1::0;;1637:1:15;2562:7;:22;-1:-1:-1;;2913:1683:1:o;5563:82::-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;5625:6:::1;:13:::0;5563:82::o;5457:96::-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;5526:8:::1;:20:::0;5457:96::o;5846:377:5:-;5939:13;5977:16;5985:7;8832:4;8861:12;-1:-1:-1;8851:22:5;8775:103;5977:16;5962:94;;;;-1:-1:-1;;;5962:94:5;;23544:2:17;5962:94:5;;;23526:21:17;23583:2;23563:18;;;23556:30;23622:34;23602:18;;;23595:62;23693:17;23673:18;;;23666:45;23728:19;;5962:94:5;23342:411:17;5962:94:5;6063:21;6087:10;:8;:10::i;:::-;6063:34;;6140:1;6122:7;6116:21;:25;:102;;;;;;;;;;;;;;;;;6176:7;6185:18;:7;:16;:18::i;:::-;6159:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6116:102;6103:115;5846:377;-1:-1:-1;;;5846:377:5:o;2782:125:1:-;2863:11;;:33;;;;;-1:-1:-1;;;;;3641:55:17;;;2863:33:1;;;3623:74:17;2840:4:1;;;;2863:11;;;:21;;3596:18:17;;2863:33:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;2782:125;-1:-1:-1;;2782:125:1:o;4602:252::-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;4717:9:::1;;4707:6;4691:13;2539:7:5::0;2561:12;;2486:92;4691:13:1::1;:22;;;;:::i;:::-;:35;;4683:67;;;::::0;-1:-1:-1;;;4683:67:1;;20917:2:17;4683:67:1::1;::::0;::::1;20899:21:17::0;20956:2;20936:18;;;20929:30;20995:20;20975:18;;;20968:48;21033:18;;4683:67:1::1;20715:342:17::0;4683:67:1::1;4760:29;4770:10;4782:6;4760:9;:29::i;:::-;4804:43;::::0;;667:10:2;23159:34:17;;4825:1:1::1;23224:2:17::0;23209:18;;23202:34;-1:-1:-1;;;;;23272:15:17;;23252:18;;;23245:43;23319:2;23304:18;;23297:34;;;4804:43:1;;::::1;::::0;;;;23085:3:17;4804:43:1;;::::1;4602:252:::0;;:::o;7108:144::-;667:10:2;981:21:1;;;;:7;:21;;;;;;;;:29;;:21;:29;973:73;;;;-1:-1:-1;;;973:73:1;;17996:2:17;973:73:1;;;17978:21:17;18035:2;18015:18;;;18008:30;18074:33;18054:18;;;18047:61;18125:18;;973:73:1;17794:355:17;973:73:1;7175:11:::1;:31:::0;;-1:-1:-1;;7175:31:1::1;-1:-1:-1::0;;;;;7175:31:1;::::1;::::0;;::::1;::::0;;;7221:24:::1;::::0;3623:74:17;;;7221:24:1::1;::::0;3611:2:17;3596:18;7221:24:1::1;3477:226:17::0;1911:198:13;1101:6;;-1:-1:-1;;;;;1101:6:13;667:10:2;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;10179:2:17;1233:68:13;;;10161:21:17;;;10198:18;;;10191:30;10257:34;10237:18;;;10230:62;10309:18;;1233:68:13;9977:356:17;1233:68:13;-1:-1:-1;;;;;1999:22:13;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:13;;25107:2:17;1991:73:13::1;::::0;::::1;25089:21:17::0;25146:2;25126:18;;;25119:30;25185:34;25165:18;;;25158:62;25256:8;25236:18;;;25229:36;25282:19;;1991:73:13::1;24905:402:17::0;1991:73:13::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;718:413:0:-;1078:20;1116:8;;;718:413::o;12350:165:5:-;12442:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;12442:29:5;-1:-1:-1;;;;;12442:29:5;;;;;;;;;12482:28;;12442:24;;12482:28;;;;;;;12350:165;;;:::o;10765:1486::-;10857:35;10895:20;10907:7;10895:11;:20::i;:::-;10964:18;;10857:58;;-1:-1:-1;10922:22:5;;-1:-1:-1;;;;;10948:34:5;667:10:2;-1:-1:-1;;;;;10948:34:5;;:80;;;-1:-1:-1;667:10:2;10992:20:5;11004:7;10992:11;:20::i;:::-;-1:-1:-1;;;;;10992:36:5;;10948:80;:140;;;-1:-1:-1;11055:18:5;;11038:50;;667:10:2;7610:178:5;:::i;11038:50::-;10922:167;;11111:17;11096:98;;;;-1:-1:-1;;;11096:98:5;;25514:2:17;11096:98:5;;;25496:21:17;25553:2;25533:18;;;25526:30;25592:34;25572:18;;;25565:62;25663:20;25643:18;;;25636:48;25701:19;;11096:98:5;25312:414:17;11096:98:5;11238:4;-1:-1:-1;;;;;11216:26:5;:13;:18;;;-1:-1:-1;;;;;11216:26:5;;11201:95;;;;-1:-1:-1;;;11201:95:5;;25933:2:17;11201:95:5;;;25915:21:17;25972:2;25952:18;;;25945:30;26011:34;25991:18;;;25984:62;26082:8;26062:18;;;26055:36;26108:19;;11201:95:5;25731:402:17;11201:95:5;11474:49;11491:1;11495:7;11504:13;:18;;;11474:8;:49::i;:::-;-1:-1:-1;;;;;11530:18:5;;;;;;:12;:18;;;;;:31;;11560:1;;11530:18;:31;;11560:1;;11530:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11567:16:5;;-1:-1:-1;11567:16:5;;;:12;:16;;;;;:29;;-1:-1:-1;;;11567:16:5;;:29;;-1:-1:-1;;11567:29:5;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11625:43:5;;;;;;;;-1:-1:-1;;;;;11625:43:5;;;;;;11651:15;11625:43;;;;;;;;;-1:-1:-1;11602:20:5;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;11602:66:5;-1:-1:-1;;;;;;11602:66:5;;;;;;;;;;;11914:11;11614:7;-1:-1:-1;11914:11:5;:::i;:::-;11976:1;11935:24;;;:11;:24;;;;;:29;11892:33;;-1:-1:-1;;;;;;11935:29:5;11931:229;;11992:20;12000:11;8832:4;8861:12;-1:-1:-1;8851:22:5;8775:103;11992:20;11988:166;;;12051:94;;;;;;;;12077:18;;-1:-1:-1;;;;;12051:94:5;;;;;;12107:28;;;;12051:94;;;;;;;;;;-1:-1:-1;12024:24:5;;;:11;:24;;;;;;;:121;;;;;;;;;-1:-1:-1;;;12024:121:5;-1:-1:-1;;;;;;12024:121:5;;;;;;;;;;;;11988:166;12190:7;12186:2;-1:-1:-1;;;;;12171:27:5;12180:4;-1:-1:-1;;;;;12171:27:5;;;;;;;;;;;12204:42;10851:1400;;;10765:1486;;;:::o;4739:586::-;-1:-1:-1;;;;;;;;;;;;;;;;;4851:16:5;4859:7;8832:4;8861:12;-1:-1:-1;8851:22:5;8775:103;4851:16;4843:71;;;;-1:-1:-1;;;4843:71:5;;26849:2:17;4843:71:5;;;26831:21:17;26888:2;26868:18;;;26861:30;26927:34;26907:18;;;26900:62;26998:12;26978:18;;;26971:40;27028:19;;4843:71:5;26647:406:17;4843:71:5;4921:26;4968:12;4957:7;:23;4953:91;;5011:22;5021:12;5011:7;:22;:::i;:::-;:26;;5036:1;5011:26;:::i;:::-;4990:47;;4953:91;5070:7;5050:207;5087:18;5079:4;:26;5050:207;;5123:31;5157:17;;;:11;:17;;;;;;;;;5123:51;;;;;;;;;-1:-1:-1;;;;;5123:51:5;;;;;-1:-1:-1;;;5123:51:5;;;;;;;;;;;;5186:28;5182:69;;5233:9;4739:586;-1:-1:-1;;;;4739:586:5:o;5182:69::-;-1:-1:-1;5107:6:5;;;;:::i;:::-;;;;5050:207;;;-1:-1:-1;5263:57:5;;-1:-1:-1;;;5263:57:5;;27591:2:17;5263:57:5;;;27573:21:17;27630:2;27610:18;;;27603:30;27669:34;27649:18;;;27642:62;27740:17;27720:18;;;27713:45;27775:19;;5263:57:5;27389:411:17;1154:184:12;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;;1154:184;-1:-1:-1;;;;1154:184:12:o;2263:187:13:-;2355:6;;;-1:-1:-1;;;;;2371:17:13;;;-1:-1:-1;;2371:17:13;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;14020:667:5:-;14152:4;-1:-1:-1;;;;;14168:13:5;;1078:20:0;1116:8;14164:519:5;;14205:72;;;;;-1:-1:-1;;;;;14205:36:5;;;;;:72;;667:10:2;;14256:4:5;;14262:7;;14271:5;;14205:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14205:72:5;;;;;;;;-1:-1:-1;;14205:72:5;;;;;;;;;;;;:::i;:::-;;;14193:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14432:6;:13;14449:1;14432:18;14428:209;;14464:61;;-1:-1:-1;;;14464:61:5;;20021:2:17;14464:61:5;;;20003:21:17;20060:2;20040:18;;;20033:30;20099:34;20079:18;;;20072:62;20170:21;20150:18;;;20143:49;20209:19;;14464:61:5;19819:415:17;14428:209:5;14607:6;14601:13;14592:6;14588:2;14584:15;14577:38;14193:452;-1:-1:-1;;;;;;14325:55:5;14335:45;14325:55;;-1:-1:-1;14318:62:5;;14164:519;-1:-1:-1;14672:4:5;14020:667;;;;;;:::o;8882:96::-;8946:27;8956:2;8960:8;8946:27;;;;;;;;;;;;:9;:27::i;6466:87::-;6517:13;6545:3;6538:10;;;;;:::i;275:703:16:-;331:13;548:5;557:1;548:10;544:51;;-1:-1:-1;;574:10:16;;;;;;;;;;;;;;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:16;;-1:-1:-1;720:2:16;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:16;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:16;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;919:11:16;928:2;919:11;;:::i;:::-;;;791:150;;1689:662:12;1772:7;1814:4;1772:7;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2060:57;;1930:376;;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2234:57;;1930:376;-1:-1:-1;1866:3:12;;;;:::i;:::-;;;;1828:488;;;-1:-1:-1;2332:12:12;1689:662;-1:-1:-1;;;1689:662:12:o;9304:1241:5:-;9404:20;9427:12;9725;9713:8;:24;;9705:71;;;;-1:-1:-1;;;9705:71:5;;29253:2:17;9705:71:5;;;29235:21:17;29292:2;29272:18;;;29265:30;29331:34;29311:18;;;29304:62;29402:4;29382:18;;;29375:32;29424:19;;9705:71:5;29051:398:17;9705:71:5;-1:-1:-1;;;;;9884:16:5;;9851:30;9884:16;;;:12;:16;;;;;;;;;9851:49;;;;;;;;;;;;;;;;;;;;;;;;;;;9925:116;;;;;;;;9944:19;;9851:49;;9925:116;;;9944:39;;9974:8;;9944:39;:::i;:::-;9925:116;;;;;;10026:8;9991:11;:24;;;:44;;;;:::i;:::-;9925:116;;;;;;;-1:-1:-1;;;;;9906:16:5;;;;;;;:12;:16;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;10075:43;;;;;;;;;;;10101:15;10075:43;;;;;;;;10047:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;10047:71:5;-1:-1:-1;;;;;;10047:71:5;;;;;;;;;;;;;;;;;;10059:12;;10167:274;10191:8;10187:1;:12;10167:274;;;10219:38;;10244:12;;-1:-1:-1;;;;;10219:38:5;;;10236:1;;10219:38;;10236:1;;10219:38;10282:59;10313:1;10317:2;10321:12;10335:5;10282:22;:59::i;:::-;10265:147;;;;-1:-1:-1;;;10265:147:5;;20021:2:17;10265:147:5;;;20003:21:17;20060:2;20040:18;;;20033:30;20099:34;20079:18;;;20072:62;20170:21;20150:18;;;20143:49;20209:19;;10265:147:5;19819:415:17;10265:147:5;10420:14;;;;:::i;:::-;;;;10201:3;;;;;:::i;:::-;;;;10167:274;;;-1:-1:-1;10447:12:5;:27;;;10480:60;8245:300;14:162:17;-1:-1:-1;;;;;101:5:17;97:54;90:5;87:65;77:93;;166:1;163;156:12;181:331;257:6;265;318:2;306:9;297:7;293:23;289:32;286:52;;;334:1;331;324:12;286:52;370:9;357:23;347:33;;430:2;419:9;415:18;402:32;443:39;476:5;443:39;:::i;:::-;501:5;491:15;;;181:331;;;;;:::o;517:177::-;-1:-1:-1;;;;;;595:5:17;591:78;584:5;581:89;571:117;;684:1;681;674:12;699:245;757:6;810:2;798:9;789:7;785:23;781:32;778:52;;;826:1;823;816:12;778:52;865:9;852:23;884:30;908:5;884:30;:::i;1141:184::-;-1:-1:-1;;;1190:1:17;1183:88;1290:4;1287:1;1280:15;1314:4;1311:1;1304:15;1330:691;1395:5;1425:18;1466:2;1458:6;1455:14;1452:40;;;1472:18;;:::i;:::-;1606:2;1600:9;1672:2;1660:15;;-1:-1:-1;;1656:24:17;;;1682:2;1652:33;1648:42;1636:55;;;1706:18;;;1726:22;;;1703:46;1700:72;;;1752:18;;:::i;:::-;1792:10;1788:2;1781:22;1821:6;1812:15;;1851:6;1843;1836:22;1891:3;1882:6;1877:3;1873:16;1870:25;1867:45;;;1908:1;1905;1898:12;1867:45;1958:6;1953:3;1946:4;1938:6;1934:17;1921:44;2013:1;2006:4;1997:6;1989;1985:19;1981:30;1974:41;;;;1330:691;;;;;:::o;2026:451::-;2095:6;2148:2;2136:9;2127:7;2123:23;2119:32;2116:52;;;2164:1;2161;2154:12;2116:52;2204:9;2191:23;2237:18;2229:6;2226:30;2223:50;;;2269:1;2266;2259:12;2223:50;2292:22;;2345:4;2337:13;;2333:27;-1:-1:-1;2323:55:17;;2374:1;2371;2364:12;2323:55;2397:74;2463:7;2458:2;2445:16;2440:2;2436;2432:11;2397:74;:::i;2482:258::-;2554:1;2564:113;2578:6;2575:1;2572:13;2564:113;;;2654:11;;;2648:18;2635:11;;;2628:39;2600:2;2593:10;2564:113;;;2695:6;2692:1;2689:13;2686:48;;;-1:-1:-1;;2730:1:17;2712:16;;2705:27;2482:258::o;2745:317::-;2787:3;2825:5;2819:12;2852:6;2847:3;2840:19;2868:63;2924:6;2917:4;2912:3;2908:14;2901:4;2894:5;2890:16;2868:63;:::i;:::-;2976:2;2964:15;-1:-1:-1;;2960:88:17;2951:98;;;;3051:4;2947:109;;2745:317;-1:-1:-1;;2745:317:17:o;3067:220::-;3216:2;3205:9;3198:21;3179:4;3236:45;3277:2;3266:9;3262:18;3254:6;3236:45;:::i;3292:180::-;3351:6;3404:2;3392:9;3383:7;3379:23;3375:32;3372:52;;;3420:1;3417;3410:12;3372:52;-1:-1:-1;3443:23:17;;3292:180;-1:-1:-1;3292:180:17:o;3708:323::-;3776:6;3784;3837:2;3825:9;3816:7;3812:23;3808:32;3805:52;;;3853:1;3850;3843:12;3805:52;3892:9;3879:23;3911:39;3944:5;3911:39;:::i;:::-;3969:5;4021:2;4006:18;;;;3993:32;;-1:-1:-1;;;3708:323:17:o;4218:399::-;4303:6;4311;4319;4372:2;4360:9;4351:7;4347:23;4343:32;4340:52;;;4388:1;4385;4378:12;4340:52;4424:9;4411:23;4401:33;;4481:2;4470:9;4466:18;4453:32;4443:42;;4535:2;4524:9;4520:18;4507:32;4548:39;4581:5;4548:39;:::i;:::-;4606:5;4596:15;;;4218:399;;;;;:::o;4622:472::-;4699:6;4707;4715;4768:2;4756:9;4747:7;4743:23;4739:32;4736:52;;;4784:1;4781;4774:12;4736:52;4823:9;4810:23;4842:39;4875:5;4842:39;:::i;:::-;4900:5;-1:-1:-1;4957:2:17;4942:18;;4929:32;4970:41;4929:32;4970:41;:::i;:::-;4622:472;;5030:7;;-1:-1:-1;;;5084:2:17;5069:18;;;;5056:32;;4622:472::o;5099:255::-;5158:6;5211:2;5199:9;5190:7;5186:23;5182:32;5179:52;;;5227:1;5224;5217:12;5179:52;5266:9;5253:23;5285:39;5318:5;5285:39;:::i;5359:367::-;5422:8;5432:6;5486:3;5479:4;5471:6;5467:17;5463:27;5453:55;;5504:1;5501;5494:12;5453:55;-1:-1:-1;5527:20:17;;5570:18;5559:30;;5556:50;;;5602:1;5599;5592:12;5556:50;5639:4;5631:6;5627:17;5615:29;;5699:3;5692:4;5682:6;5679:1;5675:14;5667:6;5663:27;5659:38;5656:47;5653:67;;;5716:1;5713;5706:12;5653:67;5359:367;;;;;:::o;5731:580::-;5826:6;5834;5842;5895:2;5883:9;5874:7;5870:23;5866:32;5863:52;;;5911:1;5908;5901:12;5863:52;5950:9;5937:23;5969:39;6002:5;5969:39;:::i;:::-;6027:5;-1:-1:-1;6083:2:17;6068:18;;6055:32;6110:18;6099:30;;6096:50;;;6142:1;6139;6132:12;6096:50;6181:70;6243:7;6234:6;6223:9;6219:22;6181:70;:::i;:::-;5731:580;;6270:8;;-1:-1:-1;6155:96:17;;-1:-1:-1;;;;5731:580:17:o;6800:424::-;6865:6;6873;6926:2;6914:9;6905:7;6901:23;6897:32;6894:52;;;6942:1;6939;6932:12;6894:52;6981:9;6968:23;7000:39;7033:5;7000:39;:::i;:::-;7058:5;-1:-1:-1;7115:2:17;7100:18;;7087:32;7157:15;;7150:23;7138:36;;7128:64;;7188:1;7185;7178:12;7229:248;7297:6;7305;7358:2;7346:9;7337:7;7333:23;7329:32;7326:52;;;7374:1;7371;7364:12;7326:52;-1:-1:-1;;7397:23:17;;;7467:2;7452:18;;;7439:32;;-1:-1:-1;7229:248:17:o;7482:811::-;7577:6;7585;7593;7601;7654:3;7642:9;7633:7;7629:23;7625:33;7622:53;;;7671:1;7668;7661:12;7622:53;7710:9;7697:23;7729:39;7762:5;7729:39;:::i;:::-;7787:5;-1:-1:-1;7844:2:17;7829:18;;7816:32;7857:41;7816:32;7857:41;:::i;:::-;7917:7;-1:-1:-1;7971:2:17;7956:18;;7943:32;;-1:-1:-1;8026:2:17;8011:18;;7998:32;8053:18;8042:30;;8039:50;;;8085:1;8082;8075:12;8039:50;8108:22;;8161:4;8153:13;;8149:27;-1:-1:-1;8139:55:17;;8190:1;8187;8180:12;8139:55;8213:74;8279:7;8274:2;8261:16;8256:2;8252;8248:11;8213:74;:::i;:::-;8203:84;;;7482:811;;;;;;;:::o;8298:505::-;8393:6;8401;8409;8462:2;8450:9;8441:7;8437:23;8433:32;8430:52;;;8478:1;8475;8468:12;8430:52;8514:9;8501:23;8491:33;;8575:2;8564:9;8560:18;8547:32;8602:18;8594:6;8591:30;8588:50;;;8634:1;8631;8624:12;9568:404;9636:6;9644;9697:2;9685:9;9676:7;9672:23;9668:32;9665:52;;;9713:1;9710;9703:12;9665:52;9752:9;9739:23;9771:39;9804:5;9771:39;:::i;:::-;9829:5;-1:-1:-1;9886:2:17;9871:18;;9858:32;9899:41;9858:32;9899:41;:::i;10890:437::-;10969:1;10965:12;;;;11012;;;11033:61;;11087:4;11079:6;11075:17;11065:27;;11033:61;11140:2;11132:6;11129:14;11109:18;11106:38;11103:218;;-1:-1:-1;;;11174:1:17;11167:88;11278:4;11275:1;11268:15;11306:4;11303:1;11296:15;11103:218;;10890:437;;;:::o;11458:545::-;11560:2;11555:3;11552:11;11549:448;;;11596:1;11621:5;11617:2;11610:17;11666:4;11662:2;11652:19;11736:2;11724:10;11720:19;11717:1;11713:27;11707:4;11703:38;11772:4;11760:10;11757:20;11754:47;;;-1:-1:-1;11795:4:17;11754:47;11850:2;11845:3;11841:12;11838:1;11834:20;11828:4;11824:31;11814:41;;11905:82;11923:2;11916:5;11913:13;11905:82;;;11968:17;;;11949:1;11938:13;11905:82;;12239:1471;12365:3;12359:10;12392:18;12384:6;12381:30;12378:56;;;12414:18;;:::i;:::-;12443:97;12533:6;12493:38;12525:4;12519:11;12493:38;:::i;:::-;12487:4;12443:97;:::i;:::-;12595:4;;12659:2;12648:14;;12676:1;12671:782;;;;13497:1;13514:6;13511:89;;;-1:-1:-1;13566:19:17;;;13560:26;13511:89;-1:-1:-1;;12136:1:17;12132:11;;;12128:84;12124:89;12114:100;12220:1;12216:11;;;12111:117;13613:81;;12641:1063;;12671:782;11405:1;11398:14;;;11442:4;11429:18;;-1:-1:-1;;12707:79:17;;;12884:236;12898:7;12895:1;12892:14;12884:236;;;12987:19;;;12981:26;12966:42;;13079:27;;;;13047:1;13035:14;;;;12914:19;;12884:236;;;12888:3;13148:6;13139:7;13136:19;13133:261;;;13209:19;;;13203:26;-1:-1:-1;;13292:1:17;13288:14;;;13304:3;13284:24;13280:97;13276:102;13261:118;13246:134;;13133:261;-1:-1:-1;;;;;13440:1:17;13424:14;;;13420:22;13407:36;;-1:-1:-1;12239:1471:17:o;14958:184::-;-1:-1:-1;;;15007:1:17;15000:88;15107:4;15104:1;15097:15;15131:4;15128:1;15121:15;15550:184;-1:-1:-1;;;15599:1:17;15592:88;15699:4;15696:1;15689:15;15723:4;15720:1;15713:15;15739:195;15778:3;-1:-1:-1;;15802:5:17;15799:77;15796:103;;15879:18;;:::i;:::-;-1:-1:-1;15926:1:17;15915:13;;15739:195::o;19272:184::-;-1:-1:-1;;;19321:1:17;19314:88;19421:4;19418:1;19411:15;19445:4;19442:1;19435:15;19461:120;19501:1;19527;19517:35;;19532:18;;:::i;:::-;-1:-1:-1;19566:9:17;;19461:120::o;19586:228::-;19626:7;19752:1;-1:-1:-1;;19680:74:17;19677:1;19674:81;19669:1;19662:9;19655:17;19651:105;19648:131;;;19759:18;;:::i;:::-;-1:-1:-1;19799:9:17;;19586:228::o;20582:128::-;20622:3;20653:1;20649:6;20646:1;20643:13;20640:39;;;20659:18;;:::i;:::-;-1:-1:-1;20695:9:17;;20582:128::o;23758:470::-;23937:3;23975:6;23969:13;23991:53;24037:6;24032:3;24025:4;24017:6;24013:17;23991:53;:::i;:::-;24107:13;;24066:16;;;;24129:57;24107:13;24066:16;24163:4;24151:17;;24129:57;:::i;:::-;24202:20;;23758:470;-1:-1:-1;;;;23758:470:17:o;24233:184::-;24303:6;24356:2;24344:9;24335:7;24331:23;24327:32;24324:52;;;24372:1;24369;24362:12;24324:52;-1:-1:-1;24395:16:17;;24233:184;-1:-1:-1;24233:184:17:o;26138:246::-;26178:4;26207:34;26291:10;;;;26261;;26313:12;;;26310:38;;;26328:18;;:::i;:::-;26365:13;;26138:246;-1:-1:-1;;;26138:246:17:o;26389:253::-;26429:3;26457:34;26518:2;26515:1;26511:10;26548:2;26545:1;26541:10;26579:3;26575:2;26571:12;26566:3;26563:21;26560:47;;;26587:18;;:::i;27058:125::-;27098:4;27126:1;27123;27120:8;27117:34;;;27131:18;;:::i;:::-;-1:-1:-1;27168:9:17;;27058:125::o;27188:196::-;27227:3;27255:5;27245:39;;27264:18;;:::i;:::-;-1:-1:-1;;;27300:78:17;;27188:196::o;27805:512::-;27999:4;-1:-1:-1;;;;;28109:2:17;28101:6;28097:15;28086:9;28079:34;28161:2;28153:6;28149:15;28144:2;28133:9;28129:18;28122:43;;28201:6;28196:2;28185:9;28181:18;28174:34;28244:3;28239:2;28228:9;28224:18;28217:31;28265:46;28306:3;28295:9;28291:19;28283:6;28265:46;:::i;28322:249::-;28391:6;28444:2;28432:9;28423:7;28419:23;28415:32;28412:52;;;28460:1;28457;28450:12;28412:52;28492:9;28486:16;28511:30;28535:5;28511:30;:::i;28576:112::-;28608:1;28634;28624:35;;28639:18;;:::i;:::-;-1:-1:-1;28673:9:17;;28576:112::o
Swarm Source
ipfs://65bc0e4846f33e4ccb446eb96db2afae109d7f73b972a08e055c5865984e9b59
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.