Overview
TokenID
13491
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FTMcheck
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2023-01-27 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract ClampedRandomizer { uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo uint256 private immutable _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed) mapping(uint256 => uint256) _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo constructor(uint256 scopeCap) { _scopeCap = scopeCap; } function _genClampedNonce() internal virtual returns(uint256) { uint256 scope = _scopeCap-_scopeIndex; uint256 swap; uint256 result; uint256 i = randomNumber() % scope; //Setup the value to swap in for the selected number if (_swappedIDs[scope-1] == 0){ swap = scope-1; } else { swap = _swappedIDs[scope-1]; } //Select a random number, swap it out with an unselected one then shorten the selection range by 1 if (_swappedIDs[i] == 0){ result = i; _swappedIDs[i] = swap; } else { result = _swappedIDs[i]; _swappedIDs[i] = swap; } _scopeIndex++; return result; } function randomNumber() internal view returns(uint256){ return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))); } } // File @openzeppelin/contracts/utils/introspection/[email protected] 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); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @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; } // File @openzeppelin/contracts/token/ERC721/[email protected] 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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] 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); } } } } // File @openzeppelin/contracts/utils/[email protected] 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; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @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; } } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @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())) : ""; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } function _baseExtension() internal view virtual returns (string memory) { return ""; } /** * @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 { require(operator != _msgSender(), "ERC721: 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 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 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( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly 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` 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 {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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 tokenId); /** * @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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @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(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721URIStorage: URI query for nonexistent token" ); string memory base = _baseURI(); string memory ext = _baseExtension(); return string(abi.encodePacked(base, (tokenId).toString(), ext)); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721URIStorage: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } pragma solidity ^0.8.7; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } pragma solidity ^0.8.0; contract FTMcheck is ERC721, ERC721Enumerable, ERC721URIStorage, IERC2981, Pausable, Ownable, ERC721Burnable { modifier onlyDevs { require(devFees[msg.sender].percent > 0 , "Dev Only: caller is not the developer"); _; } event WithdrawFees(address indexed devAddress, uint256 amount); event WithdrawWrongTokens(address indexed devAddress,address tokenAddress, uint256 amount); event WithdrawWrongNfts(address indexed devAddress,address tokenAddress, uint256 tokenId); event Migration(address indexed _to, uint256 indexed _tokenId); using Counters for Counters.Counter; Counters.Counter private _tokenIds; using SafeMath for uint256; using Address for address; address public royaltyAddress = 0x164C4dD094fC1Ad2aFC009e16c8cce7089341b1D; string public baseURI; string public baseExtension = ".json"; // VARIABLES uint256 public maxSupply = 50000; uint256 public maxPerTx = 25; uint256 public maxPerPerson = 250; uint256 public price = .5 ether; uint256 public burnBase = 5; bool public burnPaused = true; uint256 public royalty = 800; // COLLECTED FESS struct DevFee { uint256 percent; uint256 amount; } mapping(address => DevFee) public devFees; address[] private devList; bool public whitelistedOnly = true; mapping(address => uint256) public whiteListed; constructor(address[] memory _devList, uint256[] memory _fees) ERC721("FTM Check", "FTMC") { require(_devList.length == _fees.length, "Error: invalid data"); uint256 totalFee = 0; for(uint8 i = 0; i <_devList.length; i++) { devList.push(_devList[i]); devFees[_devList[i]] = DevFee(_fees[i], 0); totalFee += _fees[i]; } require(totalFee == 10000,"Error: invalid total fee"); _pause(); } function _baseExtension() internal view override returns (string memory) { return baseExtension; } function _baseURI() internal view override returns (string memory) { return baseURI; } function _burnBase() internal view returns (uint256) { return burnBase; } function splitFees(uint256 sentAmount) internal { for(uint8 i = 0;i < devList.length; i++) { address devAddress = devList[i]; uint256 devFee = devFees[devAddress].percent; uint256 devFeeAmount = sentAmount.mul(devFee).div(10000); devFees[devAddress].amount += devFeeAmount; } } function mint(uint256 amount) public payable whenNotPaused { uint256 supply = totalSupply(); require(amount > 0 && amount <= maxPerTx,"Error: max par tx limit"); require(balanceOf(msg.sender) + 1 <= maxPerPerson,"Error: max per address limit"); require(msg.value == price * amount, "Error: invalid price"); require(supply + amount - 1 < maxSupply, "Error: cannot mint more than total supply"); if(whitelistedOnly) require(whiteListed[msg.sender] >= amount,"Error: you are not whitelisted or amount is higher than limit"); for (uint256 i = 0; i < amount; i++) { internalMint(msg.sender); if(whitelistedOnly) whiteListed[msg.sender] -= 1; } splitFees(msg.value); } function burnToMint(uint256[] memory tokenIds) public { //require that the range of tokens in the index are between 1 and the burnCap number require(burnPaused == false, "Burning is Paused"); require(tokenIds.length % burnBase == 0, "Must be a multiple of base number"); uint256 quantity = tokenIds.length / burnBase; for (uint256 index = 0; index < tokenIds.length; index++) { // send NFT to null address transferFrom(msg.sender, address(0x000000000000000000000000000000000000dEaD), tokenIds[index]); } for (uint256 index = 0; index < quantity; index++) { _tokenIds.increment(); _mint(msg.sender, _tokenIds.current()); } } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function Owned(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function tokenExists(uint256 _id) external view returns (bool) { return (_exists(_id)); } function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { return (royaltyAddress, (_salePrice * royalty) / 10000); } //dev function updateburnPaused(bool _burnPaused) external onlyOwner { burnPaused = _burnPaused; } function whiteList(address[] memory _addressList, uint256 count) external onlyOwner { require(_addressList.length > 0,"Error: list is empty"); for(uint256 i = 0;i < _addressList.length; i++) { require(_addressList[i] != address(0), "Address cannot be 0."); whiteListed[_addressList[i]] = count; } } function removeWhiteList(address[] memory addressList) external onlyOwner { require(addressList.length > 0,"Error: list is empty"); for(uint256 i = 0;i<addressList.length;i++) whiteListed[addressList[i]] = 0; } function updateWhitelistStatus() external onlyOwner { whitelistedOnly = !whitelistedOnly; } function updatePausedStatus() external onlyOwner { paused() ? _unpause() : _pause(); } function setMaxPerPerson(uint256 newMaxBuy) external onlyOwner { maxPerPerson = newMaxBuy; } function setMaxPerTx(uint256 newMaxBuy) external onlyOwner { maxPerTx = newMaxBuy; } function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } function setPrice(uint256 newPrice) external onlyOwner { price = newPrice; } function setBurnBase(uint256 newBase) external onlyOwner { burnBase = newBase; } function setURI(uint256 tokenId, string memory uri) external onlyOwner { _setTokenURI(tokenId, uri); } function setRoyalty(uint16 _royalty) external onlyOwner { require(_royalty >= 0, "Royalty must be greater than or equal to 0%"); require(_royalty <= 750, "Royalty must be greater than or equal to 7,5%" ); royalty = _royalty; } function setRoyaltyAddress(address _royaltyAddress) external onlyOwner { royaltyAddress = _royaltyAddress; } //Overrides function internalMint(address to) internal { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(to, newItemId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { ERC721Enumerable._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } /// @dev withdraw fees function withdraw() external onlyDevs { uint256 amount = devFees[msg.sender].amount; require(amount > 0,"Error: no fees :("); payable(msg.sender).transfer(amount); devFees[msg.sender].amount = 0; emit WithdrawFees(msg.sender,amount); } /// @dev emergency withdraw contract balance to the contract owner function emergencyWithdraw() external onlyOwner { uint256 amount = address(this).balance; require(amount > 0,"Error: no fees :("); payable(msg.sender).transfer(amount); for(uint8 i = 0;i < devList.length; i++) { address devAddress = devList[i]; devFees[devAddress].amount = 0; } emit WithdrawFees(msg.sender,amount); } /// @dev withdraw ERC20 tokens function withdrawTokens(address _tokenContract) external onlyOwner { IERC20 tokenContract = IERC20(_tokenContract); uint256 _amount = tokenContract.balanceOf(address(this)); tokenContract.transfer(owner(), _amount); emit WithdrawWrongTokens(msg.sender,_tokenContract,_amount); } function airdropsToken(address[] memory _addr, uint256 amount) public onlyOwner { for (uint256 i = 0; i < _addr.length; i++) { airdropTokenInternal(amount,_addr[i]); } } function airdropTokenInternal(uint256 amount, address _addr) internal { for (uint256 i = 0; i < amount; i++) { internalMint(_addr); } } /// @dev withdraw ERC721 tokens to the contract owner function withdrawNFT(address _tokenContract, uint256[] memory _id) external onlyOwner { IERC721 tokenContract = IERC721(_tokenContract); for (uint256 i = 0; i < _id.length; i++) { tokenContract.safeTransferFrom(address(this), owner(), _id[i]); emit WithdrawWrongNfts(msg.sender,_tokenContract,_id[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_devList","type":"address[]"},{"internalType":"uint256[]","name":"_fees","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":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Migration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawWrongNfts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawWrongTokens","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"Owned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropsToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devFees","outputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerPerson","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBase","type":"uint256"}],"name":"setBurnBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"updatePausedStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_burnPaused","type":"bool"}],"name":"updateburnPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"whiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600d80546001600160a01b03191673164c4dd094fc1ad2afc009e16c8cce7089341b1d17905560c06040526005608081905264173539b7b760d91b60a09081526200004e91600f919062000406565b5061c3506010556019601181905560fa6012556706f05b59d3b20000601355600560145560158054600160ff1991821681179092556103206016558254161790553480156200009c57600080fd5b506040516200433538038062004335833981016040819052620000bf916200058e565b604080518082018252600981526846544d20436865636b60b81b60208083019182528351808501909452600484526346544d4360e01b9084015281519192916200010c9160009162000406565b5080516200012290600190602084019062000406565b5050600b80546001600160a81b0319163361010081029190911790915560405190915081906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508051825114620001c75760405162461bcd60e51b815260206004820152601360248201527f4572726f723a20696e76616c696420646174610000000000000000000000000060448201526064015b60405180910390fd5b6000805b83518160ff16101562000304576018848260ff1681518110620001f257620001f26200066c565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790556040805180820190915283518190859060ff85169081106200025357620002536200066c565b60200260200101518152602001600081525060176000868460ff16815181106200028157620002816200066c565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010155905050828160ff1681518110620002d857620002d86200066c565b602002602001015182620002ed919062000698565b915080620002fb81620006b3565b915050620001cb565b508061271014620003585760405162461bcd60e51b815260206004820152601860248201527f4572726f723a20696e76616c696420746f74616c2066656500000000000000006044820152606401620001be565b620003626200036b565b50505062000711565b600b5460ff1615620003b35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620001be565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003e93390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200041490620006d5565b90600052602060002090601f01602090048101928262000438576000855562000483565b82601f106200045357805160ff191683800117855562000483565b8280016001018555821562000483579182015b828111156200048357825182559160200191906001019062000466565b506200049192915062000495565b5090565b5b8082111562000491576000815560010162000496565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004ed57620004ed620004ac565b604052919050565b60006001600160401b03821115620005115762000511620004ac565b5060051b60200190565b600082601f8301126200052d57600080fd5b81516020620005466200054083620004f5565b620004c2565b82815260059290921b840181019181810190868411156200056657600080fd5b8286015b848110156200058357805183529183019183016200056a565b509695505050505050565b60008060408385031215620005a257600080fd5b82516001600160401b0380821115620005ba57600080fd5b818501915085601f830112620005cf57600080fd5b81516020620005e26200054083620004f5565b82815260059290921b840181019181810190898411156200060257600080fd5b948201945b83861015620006395785516001600160a01b0381168114620006295760008081fd5b8252948201949082019062000607565b918801519196509093505050808211156200065357600080fd5b5062000662858286016200051b565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ae57620006ae62000682565b500190565b600060ff821660ff8103620006cc57620006cc62000682565b60010192915050565b600181811c90821680620006ea57607f821691505b6020821081036200070b57634e487b7160e01b600052602260045260246000fd5b50919050565b613c1480620007216000396000f3fe6080604052600436106103755760003560e01c8063715018a6116101d1578063b9bfa0bc11610102578063d5abeb01116100a0578063f147efeb1161006f578063f147efeb146109f7578063f2fde38b14610a40578063f968adbe14610a60578063fa0fca8414610a7657600080fd5b8063d5abeb0114610969578063d684534e1461097f578063db2e21bc14610999578063e985e9c5146109ae57600080fd5b8063c6f6f216116100dc578063c6f6f216146108e6578063c754824614610906578063c87b56dd1461091c578063d2f8dd451461093c57600080fd5b8063b9bfa0bc1461089c578063c3d1ca19146108b1578063c6682862146108d157600080fd5b806395d89b411161016f578063a0712d6811610149578063a0712d6814610829578063a22cb4651461083c578063ad2f852a1461085c578063b88d4fde1461087c57600080fd5b806395d89b41146107de5780639bdedea5146107f3578063a035b1fe1461081357600080fd5b8063862440e2116101ab578063862440e2146107615780638da5cb5b146107815780639186b425146107a457806391b7f5ed146107be57600080fd5b8063715018a614610716578063768d71381461072b5780637e0586f11461074157600080fd5b806339745791116102ab57806355f804b31161024957806364ce2e5a1161022357806364ce2e5a146106ac57806367dded4d146106cc5780636c0360eb146106e157806370a08231146106f657600080fd5b806355f804b3146106545780635c975abb146106745780636352211e1461068c57600080fd5b806342966c681161028557806342966c68146105d4578063483efda2146105f457806349df728c146106145780634f6ccce71461063457600080fd5b8063397457911461057f5780633ccfd60b1461059f57806342842e0e146105b457600080fd5b806323b872dd116103185780632a55205a116102f25780632a55205a146104e05780632f745c591461051f5780633386cc4e1461053f57806336e79a5a1461055f57600080fd5b806323b872dd1461048a57806329413b12146104aa57806329ee566c146104ca57600080fd5b806306fdde031161035457806306fdde03146103f1578063081812fc14610413578063095ea7b31461044b57806318160ddd1461046b57600080fd5b8062923f9e1461037a57806301ffc9a7146103af57806306d254da146103cf575b600080fd5b34801561038657600080fd5b5061039a6103953660046132c1565b610aa3565b60405190151581526020015b60405180910390f35b3480156103bb57600080fd5b5061039a6103ca3660046132f0565b610ab4565b3480156103db57600080fd5b506103ef6103ea366004613329565b610ad9565b005b3480156103fd57600080fd5b50610406610b34565b6040516103a6919061339c565b34801561041f57600080fd5b5061043361042e3660046132c1565b610bc6565b6040516001600160a01b0390911681526020016103a6565b34801561045757600080fd5b506103ef6104663660046133af565b610c4e565b34801561047757600080fd5b506008545b6040519081526020016103a6565b34801561049657600080fd5b506103ef6104a53660046133d9565b610d63565b3480156104b657600080fd5b506103ef6104c53660046134f2565b610d95565b3480156104d657600080fd5b5061047c60165481565b3480156104ec57600080fd5b506105006104fb366004613537565b610e06565b604080516001600160a01b0390931683526020830191909152016103a6565b34801561052b57600080fd5b5061047c61053a3660046133af565b610e40565b34801561054b57600080fd5b506103ef61055a3660046135b4565b610ed6565b34801561056b57600080fd5b506103ef61057a3660046135e9565b611018565b34801561058b57600080fd5b506103ef61059a36600461360d565b6110bd565b3480156105ab57600080fd5b506103ef61119c565b3480156105c057600080fd5b506103ef6105cf3660046133d9565b6112da565b3480156105e057600080fd5b506103ef6105ef3660046132c1565b6112f5565b34801561060057600080fd5b506103ef61060f3660046132c1565b61136f565b34801561062057600080fd5b506103ef61062f366004613329565b6113a4565b34801561064057600080fd5b5061047c61064f3660046132c1565b611525565b34801561066057600080fd5b506103ef61066f3660046136ba565b6115b8565b34801561068057600080fd5b50600b5460ff1661039a565b34801561069857600080fd5b506104336106a73660046132c1565b6115fb565b3480156106b857600080fd5b506103ef6106c73660046132c1565b611672565b3480156106d857600080fd5b506103ef6116a7565b3480156106ed57600080fd5b506104066116f3565b34801561070257600080fd5b5061047c610711366004613329565b611781565b34801561072257600080fd5b506103ef611808565b34801561073757600080fd5b5061047c60125481565b34801561074d57600080fd5b506103ef61075c3660046134f2565b611888565b34801561076d57600080fd5b506103ef61077c3660046136ef565b6119d4565b34801561078d57600080fd5b50600b5461010090046001600160a01b0316610433565b3480156107b057600080fd5b5060195461039a9060ff1681565b3480156107ca57600080fd5b506103ef6107d93660046132c1565b611a0e565b3480156107ea57600080fd5b50610406611a43565b3480156107ff57600080fd5b506103ef61080e366004613736565b611a52565b34801561081f57600080fd5b5061047c60135481565b6103ef6108373660046132c1565b611bc3565b34801561084857600080fd5b506103ef610857366004613788565b611e72565b34801561086857600080fd5b50600d54610433906001600160a01b031681565b34801561088857600080fd5b506103ef6108973660046137bf565b611f36565b3480156108a857600080fd5b506103ef611f68565b3480156108bd57600080fd5b506103ef6108cc36600461383b565b611fac565b3480156108dd57600080fd5b50610406611fef565b3480156108f257600080fd5b506103ef6109013660046132c1565b611ffc565b34801561091257600080fd5b5061047c60145481565b34801561092857600080fd5b506104066109373660046132c1565b612031565b34801561094857600080fd5b5061095c610957366004613329565b61203c565b6040516103a69190613858565b34801561097557600080fd5b5061047c60105481565b34801561098b57600080fd5b5060155461039a9060ff1681565b3480156109a557600080fd5b506103ef6120fe565b3480156109ba57600080fd5b5061039a6109c936600461389c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a0357600080fd5b50610a2b610a12366004613329565b6017602052600090815260409020805460019091015482565b604080519283526020830191909152016103a6565b348015610a4c57600080fd5b506103ef610a5b366004613329565b612231565b348015610a6c57600080fd5b5061047c60115481565b348015610a8257600080fd5b5061047c610a91366004613329565b601a6020526000908152604090205481565b6000610aae8261232d565b92915050565b60006001600160e01b0319821663152a902d60e11b1480610aae5750610aae8261234a565b600b546001600160a01b03610100909104163314610b125760405162461bcd60e51b8152600401610b09906138cf565b60405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054610b4390613904565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90613904565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd18261232d565b610c325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b09565b506000908152600460205260409020546001600160a01b031690565b6000610c59826115fb565b9050806001600160a01b0316836001600160a01b031603610cc65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b09565b336001600160a01b0382161480610ce25750610ce281336109c9565b610d545760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b09565b610d5e838361236f565b505050565b610d6e335b826123dd565b610d8a5760405162461bcd60e51b8152600401610b0990613938565b610d5e8383836124c7565b600b546001600160a01b03610100909104163314610dc55760405162461bcd60e51b8152600401610b09906138cf565b60005b8251811015610d5e57610df482848381518110610de757610de7613989565b6020026020010151612672565b80610dfe816139b5565b915050610dc8565b600d5460165460009182916001600160a01b039091169061271090610e2b90866139ce565b610e359190613a03565b915091509250929050565b6000610e4b83611781565b8210610ead5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b09565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60155460ff1615610f1d5760405162461bcd60e51b8152602060048201526011602482015270109d5c9b9a5b99c81a5cc814185d5cd959607a1b6044820152606401610b09565b6014548151610f2c9190613a17565b15610f835760405162461bcd60e51b815260206004820152602160248201527f4d7573742062652061206d756c7469706c65206f662062617365206e756d62656044820152603960f91b6064820152608401610b09565b60006014548251610f949190613a03565b905060005b8251811015610fda57610fc83361dead858481518110610fbb57610fbb613989565b6020026020010151610d63565b80610fd2816139b5565b915050610f99565b5060005b81811015610d5e57610ff4600c80546001019055565b61100633611001600c5490565b612698565b80611010816139b5565b915050610fde565b600b546001600160a01b036101009091041633146110485760405162461bcd60e51b8152600401610b09906138cf565b6102ee8161ffff1611156110b45760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201526c657175616c20746f20372c352560981b6064820152608401610b09565b61ffff16601655565b600b546001600160a01b036101009091041633146110ed5760405162461bcd60e51b8152600401610b09906138cf565b60008151116111355760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610b09565b60005b8151811015611198576000601a600084848151811061115957611159613989565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611190906139b5565b915050611138565b5050565b336000908152601760205260409020546112065760405162461bcd60e51b815260206004820152602560248201527f446576204f6e6c793a2063616c6c6572206973206e6f742074686520646576656044820152643637b832b960d91b6064820152608401610b09565b336000908152601760205260409020600101548061125a5760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610b09565b604051339082156108fc029083906000818181858888f19350505050158015611287573d6000803e3d6000fd5b503360008181526017602052604080822060010191909155517f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906112cf9084815260200190565b60405180910390a250565b610d5e83838360405180602001604052806000815250611f36565b6112fe33610d68565b6113635760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610b09565b61136c816127d7565b50565b600b546001600160a01b0361010090910416331461139f5760405162461bcd60e51b8152600401610b09906138cf565b601255565b600b546001600160a01b036101009091041633146113d45760405162461bcd60e51b8152600401610b09906138cf565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561141d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114419190613a2b565b9050816001600160a01b031663a9059cbb61146a600b546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114db9190613a44565b50604080516001600160a01b03851681526020810183905233917f5aa586896a67fb05c3b86276f66eecee7da00719d0e7299c403596fa2ec58ca4910160405180910390a2505050565b600061153060085490565b82106115935760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b09565b600882815481106115a6576115a6613989565b90600052602060002001549050919050565b600b546001600160a01b036101009091041633146115e85760405162461bcd60e51b8152600401610b09906138cf565b805161119890600e9060208401906131f2565b6000818152600260205260408120546001600160a01b031680610aae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b09565b600b546001600160a01b036101009091041633146116a25760405162461bcd60e51b8152600401610b09906138cf565b601455565b600b546001600160a01b036101009091041633146116d75760405162461bcd60e51b8152600401610b09906138cf565b600b5460ff166116eb576116e96127e0565b565b6116e9612855565b600e805461170090613904565b80601f016020809104026020016040519081016040528092919081815260200182805461172c90613904565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b60006001600160a01b0382166117ec5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b09565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146118385760405162461bcd60e51b8152600401610b09906138cf565b600b5460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b8054610100600160a81b0319169055565b600b546001600160a01b036101009091041633146118b85760405162461bcd60e51b8152600401610b09906138cf565b60008251116119005760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610b09565b60005b8251811015610d5e5760006001600160a01b031683828151811061192957611929613989565b60200260200101516001600160a01b03160361197e5760405162461bcd60e51b815260206004820152601460248201527320b2323932b9b99031b0b73737ba10313290181760611b6044820152606401610b09565b81601a600085848151811061199557611995613989565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806119cc906139b5565b915050611903565b600b546001600160a01b03610100909104163314611a045760405162461bcd60e51b8152600401610b09906138cf565b61119882826128cf565b600b546001600160a01b03610100909104163314611a3e5760405162461bcd60e51b8152600401610b09906138cf565b601355565b606060018054610b4390613904565b600b546001600160a01b03610100909104163314611a825760405162461bcd60e51b8152600401610b09906138cf565b8160005b8251811015611bbd57816001600160a01b03166342842e0e30611ab7600b546001600160a01b036101009091041690565b868581518110611ac957611ac9613989565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b50505050336001600160a01b03167fb8dbf4ce06446b88ef02ffd28a948c2637ac80fb0bd4d3a31c70878c1046eb7f85858481518110611b7957611b79613989565b6020026020010151604051611ba39291906001600160a01b03929092168252602082015260400190565b60405180910390a280611bb5816139b5565b915050611a86565b50505050565b600b5460ff1615611be65760405162461bcd60e51b8152600401610b0990613a61565b6000611bf160085490565b9050600082118015611c0557506011548211155b611c515760405162461bcd60e51b815260206004820152601760248201527f4572726f723a206d617820706172207478206c696d69740000000000000000006044820152606401610b09565b601254611c5d33611781565b611c68906001613a8b565b1115611cb65760405162461bcd60e51b815260206004820152601c60248201527f4572726f723a206d6178207065722061646472657373206c696d6974000000006044820152606401610b09565b81601354611cc491906139ce565b3414611d095760405162461bcd60e51b81526020600482015260146024820152734572726f723a20696e76616c696420707269636560601b6044820152606401610b09565b6010546001611d188484613a8b565b611d229190613aa3565b10611d815760405162461bcd60e51b815260206004820152602960248201527f4572726f723a2063616e6e6f74206d696e74206d6f7265207468616e20746f74604482015268616c20737570706c7960b81b6064820152608401610b09565b60195460ff1615611e1157336000908152601a6020526040902054821115611e115760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20796f7520617265206e6f742077686974656c6973746564206f60448201527f7220616d6f756e7420697320686967686572207468616e206c696d69740000006064820152608401610b09565b60005b82811015611e6857611e253361295a565b60195460ff1615611e5657336000908152601a60205260408120805460019290611e50908490613aa3565b90915550505b80611e60816139b5565b915050611e14565b506111983461297f565b336001600160a01b03831603611eca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b09565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f4033836123dd565b611f5c5760405162461bcd60e51b8152600401610b0990613938565b611bbd84848484612a32565b600b546001600160a01b03610100909104163314611f985760405162461bcd60e51b8152600401610b09906138cf565b6019805460ff19811660ff90911615179055565b600b546001600160a01b03610100909104163314611fdc5760405162461bcd60e51b8152600401610b09906138cf565b6015805460ff1916911515919091179055565b600f805461170090613904565b600b546001600160a01b0361010090910416331461202c5760405162461bcd60e51b8152600401610b09906138cf565b601155565b6060610aae82612a65565b6060600061204983611781565b90508060000361206d5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561208857612088613415565b6040519080825280602002602001820160405280156120b1578160200160208202803683370190505b50905060005b82811015612065576120c98582610e40565b8282815181106120db576120db613989565b6020908102919091010152806120f0816139b5565b9150506120b7565b50919050565b600b546001600160a01b0361010090910416331461212e5760405162461bcd60e51b8152600401610b09906138cf565b47806121705760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610b09565b604051339082156108fc029083906000818181858888f1935050505015801561219d573d6000803e3d6000fd5b5060005b60185460ff821610156121fe57600060188260ff16815481106121c6576121c6613989565b60009182526020808320909101546001600160a01b0316825260179052604081206001015550806121f681613aba565b9150506121a1565b5060405181815233907f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906020016112cf565b600b546001600160a01b036101009091041633146122615760405162461bcd60e51b8152600401610b09906138cf565b6001600160a01b0381166122c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b09565b600b546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000908152600260205260409020546001600160a01b0316151590565b60006001600160e01b0319821663780e9d6360e01b1480610aae5750610aae82612b23565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123a4826115fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123e88261232d565b6124495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b09565b6000612454836115fb565b9050806001600160a01b0316846001600160a01b0316148061248f5750836001600160a01b031661248484610bc6565b6001600160a01b0316145b806124bf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166124da826115fb565b6001600160a01b0316146125425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b09565b6001600160a01b0382166125a45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b09565b6125af838383612b73565b6125ba60008261236f565b6001600160a01b03831660009081526003602052604081208054600192906125e3908490613aa3565b90915550506001600160a01b0382166000908152600360205260408120805460019290612611908490613a8b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b82811015610d5e576126868261295a565b80612690816139b5565b915050612675565b6001600160a01b0382166126ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b09565b6126f78161232d565b156127445760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b09565b61275060008383612b73565b6001600160a01b0382166000908152600360205260408120805460019290612779908490613a8b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61136c81612ba1565b600b5460ff16156128035760405162461bcd60e51b8152600401610b0990613a61565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128383390565b6040516001600160a01b03909116815260200160405180910390a1565b600b5460ff1661289e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b09565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612838565b6128d88261232d565b61293b5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610b09565b6000828152600a602090815260409091208251610d5e928401906131f2565b612968600c80546001019055565b6000612973600c5490565b90506111988282612698565b60005b60185460ff8216101561119857600060188260ff16815481106129a7576129a7613989565b60009182526020808320909101546001600160a01b031680835260179091526040822054909250906129e56127106129df8785612be1565b90612c6a565b6001600160a01b038416600090815260176020526040812060010180549293508392909190612a15908490613a8b565b925050819055505050508080612a2a90613aba565b915050612982565b612a3d8484846124c7565b612a4984848484612cac565b611bbd5760405162461bcd60e51b8152600401610b0990613ad9565b6060612a708261232d565b612ad65760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b09565b6000612ae0612dad565b90506000612aec612dbc565b905081612af885612dcb565b82604051602001612b0b93929190613b2b565b60405160208183030381529060405292505050919050565b60006001600160e01b031982166380ac58cd60e01b1480612b5457506001600160e01b03198216635b5e139f60e01b145b80610aae57506301ffc9a760e01b6001600160e01b0319831614610aae565b600b5460ff1615612b965760405162461bcd60e51b8152600401610b0990613a61565b610d5e838383612ecc565b612baa81612f84565b6000818152600a602052604090208054612bc390613904565b15905061136c576000818152600a6020526040812061136c91613276565b600082600003612bf357506000610aae565b6000612bff83856139ce565b905082612c0c8583613a03565b14612c635760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b09565b9392505050565b6000612c6383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061302b565b60006001600160a01b0384163b15612da257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612cf0903390899088908890600401613b6e565b6020604051808303816000875af1925050508015612d2b575060408051601f3d908101601f19168201909252612d2891810190613bab565b60015b612d88573d808015612d59576040519150601f19603f3d011682016040523d82523d6000602084013e612d5e565b606091505b508051600003612d805760405162461bcd60e51b8152600401610b0990613ad9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506124bf565b506001949350505050565b6060600e8054610b4390613904565b6060600f8054610b4390613904565b606081600003612df25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e1c5780612e06816139b5565b9150612e159050600a83613a03565b9150612df6565b60008167ffffffffffffffff811115612e3757612e37613415565b6040519080825280601f01601f191660200182016040528015612e61576020820181803683370190505b5090505b84156124bf57612e76600183613aa3565b9150612e83600a86613a17565b612e8e906030613a8b565b60f81b818381518110612ea357612ea3613989565b60200101906001600160f81b031916908160001a905350612ec5600a86613a03565b9450612e65565b6001600160a01b038316612f2757612f2281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f4a565b816001600160a01b0316836001600160a01b031614612f4a57612f4a8382613062565b6001600160a01b038216612f6157610d5e816130ff565b826001600160a01b0316826001600160a01b031614610d5e57610d5e82826131ae565b6000612f8f826115fb565b9050612f9d81600084612b73565b612fa860008361236f565b6001600160a01b0381166000908152600360205260408120805460019290612fd1908490613aa3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000818361304c5760405162461bcd60e51b8152600401610b09919061339c565b5060006130598486613a03565b95945050505050565b6000600161306f84611781565b6130799190613aa3565b6000838152600760205260409020549091508082146130cc576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061311190600190613aa3565b6000838152600960205260408120546008805493945090928490811061313957613139613989565b90600052602060002001549050806008838154811061315a5761315a613989565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061319257613192613bc8565b6001900381819060005260206000200160009055905550505050565b60006131b983611781565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546131fe90613904565b90600052602060002090601f0160209004810192826132205760008555613266565b82601f1061323957805160ff1916838001178555613266565b82800160010185558215613266579182015b8281111561326657825182559160200191906001019061324b565b506132729291506132ac565b5090565b50805461328290613904565b6000825580601f10613292575050565b601f01602090049060005260206000209081019061136c91905b5b8082111561327257600081556001016132ad565b6000602082840312156132d357600080fd5b5035919050565b6001600160e01b03198116811461136c57600080fd5b60006020828403121561330257600080fd5b8135612c63816132da565b80356001600160a01b038116811461332457600080fd5b919050565b60006020828403121561333b57600080fd5b612c638261330d565b60005b8381101561335f578181015183820152602001613347565b83811115611bbd5750506000910152565b60008151808452613388816020860160208601613344565b601f01601f19169290920160200192915050565b602081526000612c636020830184613370565b600080604083850312156133c257600080fd5b6133cb8361330d565b946020939093013593505050565b6000806000606084860312156133ee57600080fd5b6133f78461330d565b92506134056020850161330d565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561345457613454613415565b604052919050565b600067ffffffffffffffff82111561347657613476613415565b5060051b60200190565b600082601f83011261349157600080fd5b813560206134a66134a18361345c565b61342b565b82815260059290921b840181019181810190868411156134c557600080fd5b8286015b848110156134e7576134da8161330d565b83529183019183016134c9565b509695505050505050565b6000806040838503121561350557600080fd5b823567ffffffffffffffff81111561351c57600080fd5b61352885828601613480565b95602094909401359450505050565b6000806040838503121561354a57600080fd5b50508035926020909101359150565b600082601f83011261356a57600080fd5b8135602061357a6134a18361345c565b82815260059290921b8401810191818101908684111561359957600080fd5b8286015b848110156134e7578035835291830191830161359d565b6000602082840312156135c657600080fd5b813567ffffffffffffffff8111156135dd57600080fd5b6124bf84828501613559565b6000602082840312156135fb57600080fd5b813561ffff81168114612c6357600080fd5b60006020828403121561361f57600080fd5b813567ffffffffffffffff81111561363657600080fd5b6124bf84828501613480565b600067ffffffffffffffff83111561365c5761365c613415565b61366f601f8401601f191660200161342b565b905082815283838301111561368357600080fd5b828260208301376000602084830101529392505050565b600082601f8301126136ab57600080fd5b612c6383833560208501613642565b6000602082840312156136cc57600080fd5b813567ffffffffffffffff8111156136e357600080fd5b6124bf8482850161369a565b6000806040838503121561370257600080fd5b82359150602083013567ffffffffffffffff81111561372057600080fd5b61372c8582860161369a565b9150509250929050565b6000806040838503121561374957600080fd5b6137528361330d565b9150602083013567ffffffffffffffff81111561376e57600080fd5b61372c85828601613559565b801515811461136c57600080fd5b6000806040838503121561379b57600080fd5b6137a48361330d565b915060208301356137b48161377a565b809150509250929050565b600080600080608085870312156137d557600080fd5b6137de8561330d565b93506137ec6020860161330d565b925060408501359150606085013567ffffffffffffffff81111561380f57600080fd5b8501601f8101871361382057600080fd5b61382f87823560208401613642565b91505092959194509250565b60006020828403121561384d57600080fd5b8135612c638161377a565b6020808252825182820181905260009190848201906040850190845b8181101561389057835183529284019291840191600101613874565b50909695505050505050565b600080604083850312156138af57600080fd5b6138b88361330d565b91506138c66020840161330d565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061391857607f821691505b6020821081036120f857634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139c7576139c761399f565b5060010190565b60008160001904831182151516156139e8576139e861399f565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a1257613a126139ed565b500490565b600082613a2657613a266139ed565b500690565b600060208284031215613a3d57600080fd5b5051919050565b600060208284031215613a5657600080fd5b8151612c638161377a565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008219821115613a9e57613a9e61399f565b500190565b600082821015613ab557613ab561399f565b500390565b600060ff821660ff8103613ad057613ad061399f565b60010192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008451613b3d818460208901613344565b845190830190613b51818360208901613344565b8451910190613b64818360208801613344565b0195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ba190830184613370565b9695505050505050565b600060208284031215613bbd57600080fd5b8151612c63816132da565b634e487b7160e01b600052603160045260246000fdfea264697066735822122054a3911f82385d09b014dc5135a09260d28eaf821ff3e74d2317e25f050ed66464736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000164c4dd094fc1ad2afc009e16c8cce7089341b1d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x6080604052600436106103755760003560e01c8063715018a6116101d1578063b9bfa0bc11610102578063d5abeb01116100a0578063f147efeb1161006f578063f147efeb146109f7578063f2fde38b14610a40578063f968adbe14610a60578063fa0fca8414610a7657600080fd5b8063d5abeb0114610969578063d684534e1461097f578063db2e21bc14610999578063e985e9c5146109ae57600080fd5b8063c6f6f216116100dc578063c6f6f216146108e6578063c754824614610906578063c87b56dd1461091c578063d2f8dd451461093c57600080fd5b8063b9bfa0bc1461089c578063c3d1ca19146108b1578063c6682862146108d157600080fd5b806395d89b411161016f578063a0712d6811610149578063a0712d6814610829578063a22cb4651461083c578063ad2f852a1461085c578063b88d4fde1461087c57600080fd5b806395d89b41146107de5780639bdedea5146107f3578063a035b1fe1461081357600080fd5b8063862440e2116101ab578063862440e2146107615780638da5cb5b146107815780639186b425146107a457806391b7f5ed146107be57600080fd5b8063715018a614610716578063768d71381461072b5780637e0586f11461074157600080fd5b806339745791116102ab57806355f804b31161024957806364ce2e5a1161022357806364ce2e5a146106ac57806367dded4d146106cc5780636c0360eb146106e157806370a08231146106f657600080fd5b806355f804b3146106545780635c975abb146106745780636352211e1461068c57600080fd5b806342966c681161028557806342966c68146105d4578063483efda2146105f457806349df728c146106145780634f6ccce71461063457600080fd5b8063397457911461057f5780633ccfd60b1461059f57806342842e0e146105b457600080fd5b806323b872dd116103185780632a55205a116102f25780632a55205a146104e05780632f745c591461051f5780633386cc4e1461053f57806336e79a5a1461055f57600080fd5b806323b872dd1461048a57806329413b12146104aa57806329ee566c146104ca57600080fd5b806306fdde031161035457806306fdde03146103f1578063081812fc14610413578063095ea7b31461044b57806318160ddd1461046b57600080fd5b8062923f9e1461037a57806301ffc9a7146103af57806306d254da146103cf575b600080fd5b34801561038657600080fd5b5061039a6103953660046132c1565b610aa3565b60405190151581526020015b60405180910390f35b3480156103bb57600080fd5b5061039a6103ca3660046132f0565b610ab4565b3480156103db57600080fd5b506103ef6103ea366004613329565b610ad9565b005b3480156103fd57600080fd5b50610406610b34565b6040516103a6919061339c565b34801561041f57600080fd5b5061043361042e3660046132c1565b610bc6565b6040516001600160a01b0390911681526020016103a6565b34801561045757600080fd5b506103ef6104663660046133af565b610c4e565b34801561047757600080fd5b506008545b6040519081526020016103a6565b34801561049657600080fd5b506103ef6104a53660046133d9565b610d63565b3480156104b657600080fd5b506103ef6104c53660046134f2565b610d95565b3480156104d657600080fd5b5061047c60165481565b3480156104ec57600080fd5b506105006104fb366004613537565b610e06565b604080516001600160a01b0390931683526020830191909152016103a6565b34801561052b57600080fd5b5061047c61053a3660046133af565b610e40565b34801561054b57600080fd5b506103ef61055a3660046135b4565b610ed6565b34801561056b57600080fd5b506103ef61057a3660046135e9565b611018565b34801561058b57600080fd5b506103ef61059a36600461360d565b6110bd565b3480156105ab57600080fd5b506103ef61119c565b3480156105c057600080fd5b506103ef6105cf3660046133d9565b6112da565b3480156105e057600080fd5b506103ef6105ef3660046132c1565b6112f5565b34801561060057600080fd5b506103ef61060f3660046132c1565b61136f565b34801561062057600080fd5b506103ef61062f366004613329565b6113a4565b34801561064057600080fd5b5061047c61064f3660046132c1565b611525565b34801561066057600080fd5b506103ef61066f3660046136ba565b6115b8565b34801561068057600080fd5b50600b5460ff1661039a565b34801561069857600080fd5b506104336106a73660046132c1565b6115fb565b3480156106b857600080fd5b506103ef6106c73660046132c1565b611672565b3480156106d857600080fd5b506103ef6116a7565b3480156106ed57600080fd5b506104066116f3565b34801561070257600080fd5b5061047c610711366004613329565b611781565b34801561072257600080fd5b506103ef611808565b34801561073757600080fd5b5061047c60125481565b34801561074d57600080fd5b506103ef61075c3660046134f2565b611888565b34801561076d57600080fd5b506103ef61077c3660046136ef565b6119d4565b34801561078d57600080fd5b50600b5461010090046001600160a01b0316610433565b3480156107b057600080fd5b5060195461039a9060ff1681565b3480156107ca57600080fd5b506103ef6107d93660046132c1565b611a0e565b3480156107ea57600080fd5b50610406611a43565b3480156107ff57600080fd5b506103ef61080e366004613736565b611a52565b34801561081f57600080fd5b5061047c60135481565b6103ef6108373660046132c1565b611bc3565b34801561084857600080fd5b506103ef610857366004613788565b611e72565b34801561086857600080fd5b50600d54610433906001600160a01b031681565b34801561088857600080fd5b506103ef6108973660046137bf565b611f36565b3480156108a857600080fd5b506103ef611f68565b3480156108bd57600080fd5b506103ef6108cc36600461383b565b611fac565b3480156108dd57600080fd5b50610406611fef565b3480156108f257600080fd5b506103ef6109013660046132c1565b611ffc565b34801561091257600080fd5b5061047c60145481565b34801561092857600080fd5b506104066109373660046132c1565b612031565b34801561094857600080fd5b5061095c610957366004613329565b61203c565b6040516103a69190613858565b34801561097557600080fd5b5061047c60105481565b34801561098b57600080fd5b5060155461039a9060ff1681565b3480156109a557600080fd5b506103ef6120fe565b3480156109ba57600080fd5b5061039a6109c936600461389c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a0357600080fd5b50610a2b610a12366004613329565b6017602052600090815260409020805460019091015482565b604080519283526020830191909152016103a6565b348015610a4c57600080fd5b506103ef610a5b366004613329565b612231565b348015610a6c57600080fd5b5061047c60115481565b348015610a8257600080fd5b5061047c610a91366004613329565b601a6020526000908152604090205481565b6000610aae8261232d565b92915050565b60006001600160e01b0319821663152a902d60e11b1480610aae5750610aae8261234a565b600b546001600160a01b03610100909104163314610b125760405162461bcd60e51b8152600401610b09906138cf565b60405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054610b4390613904565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90613904565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd18261232d565b610c325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b09565b506000908152600460205260409020546001600160a01b031690565b6000610c59826115fb565b9050806001600160a01b0316836001600160a01b031603610cc65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b09565b336001600160a01b0382161480610ce25750610ce281336109c9565b610d545760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b09565b610d5e838361236f565b505050565b610d6e335b826123dd565b610d8a5760405162461bcd60e51b8152600401610b0990613938565b610d5e8383836124c7565b600b546001600160a01b03610100909104163314610dc55760405162461bcd60e51b8152600401610b09906138cf565b60005b8251811015610d5e57610df482848381518110610de757610de7613989565b6020026020010151612672565b80610dfe816139b5565b915050610dc8565b600d5460165460009182916001600160a01b039091169061271090610e2b90866139ce565b610e359190613a03565b915091509250929050565b6000610e4b83611781565b8210610ead5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b09565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60155460ff1615610f1d5760405162461bcd60e51b8152602060048201526011602482015270109d5c9b9a5b99c81a5cc814185d5cd959607a1b6044820152606401610b09565b6014548151610f2c9190613a17565b15610f835760405162461bcd60e51b815260206004820152602160248201527f4d7573742062652061206d756c7469706c65206f662062617365206e756d62656044820152603960f91b6064820152608401610b09565b60006014548251610f949190613a03565b905060005b8251811015610fda57610fc83361dead858481518110610fbb57610fbb613989565b6020026020010151610d63565b80610fd2816139b5565b915050610f99565b5060005b81811015610d5e57610ff4600c80546001019055565b61100633611001600c5490565b612698565b80611010816139b5565b915050610fde565b600b546001600160a01b036101009091041633146110485760405162461bcd60e51b8152600401610b09906138cf565b6102ee8161ffff1611156110b45760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201526c657175616c20746f20372c352560981b6064820152608401610b09565b61ffff16601655565b600b546001600160a01b036101009091041633146110ed5760405162461bcd60e51b8152600401610b09906138cf565b60008151116111355760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610b09565b60005b8151811015611198576000601a600084848151811061115957611159613989565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611190906139b5565b915050611138565b5050565b336000908152601760205260409020546112065760405162461bcd60e51b815260206004820152602560248201527f446576204f6e6c793a2063616c6c6572206973206e6f742074686520646576656044820152643637b832b960d91b6064820152608401610b09565b336000908152601760205260409020600101548061125a5760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610b09565b604051339082156108fc029083906000818181858888f19350505050158015611287573d6000803e3d6000fd5b503360008181526017602052604080822060010191909155517f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906112cf9084815260200190565b60405180910390a250565b610d5e83838360405180602001604052806000815250611f36565b6112fe33610d68565b6113635760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610b09565b61136c816127d7565b50565b600b546001600160a01b0361010090910416331461139f5760405162461bcd60e51b8152600401610b09906138cf565b601255565b600b546001600160a01b036101009091041633146113d45760405162461bcd60e51b8152600401610b09906138cf565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561141d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114419190613a2b565b9050816001600160a01b031663a9059cbb61146a600b546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114db9190613a44565b50604080516001600160a01b03851681526020810183905233917f5aa586896a67fb05c3b86276f66eecee7da00719d0e7299c403596fa2ec58ca4910160405180910390a2505050565b600061153060085490565b82106115935760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b09565b600882815481106115a6576115a6613989565b90600052602060002001549050919050565b600b546001600160a01b036101009091041633146115e85760405162461bcd60e51b8152600401610b09906138cf565b805161119890600e9060208401906131f2565b6000818152600260205260408120546001600160a01b031680610aae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b09565b600b546001600160a01b036101009091041633146116a25760405162461bcd60e51b8152600401610b09906138cf565b601455565b600b546001600160a01b036101009091041633146116d75760405162461bcd60e51b8152600401610b09906138cf565b600b5460ff166116eb576116e96127e0565b565b6116e9612855565b600e805461170090613904565b80601f016020809104026020016040519081016040528092919081815260200182805461172c90613904565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b60006001600160a01b0382166117ec5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b09565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b036101009091041633146118385760405162461bcd60e51b8152600401610b09906138cf565b600b5460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b8054610100600160a81b0319169055565b600b546001600160a01b036101009091041633146118b85760405162461bcd60e51b8152600401610b09906138cf565b60008251116119005760405162461bcd60e51b81526020600482015260146024820152734572726f723a206c69737420697320656d70747960601b6044820152606401610b09565b60005b8251811015610d5e5760006001600160a01b031683828151811061192957611929613989565b60200260200101516001600160a01b03160361197e5760405162461bcd60e51b815260206004820152601460248201527320b2323932b9b99031b0b73737ba10313290181760611b6044820152606401610b09565b81601a600085848151811061199557611995613989565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806119cc906139b5565b915050611903565b600b546001600160a01b03610100909104163314611a045760405162461bcd60e51b8152600401610b09906138cf565b61119882826128cf565b600b546001600160a01b03610100909104163314611a3e5760405162461bcd60e51b8152600401610b09906138cf565b601355565b606060018054610b4390613904565b600b546001600160a01b03610100909104163314611a825760405162461bcd60e51b8152600401610b09906138cf565b8160005b8251811015611bbd57816001600160a01b03166342842e0e30611ab7600b546001600160a01b036101009091041690565b868581518110611ac957611ac9613989565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b50505050336001600160a01b03167fb8dbf4ce06446b88ef02ffd28a948c2637ac80fb0bd4d3a31c70878c1046eb7f85858481518110611b7957611b79613989565b6020026020010151604051611ba39291906001600160a01b03929092168252602082015260400190565b60405180910390a280611bb5816139b5565b915050611a86565b50505050565b600b5460ff1615611be65760405162461bcd60e51b8152600401610b0990613a61565b6000611bf160085490565b9050600082118015611c0557506011548211155b611c515760405162461bcd60e51b815260206004820152601760248201527f4572726f723a206d617820706172207478206c696d69740000000000000000006044820152606401610b09565b601254611c5d33611781565b611c68906001613a8b565b1115611cb65760405162461bcd60e51b815260206004820152601c60248201527f4572726f723a206d6178207065722061646472657373206c696d6974000000006044820152606401610b09565b81601354611cc491906139ce565b3414611d095760405162461bcd60e51b81526020600482015260146024820152734572726f723a20696e76616c696420707269636560601b6044820152606401610b09565b6010546001611d188484613a8b565b611d229190613aa3565b10611d815760405162461bcd60e51b815260206004820152602960248201527f4572726f723a2063616e6e6f74206d696e74206d6f7265207468616e20746f74604482015268616c20737570706c7960b81b6064820152608401610b09565b60195460ff1615611e1157336000908152601a6020526040902054821115611e115760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20796f7520617265206e6f742077686974656c6973746564206f60448201527f7220616d6f756e7420697320686967686572207468616e206c696d69740000006064820152608401610b09565b60005b82811015611e6857611e253361295a565b60195460ff1615611e5657336000908152601a60205260408120805460019290611e50908490613aa3565b90915550505b80611e60816139b5565b915050611e14565b506111983461297f565b336001600160a01b03831603611eca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b09565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611f4033836123dd565b611f5c5760405162461bcd60e51b8152600401610b0990613938565b611bbd84848484612a32565b600b546001600160a01b03610100909104163314611f985760405162461bcd60e51b8152600401610b09906138cf565b6019805460ff19811660ff90911615179055565b600b546001600160a01b03610100909104163314611fdc5760405162461bcd60e51b8152600401610b09906138cf565b6015805460ff1916911515919091179055565b600f805461170090613904565b600b546001600160a01b0361010090910416331461202c5760405162461bcd60e51b8152600401610b09906138cf565b601155565b6060610aae82612a65565b6060600061204983611781565b90508060000361206d5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561208857612088613415565b6040519080825280602002602001820160405280156120b1578160200160208202803683370190505b50905060005b82811015612065576120c98582610e40565b8282815181106120db576120db613989565b6020908102919091010152806120f0816139b5565b9150506120b7565b50919050565b600b546001600160a01b0361010090910416331461212e5760405162461bcd60e51b8152600401610b09906138cf565b47806121705760405162461bcd60e51b815260206004820152601160248201527008ae4e4dee47440dcde40cccacae640745607b1b6044820152606401610b09565b604051339082156108fc029083906000818181858888f1935050505015801561219d573d6000803e3d6000fd5b5060005b60185460ff821610156121fe57600060188260ff16815481106121c6576121c6613989565b60009182526020808320909101546001600160a01b0316825260179052604081206001015550806121f681613aba565b9150506121a1565b5060405181815233907f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906020016112cf565b600b546001600160a01b036101009091041633146122615760405162461bcd60e51b8152600401610b09906138cf565b6001600160a01b0381166122c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b09565b600b546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000908152600260205260409020546001600160a01b0316151590565b60006001600160e01b0319821663780e9d6360e01b1480610aae5750610aae82612b23565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123a4826115fb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123e88261232d565b6124495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b09565b6000612454836115fb565b9050806001600160a01b0316846001600160a01b0316148061248f5750836001600160a01b031661248484610bc6565b6001600160a01b0316145b806124bf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166124da826115fb565b6001600160a01b0316146125425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b09565b6001600160a01b0382166125a45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b09565b6125af838383612b73565b6125ba60008261236f565b6001600160a01b03831660009081526003602052604081208054600192906125e3908490613aa3565b90915550506001600160a01b0382166000908152600360205260408120805460019290612611908490613a8b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b82811015610d5e576126868261295a565b80612690816139b5565b915050612675565b6001600160a01b0382166126ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b09565b6126f78161232d565b156127445760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b09565b61275060008383612b73565b6001600160a01b0382166000908152600360205260408120805460019290612779908490613a8b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61136c81612ba1565b600b5460ff16156128035760405162461bcd60e51b8152600401610b0990613a61565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128383390565b6040516001600160a01b03909116815260200160405180910390a1565b600b5460ff1661289e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b09565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612838565b6128d88261232d565b61293b5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610b09565b6000828152600a602090815260409091208251610d5e928401906131f2565b612968600c80546001019055565b6000612973600c5490565b90506111988282612698565b60005b60185460ff8216101561119857600060188260ff16815481106129a7576129a7613989565b60009182526020808320909101546001600160a01b031680835260179091526040822054909250906129e56127106129df8785612be1565b90612c6a565b6001600160a01b038416600090815260176020526040812060010180549293508392909190612a15908490613a8b565b925050819055505050508080612a2a90613aba565b915050612982565b612a3d8484846124c7565b612a4984848484612cac565b611bbd5760405162461bcd60e51b8152600401610b0990613ad9565b6060612a708261232d565b612ad65760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b09565b6000612ae0612dad565b90506000612aec612dbc565b905081612af885612dcb565b82604051602001612b0b93929190613b2b565b60405160208183030381529060405292505050919050565b60006001600160e01b031982166380ac58cd60e01b1480612b5457506001600160e01b03198216635b5e139f60e01b145b80610aae57506301ffc9a760e01b6001600160e01b0319831614610aae565b600b5460ff1615612b965760405162461bcd60e51b8152600401610b0990613a61565b610d5e838383612ecc565b612baa81612f84565b6000818152600a602052604090208054612bc390613904565b15905061136c576000818152600a6020526040812061136c91613276565b600082600003612bf357506000610aae565b6000612bff83856139ce565b905082612c0c8583613a03565b14612c635760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b09565b9392505050565b6000612c6383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061302b565b60006001600160a01b0384163b15612da257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612cf0903390899088908890600401613b6e565b6020604051808303816000875af1925050508015612d2b575060408051601f3d908101601f19168201909252612d2891810190613bab565b60015b612d88573d808015612d59576040519150601f19603f3d011682016040523d82523d6000602084013e612d5e565b606091505b508051600003612d805760405162461bcd60e51b8152600401610b0990613ad9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506124bf565b506001949350505050565b6060600e8054610b4390613904565b6060600f8054610b4390613904565b606081600003612df25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e1c5780612e06816139b5565b9150612e159050600a83613a03565b9150612df6565b60008167ffffffffffffffff811115612e3757612e37613415565b6040519080825280601f01601f191660200182016040528015612e61576020820181803683370190505b5090505b84156124bf57612e76600183613aa3565b9150612e83600a86613a17565b612e8e906030613a8b565b60f81b818381518110612ea357612ea3613989565b60200101906001600160f81b031916908160001a905350612ec5600a86613a03565b9450612e65565b6001600160a01b038316612f2757612f2281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f4a565b816001600160a01b0316836001600160a01b031614612f4a57612f4a8382613062565b6001600160a01b038216612f6157610d5e816130ff565b826001600160a01b0316826001600160a01b031614610d5e57610d5e82826131ae565b6000612f8f826115fb565b9050612f9d81600084612b73565b612fa860008361236f565b6001600160a01b0381166000908152600360205260408120805460019290612fd1908490613aa3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000818361304c5760405162461bcd60e51b8152600401610b09919061339c565b5060006130598486613a03565b95945050505050565b6000600161306f84611781565b6130799190613aa3565b6000838152600760205260409020549091508082146130cc576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061311190600190613aa3565b6000838152600960205260408120546008805493945090928490811061313957613139613989565b90600052602060002001549050806008838154811061315a5761315a613989565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061319257613192613bc8565b6001900381819060005260206000200160009055905550505050565b60006131b983611781565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546131fe90613904565b90600052602060002090601f0160209004810192826132205760008555613266565b82601f1061323957805160ff1916838001178555613266565b82800160010185558215613266579182015b8281111561326657825182559160200191906001019061324b565b506132729291506132ac565b5090565b50805461328290613904565b6000825580601f10613292575050565b601f01602090049060005260206000209081019061136c91905b5b8082111561327257600081556001016132ad565b6000602082840312156132d357600080fd5b5035919050565b6001600160e01b03198116811461136c57600080fd5b60006020828403121561330257600080fd5b8135612c63816132da565b80356001600160a01b038116811461332457600080fd5b919050565b60006020828403121561333b57600080fd5b612c638261330d565b60005b8381101561335f578181015183820152602001613347565b83811115611bbd5750506000910152565b60008151808452613388816020860160208601613344565b601f01601f19169290920160200192915050565b602081526000612c636020830184613370565b600080604083850312156133c257600080fd5b6133cb8361330d565b946020939093013593505050565b6000806000606084860312156133ee57600080fd5b6133f78461330d565b92506134056020850161330d565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561345457613454613415565b604052919050565b600067ffffffffffffffff82111561347657613476613415565b5060051b60200190565b600082601f83011261349157600080fd5b813560206134a66134a18361345c565b61342b565b82815260059290921b840181019181810190868411156134c557600080fd5b8286015b848110156134e7576134da8161330d565b83529183019183016134c9565b509695505050505050565b6000806040838503121561350557600080fd5b823567ffffffffffffffff81111561351c57600080fd5b61352885828601613480565b95602094909401359450505050565b6000806040838503121561354a57600080fd5b50508035926020909101359150565b600082601f83011261356a57600080fd5b8135602061357a6134a18361345c565b82815260059290921b8401810191818101908684111561359957600080fd5b8286015b848110156134e7578035835291830191830161359d565b6000602082840312156135c657600080fd5b813567ffffffffffffffff8111156135dd57600080fd5b6124bf84828501613559565b6000602082840312156135fb57600080fd5b813561ffff81168114612c6357600080fd5b60006020828403121561361f57600080fd5b813567ffffffffffffffff81111561363657600080fd5b6124bf84828501613480565b600067ffffffffffffffff83111561365c5761365c613415565b61366f601f8401601f191660200161342b565b905082815283838301111561368357600080fd5b828260208301376000602084830101529392505050565b600082601f8301126136ab57600080fd5b612c6383833560208501613642565b6000602082840312156136cc57600080fd5b813567ffffffffffffffff8111156136e357600080fd5b6124bf8482850161369a565b6000806040838503121561370257600080fd5b82359150602083013567ffffffffffffffff81111561372057600080fd5b61372c8582860161369a565b9150509250929050565b6000806040838503121561374957600080fd5b6137528361330d565b9150602083013567ffffffffffffffff81111561376e57600080fd5b61372c85828601613559565b801515811461136c57600080fd5b6000806040838503121561379b57600080fd5b6137a48361330d565b915060208301356137b48161377a565b809150509250929050565b600080600080608085870312156137d557600080fd5b6137de8561330d565b93506137ec6020860161330d565b925060408501359150606085013567ffffffffffffffff81111561380f57600080fd5b8501601f8101871361382057600080fd5b61382f87823560208401613642565b91505092959194509250565b60006020828403121561384d57600080fd5b8135612c638161377a565b6020808252825182820181905260009190848201906040850190845b8181101561389057835183529284019291840191600101613874565b50909695505050505050565b600080604083850312156138af57600080fd5b6138b88361330d565b91506138c66020840161330d565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061391857607f821691505b6020821081036120f857634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139c7576139c761399f565b5060010190565b60008160001904831182151516156139e8576139e861399f565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a1257613a126139ed565b500490565b600082613a2657613a266139ed565b500690565b600060208284031215613a3d57600080fd5b5051919050565b600060208284031215613a5657600080fd5b8151612c638161377a565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008219821115613a9e57613a9e61399f565b500190565b600082821015613ab557613ab561399f565b500390565b600060ff821660ff8103613ad057613ad061399f565b60010192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008451613b3d818460208901613344565b845190830190613b51818360208901613344565b8451910190613b64818360208801613344565b0195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ba190830184613370565b9695505050505050565b600060208284031215613bbd57600080fd5b8151612c63816132da565b634e487b7160e01b600052603160045260246000fdfea264697066735822122054a3911f82385d09b014dc5135a09260d28eaf821ff3e74d2317e25f050ed66464736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000164c4dd094fc1ad2afc009e16c8cce7089341b1d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _devList (address[]): 0x164C4dD094fC1Ad2aFC009e16c8cce7089341b1D
Arg [1] : _fees (uint256[]): 10000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000164c4dd094fc1ad2afc009e16c8cce7089341b1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode Sourcemap
56054:10404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61122:103;;;;;;;;;;-1:-1:-1;61122:103:0;;;;;:::i;:::-;;:::i;:::-;;;364:14:1;;357:22;339:41;;327:2;312:18;61122:103:0;;;;;;;;63746:292;;;;;;;;;;-1:-1:-1;63746:292:0;;;;;:::i;:::-;;:::i;63405:122::-;;;;;;;;;;-1:-1:-1;63405:122:0;;;;;:::i;:::-;;:::i;:::-;;24266:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25956:308::-;;;;;;;;;;-1:-1:-1;25956:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;25956:308:0;1897:203:1;25479:411:0;;;;;;;;;;-1:-1:-1;25479:411:0;;;;;:::i;:::-;;:::i;39040:113::-;;;;;;;;;;-1:-1:-1;39128:10:0;:17;39040:113;;;2510:25:1;;;2498:2;2483:18;39040:113:0;2364:177:1;27015:376:0;;;;;;;;;;-1:-1:-1;27015:376:0;;;;;:::i;:::-;;:::i;65637:205::-;;;;;;;;;;-1:-1:-1;65637:205:0;;;;;:::i;:::-;;:::i;57244:28::-;;;;;;;;;;;;;;;;61233:238;;;;;;;;;;-1:-1:-1;61233:238:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5018:32:1;;;5000:51;;5082:2;5067:18;;5060:34;;;;4973:18;61233:238:0;4826:274:1;38621:343:0;;;;;;;;;;-1:-1:-1;38621:343:0;;;;;:::i;:::-;;:::i;59614:762::-;;;;;;;;;;-1:-1:-1;59614:762:0;;;;;:::i;:::-;;:::i;63135:258::-;;;;;;;;;;-1:-1:-1;63135:258:0;;;;;:::i;:::-;;:::i;61991:242::-;;;;;;;;;;-1:-1:-1;61991:242:0;;;;;:::i;:::-;;:::i;64482:285::-;;;;;;;;;;;;;:::i;27462:185::-;;;;;;;;;;-1:-1:-1;27462:185:0;;;;;:::i;:::-;;:::i;51492:282::-;;;;;;;;;;-1:-1:-1;51492:282:0;;;;;:::i;:::-;;:::i;62463:106::-;;;;;;;;;;-1:-1:-1;62463:106:0;;;;;:::i;:::-;;:::i;65306:319::-;;;;;;;;;;-1:-1:-1;65306:319:0;;;;;:::i;:::-;;:::i;39230:320::-;;;;;;;;;;-1:-1:-1;39230:320:0;;;;;:::i;:::-;;:::i;62683:104::-;;;;;;;;;;-1:-1:-1;62683:104:0;;;;;:::i;:::-;;:::i;47489:86::-;;;;;;;;;;-1:-1:-1;47560:7:0;;;;47489:86;;23873:326;;;;;;;;;;-1:-1:-1;23873:326:0;;;;;:::i;:::-;;:::i;62893:94::-;;;;;;;;;;-1:-1:-1;62893:94:0;;;;;:::i;:::-;;:::i;62354:101::-;;;;;;;;;;;;;:::i;56921:21::-;;;;;;;;;;;;;:::i;23516:295::-;;;;;;;;;;-1:-1:-1;23516:295:0;;;;;:::i;:::-;;:::i;50446:148::-;;;;;;;;;;;;;:::i;57090:33::-;;;;;;;;;;;;;;;;61613:370;;;;;;;;;;-1:-1:-1;61613:370:0;;;;;:::i;:::-;;:::i;63005:116::-;;;;;;;;;;-1:-1:-1;63005:116:0;;;;;:::i;:::-;;:::i;49795:87::-;;;;;;;;;;-1:-1:-1;49868:6:0;;;;;-1:-1:-1;;;;;49868:6:0;49795:87;;57465:34;;;;;;;;;;-1:-1:-1;57465:34:0;;;;;;;;62795:90;;;;;;;;;;-1:-1:-1;62795:90:0;;;;;:::i;:::-;;:::i;24435:104::-;;;;;;;;;;;;;:::i;66092:363::-;;;;;;;;;;-1:-1:-1;66092:363:0;;;;;:::i;:::-;;:::i;57130:31::-;;;;;;;;;;;;;;;;58774:828;;;;;;:::i;:::-;;:::i;26336:327::-;;;;;;;;;;-1:-1:-1;26336:327:0;;;;;:::i;:::-;;:::i;56837:74::-;;;;;;;;;;-1:-1:-1;56837:74:0;;;;-1:-1:-1;;;;;56837:74:0;;;27718:365;;;;;;;;;;-1:-1:-1;27718:365:0;;;;;:::i;:::-;;:::i;62241:105::-;;;;;;;;;;;;;:::i;61499:106::-;;;;;;;;;;-1:-1:-1;61499:106:0;;;;;:::i;:::-;;:::i;56949:37::-;;;;;;;;;;;;;:::i;62577:98::-;;;;;;;;;;-1:-1:-1;62577:98:0;;;;;:::i;:::-;;:::i;57168:27::-;;;;;;;;;;;;;;;;60384:196;;;;;;;;;;-1:-1:-1;60384:196:0;;;;;:::i;:::-;;:::i;60588:526::-;;;;;;;;;;-1:-1:-1;60588:526:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57016:32::-;;;;;;;;;;;;;;;;57202:29;;;;;;;;;;-1:-1:-1;57202:29:0;;;;;;;;64847:403;;;;;;;;;;;;;:::i;26734:214::-;;;;;;;;;;-1:-1:-1;26734:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;26905:25:0;;;26876:4;26905:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26734:214;57383:41;;;;;;;;;;-1:-1:-1;57383:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;10980:25:1;;;11036:2;11021:18;;11014:34;;;;10953:18;57383:41:0;10806:248:1;50749:281:0;;;;;;;;;;-1:-1:-1;50749:281:0;;;;;:::i;:::-;;:::i;57055:28::-;;;;;;;;;;;;;;;;57506:46;;;;;;;;;;-1:-1:-1;57506:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;61122:103;61179:4;61204:12;61212:3;61204:7;:12::i;:::-;61196:21;61122:103;-1:-1:-1;;61122:103:0:o;63746:292::-;63894:4;-1:-1:-1;;;;;;63936:41:0;;-1:-1:-1;;;63936:41:0;;:94;;;63994:36;64018:11;63994:23;:36::i;63405:122::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;;;;;;;;;63487:14:::1;:32:::0;;-1:-1:-1;;;;;;63487:32:0::1;-1:-1:-1::0;;;;;63487:32:0;;;::::1;::::0;;;::::1;::::0;;63405:122::o;24266:100::-;24320:13;24353:5;24346:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24266:100;:::o;25956:308::-;26077:7;26124:16;26132:7;26124;:16::i;:::-;26102:110;;;;-1:-1:-1;;;26102:110:0;;12007:2:1;26102:110:0;;;11989:21:1;12046:2;12026:18;;;12019:30;12085:34;12065:18;;;12058:62;-1:-1:-1;;;12136:18:1;;;12129:42;12188:19;;26102:110:0;11805:408:1;26102:110:0;-1:-1:-1;26232:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26232:24:0;;25956:308::o;25479:411::-;25560:13;25576:23;25591:7;25576:14;:23::i;:::-;25560:39;;25624:5;-1:-1:-1;;;;;25618:11:0;:2;-1:-1:-1;;;;;25618:11:0;;25610:57;;;;-1:-1:-1;;;25610:57:0;;12420:2:1;25610:57:0;;;12402:21:1;12459:2;12439:18;;;12432:30;12498:34;12478:18;;;12471:62;-1:-1:-1;;;12549:18:1;;;12542:31;12590:19;;25610:57:0;12218:397:1;25610:57:0;18401:10;-1:-1:-1;;;;;25702:21:0;;;;:62;;-1:-1:-1;25727:37:0;25744:5;18401:10;26734:214;:::i;25727:37::-;25680:168;;;;-1:-1:-1;;;25680:168:0;;12822:2:1;25680:168:0;;;12804:21:1;12861:2;12841:18;;;12834:30;12900:34;12880:18;;;12873:62;12971:26;12951:18;;;12944:54;13015:19;;25680:168:0;12620:420:1;25680:168:0;25861:21;25870:2;25874:7;25861:8;:21::i;:::-;25549:341;25479:411;;:::o;27015:376::-;27224:41;18401:10;27243:12;27257:7;27224:18;:41::i;:::-;27202:140;;;;-1:-1:-1;;;27202:140:0;;;;;;;:::i;:::-;27355:28;27365:4;27371:2;27375:7;27355:9;:28::i;65637:205::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;65733:9:::1;65728:107;65752:5;:12;65748:1;:16;65728:107;;;65786:37;65807:6;65814:5;65820:1;65814:8;;;;;;;;:::i;:::-;;;;;;;65786:20;:37::i;:::-;65766:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65728:107;;61233:238:::0;61416:14;;61446:7;;61351:16;;;;-1:-1:-1;;;;;61416:14:0;;;;61457:5;;61433:20;;:10;:20;:::i;:::-;61432:30;;;;:::i;:::-;61408:55;;;;61233:238;;;;;:::o;38621:343::-;38763:7;38818:23;38835:5;38818:16;:23::i;:::-;38810:5;:31;38788:124;;;;-1:-1:-1;;;38788:124:0;;14499:2:1;38788:124:0;;;14481:21:1;14538:2;14518:18;;;14511:30;14577:34;14557:18;;;14550:62;-1:-1:-1;;;14628:18:1;;;14621:41;14679:19;;38788:124:0;14297:407:1;38788:124:0;-1:-1:-1;;;;;;38930:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38621:343::o;59614:762::-;59781:10;;;;:19;59773:49;;;;-1:-1:-1;;;59773:49:0;;14911:2:1;59773:49:0;;;14893:21:1;14950:2;14930:18;;;14923:30;-1:-1:-1;;;14969:18:1;;;14962:47;15026:18;;59773:49:0;14709:341:1;59773:49:0;59859:8;;59841;:15;:26;;;;:::i;:::-;:31;59833:77;;;;-1:-1:-1;;;59833:77:0;;15374:2:1;59833:77:0;;;15356:21:1;15413:2;15393:18;;;15386:30;15452:34;15432:18;;;15425:62;-1:-1:-1;;;15503:18:1;;;15496:31;15544:19;;59833:77:0;15172:397:1;59833:77:0;59923:16;59960:8;;59942;:15;:26;;;;:::i;:::-;59923:45;;59986:13;59981:220;60013:8;:15;60005:5;:23;59981:220;;;60095:94;60108:10;60128:42;60173:8;60182:5;60173:15;;;;;;;;:::i;:::-;;;;;;;60095:12;:94::i;:::-;60030:7;;;;:::i;:::-;;;;59981:220;;;;60218:13;60213:152;60245:8;60237:5;:16;60213:152;;;60279:21;:9;52811:19;;52829:1;52811:19;;;52722:127;60279:21;60315:38;60321:10;60333:19;:9;52692:14;;52600:114;60333:19;60315:5;:38::i;:::-;60255:7;;;;:::i;:::-;;;;60213:152;;63135:258;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;63302:3:::1;63290:8;:15;;;;63282:74;;;::::0;-1:-1:-1;;;63282:74:0;;16188:2:1;63282:74:0::1;::::0;::::1;16170:21:1::0;16227:2;16207:18;;;16200:30;16266:34;16246:18;;;16239:62;-1:-1:-1;;;16317:18:1;;;16310:43;16370:19;;63282:74:0::1;15986:409:1::0;63282:74:0::1;63367:18;;:7;:18:::0;63135:258::o;61991:242::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62105:1:::1;62084:11;:18;:22;62076:54;;;::::0;-1:-1:-1;;;62076:54:0;;16602:2:1;62076:54:0::1;::::0;::::1;16584:21:1::0;16641:2;16621:18;;;16614:30;-1:-1:-1;;;16660:18:1;;;16653:50;16720:18;;62076:54:0::1;16400:344:1::0;62076:54:0::1;62145:9;62141:84;62161:11;:18;62159:1;:20;62141:84;;;62224:1;62194:11;:27;62206:11;62218:1;62206:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;62194:27:0::1;-1:-1:-1::0;;;;;62194:27:0::1;;;;;;;;;;;;:31;;;;62180:3;;;;;:::i;:::-;;;;62141:84;;;;61991:242:::0;:::o;64482:285::-;56252:10;56274:1;56244:19;;;:7;:19;;;;;:27;56236:82;;;;-1:-1:-1;;;56236:82:0;;16951:2:1;56236:82:0;;;16933:21:1;16990:2;16970:18;;;16963:30;17029:34;17009:18;;;17002:62;-1:-1:-1;;;17080:18:1;;;17073:35;17125:19;;56236:82:0;16749:401:1;56236:82:0;64556:10:::1;64531:14;64548:19:::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;64593:10;64585:39:::1;;;::::0;-1:-1:-1;;;64585:39:0;;17357:2:1;64585:39:0::1;::::0;::::1;17339:21:1::0;17396:2;17376:18;;;17369:30;-1:-1:-1;;;17415:18:1;;;17408:47;17472:18;;64585:39:0::1;17155:341:1::0;64585:39:0::1;64635:36;::::0;64643:10:::1;::::0;64635:36;::::1;;;::::0;64664:6;;64635:36:::1;::::0;;;64664:6;64643:10;64635:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;64690:10:0::1;64711:1;64682:19:::0;;;:7:::1;:19;::::0;;;;;:26:::1;;:30:::0;;;;64728:31;::::1;::::0;::::1;::::0;64752:6;2510:25:1;;2498:2;2483:18;;2364:177;64728:31:0::1;;;;;;;;64520:247;64482:285::o:0;27462:185::-;27600:39;27617:4;27623:2;27627:7;27600:39;;;;;;;;;;;;:16;:39::i;51492:282::-;51624:41;18401:10;51643:12;18321:98;51624:41;51602:139;;;;-1:-1:-1;;;51602:139:0;;17703:2:1;51602:139:0;;;17685:21:1;17742:2;17722:18;;;17715:30;17781:34;17761:18;;;17754:62;-1:-1:-1;;;17832:18:1;;;17825:46;17888:19;;51602:139:0;17501:412:1;51602:139:0;51752:14;51758:7;51752:5;:14::i;:::-;51492:282;:::o;62463:106::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62537:12:::1;:24:::0;62463:106::o;65306:319::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;65458:38:::1;::::0;-1:-1:-1;;;65458:38:0;;65490:4:::1;65458:38;::::0;::::1;2043:51:1::0;65414:14:0;;65384:20:::1;::::0;-1:-1:-1;;;;;65458:23:0;::::1;::::0;::::1;::::0;2016:18:1;;65458:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65440:56;;65507:13;-1:-1:-1::0;;;;;65507:22:0::1;;65530:7;49868:6:::0;;-1:-1:-1;;;;;49868:6:0;;;;;;49795:87;65530:7:::1;65507:40;::::0;-1:-1:-1;;;;;;65507:40:0::1;::::0;;;;;;-1:-1:-1;;;;;5018:32:1;;;65507:40:0::1;::::0;::::1;5000:51:1::0;5067:18;;;5060:34;;;4973:18;;65507:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65563:54:0::1;::::0;;-1:-1:-1;;;;;5018:32:1;;5000:51;;5082:2;5067:18;;5060:34;;;65583:10:0::1;::::0;65563:54:::1;::::0;4973:18:1;65563:54:0::1;;;;;;;65373:252;;65306:319:::0;:::o;39230:320::-;39350:7;39405:30;39128:10;:17;;39040:113;39405:30;39397:5;:38;39375:132;;;;-1:-1:-1;;;39375:132:0;;18559:2:1;39375:132:0;;;18541:21:1;18598:2;18578:18;;;18571:30;18637:34;18617:18;;;18610:62;-1:-1:-1;;;18688:18:1;;;18681:42;18740:19;;39375:132:0;18357:408:1;39375:132:0;39525:10;39536:5;39525:17;;;;;;;;:::i;:::-;;;;;;;;;39518:24;;39230:320;;;:::o;62683:104::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62759:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;23873:326::-:0;23990:7;24031:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24031:16:0;;24058:110;;;;-1:-1:-1;;;24058:110:0;;18972:2:1;24058:110:0;;;18954:21:1;19011:2;18991:18;;;18984:30;19050:34;19030:18;;;19023:62;-1:-1:-1;;;19101:18:1;;;19094:39;19150:19;;24058:110:0;18770:405:1;62893:94:0;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62961:8:::1;:18:::0;62893:94::o;62354:101::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;47560:7;;;;62414:33:::1;;62439:8;:6;:8::i;:::-;62354:101::o:0;62414:33::-:1;62426:10;:8;:10::i;56921:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23516:295::-;23633:7;-1:-1:-1;;;;;23680:19:0;;23658:111;;;;-1:-1:-1;;;23658:111:0;;19382:2:1;23658:111:0;;;19364:21:1;19421:2;19401:18;;;19394:30;19460:34;19440:18;;;19433:62;-1:-1:-1;;;19511:18:1;;;19504:40;19561:19;;23658:111:0;19180:406:1;23658:111:0;-1:-1:-1;;;;;;23787:16:0;;;;;:9;:16;;;;;;;23516:295::o;50446:148::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;50537:6:::1;::::0;50516:40:::1;::::0;50553:1:::1;::::0;50537:6:::1;::::0;::::1;-1:-1:-1::0;;;;;50537:6:0::1;::::0;50516:40:::1;::::0;50553:1;;50516:40:::1;50567:6;:19:::0;;-1:-1:-1;;;;;;50567:19:0::1;::::0;;50446:148::o;61613:370::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;61738:1:::1;61716:12;:19;:23;61708:55;;;::::0;-1:-1:-1;;;61708:55:0;;16602:2:1;61708:55:0::1;::::0;::::1;16584:21:1::0;16641:2;16621:18;;;16614:30;-1:-1:-1;;;16660:18:1;;;16653:50;16720:18;;61708:55:0::1;16400:344:1::0;61708:55:0::1;61780:9;61776:190;61798:12;:19;61794:1;:23;61776:190;;;61875:1;-1:-1:-1::0;;;;;61848:29:0::1;:12;61861:1;61848:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;61848:29:0::1;::::0;61840:62:::1;;;::::0;-1:-1:-1;;;61840:62:0;;19793:2:1;61840:62:0::1;::::0;::::1;19775:21:1::0;19832:2;19812:18;;;19805:30;-1:-1:-1;;;19851:18:1;;;19844:50;19911:18;;61840:62:0::1;19591:344:1::0;61840:62:0::1;61949:5;61918:11;:28;61930:12;61943:1;61930:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;61918:28:0::1;-1:-1:-1::0;;;;;61918:28:0::1;;;;;;;;;;;;:36;;;;61819:3;;;;;:::i;:::-;;;;61776:190;;63005:116:::0;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;63087:26:::1;63100:7;63109:3;63087:12;:26::i;62795:90::-:0;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62861:5:::1;:16:::0;62795:90::o;24435:104::-;24491:13;24524:7;24517:14;;;;;:::i;66092:363::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;66221:14;66189:21:::1;66247:201;66271:3;:10;66267:1;:14;66247:201;;;66303:13;-1:-1:-1::0;;;;;66303:30:0::1;;66342:4;66349:7;49868:6:::0;;-1:-1:-1;;;;;49868:6:0;;;;;;49795:87;66349:7:::1;66358:3;66362:1;66358:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;66303:62:::1;::::0;-1:-1:-1;;;;;;66303:62:0::1;::::0;;;;;;-1:-1:-1;;;;;20198:15:1;;;66303:62:0::1;::::0;::::1;20180:34:1::0;20250:15;;;;20230:18;;;20223:43;20282:18;;;20275:34;20115:18;;66303:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66403:10;-1:-1:-1::0;;;;;66385:51:0::1;;66414:14;66429:3;66433:1;66429:6;;;;;;;;:::i;:::-;;;;;;;66385:51;;;;;;-1:-1:-1::0;;;;;5018:32:1;;;;5000:51;;5082:2;5067:18;;5060:34;4988:2;4973:18;;4826:274;66385:51:0::1;;;;;;;;66283:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66247:201;;;;66178:277;66092:363:::0;;:::o;58774:828::-;47560:7;;;;47814:9;47806:38;;;;-1:-1:-1;;;47806:38:0;;;;;;;:::i;:::-;58844:14:::1;58861:13;39128:10:::0;:17;;39040:113;58861:13:::1;58844:30;;58902:1;58893:6;:10;:32;;;;;58917:8;;58907:6;:18;;58893:32;58885:67;;;::::0;-1:-1:-1;;;58885:67:0;;20867:2:1;58885:67:0::1;::::0;::::1;20849:21:1::0;20906:2;20886:18;;;20879:30;20945:25;20925:18;;;20918:53;20988:18;;58885:67:0::1;20665:347:1::0;58885:67:0::1;59000:12;;58971:21;58981:10;58971:9;:21::i;:::-;:25;::::0;58995:1:::1;58971:25;:::i;:::-;:41;;58963:81;;;::::0;-1:-1:-1;;;58963:81:0;;21352:2:1;58963:81:0::1;::::0;::::1;21334:21:1::0;21391:2;21371:18;;;21364:30;21430;21410:18;;;21403:58;21478:18;;58963:81:0::1;21150:352:1::0;58963:81:0::1;59084:6;59076:5;;:14;;;;:::i;:::-;59063:9;:27;59055:60;;;::::0;-1:-1:-1;;;59055:60:0;;21709:2:1;59055:60:0::1;::::0;::::1;21691:21:1::0;21748:2;21728:18;;;21721:30;-1:-1:-1;;;21767:18:1;;;21760:50;21827:18;;59055:60:0::1;21507:344:1::0;59055:60:0::1;59156:9;::::0;59152:1:::1;59134:15;59143:6:::0;59134;:15:::1;:::i;:::-;:19;;;;:::i;:::-;:31;59126:85;;;::::0;-1:-1:-1;;;59126:85:0;;22188:2:1;59126:85:0::1;::::0;::::1;22170:21:1::0;22227:2;22207:18;;;22200:30;22266:34;22246:18;;;22239:62;-1:-1:-1;;;22317:18:1;;;22310:39;22366:19;;59126:85:0::1;21986:405:1::0;59126:85:0::1;59225:15;::::0;::::1;;59222:135;;;59271:10;59259:23;::::0;;;:11:::1;:23;::::0;;;;;:33;-1:-1:-1;59259:33:0::1;59251:106;;;::::0;-1:-1:-1;;;59251:106:0;;22598:2:1;59251:106:0::1;::::0;::::1;22580:21:1::0;22637:2;22617:18;;;22610:30;22676:34;22656:18;;;22649:62;22747:31;22727:18;;;22720:59;22796:19;;59251:106:0::1;22396:425:1::0;59251:106:0::1;59393:9;59388:164;59412:6;59408:1;:10;59388:164;;;59440:24;59453:10;59440:12;:24::i;:::-;59482:15;::::0;::::1;;59479:61;;;59524:10;59512:23;::::0;;;:11:::1;:23;::::0;;;;:28;;59539:1:::1;::::0;59512:23;:28:::1;::::0;59539:1;;59512:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;59479:61:0::1;59420:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59388:164;;;;59574:20;59584:9;59574;:20::i;26336:327::-:0;18401:10;-1:-1:-1;;;;;26471:24:0;;;26463:62;;;;-1:-1:-1;;;26463:62:0;;23028:2:1;26463:62:0;;;23010:21:1;23067:2;23047:18;;;23040:30;23106:27;23086:18;;;23079:55;23151:18;;26463:62:0;22826:349:1;26463:62:0;18401:10;26538:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26538:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26538:53:0;;;;;;;;;;26607:48;;339:41:1;;;26538:42:0;;18401:10;26607:48;;312:18:1;26607:48:0;;;;;;;26336:327;;:::o;27718:365::-;27907:41;18401:10;27940:7;27907:18;:41::i;:::-;27885:140;;;;-1:-1:-1;;;27885:140:0;;;;;;;:::i;:::-;28036:39;28050:4;28056:2;28060:7;28069:5;28036:13;:39::i;62241:105::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62323:15:::1;::::0;;-1:-1:-1;;62304:34:0;::::1;62323:15;::::0;;::::1;62322:16;62304:34;::::0;;62241:105::o;61499:106::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;61573:10:::1;:24:::0;;-1:-1:-1;;61573:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61499:106::o;56949:37::-;;;;;;;:::i;62577:98::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;62647:8:::1;:20:::0;62577:98::o;60384:196::-;60511:13;60549:23;60564:7;60549:14;:23::i;60588:526::-;60669:16;60703:18;60724:17;60734:6;60724:9;:17::i;:::-;60703:38;;60756:10;60770:1;60756:15;60752:355;;60795:16;;;60809:1;60795:16;;;;;;;;;;;-1:-1:-1;60788:23:0;60588:526;-1:-1:-1;;;60588:526:0:o;60752:355::-;60844:23;60884:10;60870:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60870:25:0;;60844:51;;60910:13;60938:130;60962:10;60954:5;:18;60938:130;;;61018:34;61038:6;61046:5;61018:19;:34::i;:::-;61002:6;61009:5;61002:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;60974:7;;;;:::i;:::-;;;;60938:130;;60752:355;60692:422;60588:526;;;:::o;64847:403::-;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;64923:21:::1;64963:10:::0;64955:39:::1;;;::::0;-1:-1:-1;;;64955:39:0;;17357:2:1;64955:39:0::1;::::0;::::1;17339:21:1::0;17396:2;17376:18;;;17369:30;-1:-1:-1;;;17415:18:1;;;17408:47;17472:18;;64955:39:0::1;17155:341:1::0;64955:39:0::1;65005:36;::::0;65013:10:::1;::::0;65005:36;::::1;;;::::0;65034:6;;65005:36:::1;::::0;;;65034:6;65013:10;65005:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65056:7;65052:144;65072:7;:14:::0;65068:18:::1;::::0;::::1;;65052:144;;;65108:18;65129:7;65137:1;65129:10;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;65129:10:0::1;65154:19:::0;;:7:::1;:19:::0;;;;;65129:10;65154:26:::1;:30:::0;-1:-1:-1;65088:3:0;::::1;::::0;::::1;:::i;:::-;;;;65052:144;;;-1:-1:-1::0;65211:31:0::1;::::0;2510:25:1;;;65224:10:0::1;::::0;65211:31:::1;::::0;2498:2:1;2483:18;65211:31:0::1;2364:177:1::0;50749:281:0;49868:6;;-1:-1:-1;;;;;49868:6:0;;;;;18401:10;50015:23;50007:68;;;;-1:-1:-1;;;50007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50852:22:0;::::1;50830:110;;;::::0;-1:-1:-1;;;50830:110:0;;23562:2:1;50830:110:0::1;::::0;::::1;23544:21:1::0;23601:2;23581:18;;;23574:30;23640:34;23620:18;;;23613:62;-1:-1:-1;;;23691:18:1;;;23684:36;23737:19;;50830:110:0::1;23360:402:1::0;50830:110:0::1;50977:6;::::0;50956:38:::1;::::0;-1:-1:-1;;;;;50956:38:0;;::::1;::::0;50977:6:::1;::::0;::::1;;::::0;50956:38:::1;::::0;;;::::1;51005:6;:17:::0;;-1:-1:-1;;;;;51005:17:0;;::::1;;;-1:-1:-1::0;;;;;;51005:17:0;;::::1;::::0;;;::::1;::::0;;50749:281::o;29630:127::-;29695:4;29719:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29719:16:0;:30;;;29630:127::o;38237:300::-;38384:4;-1:-1:-1;;;;;;38426:50:0;;-1:-1:-1;;;38426:50:0;;:103;;;38493:36;38517:11;38493:23;:36::i;33753:174::-;33828:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33828:29:0;-1:-1:-1;;;;;33828:29:0;;;;;;;;:24;;33882:23;33828:24;33882:14;:23::i;:::-;-1:-1:-1;;;;;33873:46:0;;;;;;;;;;;33753:174;;:::o;29924:452::-;30053:4;30097:16;30105:7;30097;:16::i;:::-;30075:110;;;;-1:-1:-1;;;30075:110:0;;23969:2:1;30075:110:0;;;23951:21:1;24008:2;23988:18;;;23981:30;24047:34;24027:18;;;24020:62;-1:-1:-1;;;24098:18:1;;;24091:42;24150:19;;30075:110:0;23767:408:1;30075:110:0;30196:13;30212:23;30227:7;30212:14;:23::i;:::-;30196:39;;30265:5;-1:-1:-1;;;;;30254:16:0;:7;-1:-1:-1;;;;;30254:16:0;;:64;;;;30311:7;-1:-1:-1;;;;;30287:31:0;:20;30299:7;30287:11;:20::i;:::-;-1:-1:-1;;;;;30287:31:0;;30254:64;:113;;;-1:-1:-1;;;;;;26905:25:0;;;26876:4;26905:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30335:32;30246:122;29924:452;-1:-1:-1;;;;29924:452:0:o;33020:615::-;33193:4;-1:-1:-1;;;;;33166:31:0;:23;33181:7;33166:14;:23::i;:::-;-1:-1:-1;;;;;33166:31:0;;33144:122;;;;-1:-1:-1;;;33144:122:0;;24382:2:1;33144:122:0;;;24364:21:1;24421:2;24401:18;;;24394:30;24460:34;24440:18;;;24433:62;-1:-1:-1;;;24511:18:1;;;24504:39;24560:19;;33144:122:0;24180:405:1;33144:122:0;-1:-1:-1;;;;;33285:16:0;;33277:65;;;;-1:-1:-1;;;33277:65:0;;24792:2:1;33277:65:0;;;24774:21:1;24831:2;24811:18;;;24804:30;24870:34;24850:18;;;24843:62;-1:-1:-1;;;24921:18:1;;;24914:34;24965:19;;33277:65:0;24590:400:1;33277:65:0;33355:39;33376:4;33382:2;33386:7;33355:20;:39::i;:::-;33459:29;33476:1;33480:7;33459:8;:29::i;:::-;-1:-1:-1;;;;;33501:15:0;;;;;;:9;:15;;;;;:20;;33520:1;;33501:15;:20;;33520:1;;33501:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33532:13:0;;;;;;:9;:13;;;;;:18;;33549:1;;33532:13;:18;;33549:1;;33532:18;:::i;:::-;;;;-1:-1:-1;;33561:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33561:21:0;-1:-1:-1;;;;;33561:21:0;;;;;;;;;33600:27;;33561:16;;33600:27;;;;;;;33020:615;;;:::o;65854:171::-;65940:9;65935:83;65959:6;65955:1;:10;65935:83;;;65987:19;66000:5;65987:12;:19::i;:::-;65967:3;;;;:::i;:::-;;;;65935:83;;31712:382;-1:-1:-1;;;;;31792:16:0;;31784:61;;;;-1:-1:-1;;;31784:61:0;;25197:2:1;31784:61:0;;;25179:21:1;;;25216:18;;;25209:30;25275:34;25255:18;;;25248:62;25327:18;;31784:61:0;24995:356:1;31784:61:0;31865:16;31873:7;31865;:16::i;:::-;31864:17;31856:58;;;;-1:-1:-1;;;31856:58:0;;25558:2:1;31856:58:0;;;25540:21:1;25597:2;25577:18;;;25570:30;25636;25616:18;;;25609:58;25684:18;;31856:58:0;25356:352:1;31856:58:0;31927:45;31956:1;31960:2;31964:7;31927:20;:45::i;:::-;-1:-1:-1;;;;;31985:13:0;;;;;;:9;:13;;;;;:18;;32002:1;;31985:13;:18;;32002:1;;31985:18;:::i;:::-;;;;-1:-1:-1;;32014:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32014:21:0;-1:-1:-1;;;;;32014:21:0;;;;;;;;32053:33;;32014:16;;;32053:33;;32014:16;;32053:33;31712:382;;:::o;64306:138::-;64416:20;64428:7;64416:11;:20::i;48289:118::-;47560:7;;;;47814:9;47806:38;;;;-1:-1:-1;;;47806:38:0;;;;;;;:::i;:::-;48349:7:::1;:14:::0;;-1:-1:-1;;48349:14:0::1;48359:4;48349:14;::::0;;48379:20:::1;48386:12;18401:10:::0;;18321:98;48386:12:::1;48379:20;::::0;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;48379:20:0::1;;;;;;;48289:118::o:0;48548:120::-;47560:7;;;;48084:41;;;;-1:-1:-1;;;48084:41:0;;25915:2:1;48084:41:0;;;25897:21:1;25954:2;25934:18;;;25927:30;-1:-1:-1;;;25973:18:1;;;25966:50;26033:18;;48084:41:0;25713:344:1;48084:41:0;48607:7:::1;:15:::0;;-1:-1:-1;;48607:15:0::1;::::0;;48638:22:::1;18401:10:::0;48647:12:::1;18321:98:::0;45696:277;45833:16;45841:7;45833;:16::i;:::-;45811:112;;;;-1:-1:-1;;;45811:112:0;;26264:2:1;45811:112:0;;;26246:21:1;26303:2;26283:18;;;26276:30;26342:34;26322:18;;;26315:62;-1:-1:-1;;;26393:18:1;;;26386:44;26447:19;;45811:112:0;26062:410:1;45811:112:0;45934:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;63563:163::-;63617:21;:9;52811:19;;52829:1;52811:19;;;52722:127;63617:21;63649:17;63669:19;:9;52692:14;;52600:114;63669:19;63649:39;;63698:20;63704:2;63708:9;63698:5;:20::i;58403:357::-;58468:7;58464:287;58484:7;:14;58480:18;;;;58464:287;;;58520:18;58541:7;58549:1;58541:10;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;58541:10:0;58584:19;;;:7;:19;;;;;;:27;58541:10;;-1:-1:-1;58584:27:0;58649:33;58676:5;58649:22;:10;58584:27;58649:14;:22::i;:::-;:26;;:33::i;:::-;-1:-1:-1;;;;;58697:19:0;;;;;;:7;:19;;;;;:26;;:42;;58626:56;;-1:-1:-1;58626:56:0;;58697:26;;:19;:42;;58626:56;;58697:42;:::i;:::-;;;;;;;;58505:246;;;58500:3;;;;;:::i;:::-;;;;58464:287;;28965:352;29122:28;29132:4;29138:2;29142:7;29122:9;:28::i;:::-;29183:48;29206:4;29212:2;29216:7;29225:5;29183:22;:48::i;:::-;29161:148;;;;-1:-1:-1;;;29161:148:0;;;;;;;:::i;45079:461::-;45197:13;45250:16;45258:7;45250;:16::i;:::-;45228:115;;;;-1:-1:-1;;;45228:115:0;;27098:2:1;45228:115:0;;;27080:21:1;27137:2;27117:18;;;27110:30;27176:34;27156:18;;;27149:62;-1:-1:-1;;;27227:18:1;;;27220:47;27284:19;;45228:115:0;26896:413:1;45228:115:0;45356:18;45377:10;:8;:10::i;:::-;45356:31;;45398:17;45418:16;:14;:16::i;:::-;45398:36;;45497:4;45503:20;45504:7;45503:18;:20::i;:::-;45525:3;45480:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45466:64;;;;45079:461;;;:::o;23097:355::-;23244:4;-1:-1:-1;;;;;;23286:40:0;;-1:-1:-1;;;23286:40:0;;:105;;-1:-1:-1;;;;;;;23343:48:0;;-1:-1:-1;;;23343:48:0;23286:105;:158;;;-1:-1:-1;;;;;;;;;;21722:40:0;;;23408:36;21563:207;64050:240;47560:7;;;;47814:9;47806:38;;;;-1:-1:-1;;;47806:38:0;;;;;;;:::i;:::-;64226:56:::1;64264:4;64270:2;64274:7;64226:37;:56::i;46202:206::-:0;46271:20;46283:7;46271:11;:20::i;:::-;46314:19;;;;:10;:19;;;;;46308:33;;;;;:::i;:::-;:38;;-1:-1:-1;46304:97:0;;46370:19;;;;:10;:19;;;;;46363:26;;;:::i;55028:250::-;55086:7;55110:1;55115;55110:6;55106:47;;-1:-1:-1;55140:1:0;55133:8;;55106:47;55165:9;55177:5;55181:1;55177;:5;:::i;:::-;55165:17;-1:-1:-1;55210:1:0;55201:5;55205:1;55165:17;55201:5;:::i;:::-;:10;55193:56;;;;-1:-1:-1;;;55193:56:0;;28185:2:1;55193:56:0;;;28167:21:1;28224:2;28204:18;;;28197:30;28263:34;28243:18;;;28236:62;-1:-1:-1;;;28314:18:1;;;28307:31;28355:19;;55193:56:0;27983:397:1;55193:56:0;55269:1;55028:250;-1:-1:-1;;;55028:250:0:o;55288:132::-;55346:7;55373:39;55377:1;55380;55373:39;;;;;;;;;;;;;;;;;:3;:39::i;34492:1053::-;34647:4;-1:-1:-1;;;;;34668:13:0;;10115:20;10163:8;34664:874;;34721:175;;-1:-1:-1;;;34721:175:0;;-1:-1:-1;;;;;34721:36:0;;;;;:175;;18401:10;;34815:4;;34842:7;;34872:5;;34721:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34721:175:0;;;;;;;;-1:-1:-1;;34721:175:0;;;;;;;;;;;;:::i;:::-;;;34700:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35083:6;:13;35100:1;35083:18;35079:389;;35126:108;;-1:-1:-1;;;35126:108:0;;;;;;;:::i;35079:389::-;35418:6;35412:13;35403:6;35399:2;35395:15;35388:38;34700:783;-1:-1:-1;;;;;;34960:55:0;-1:-1:-1;;;34960:55:0;;-1:-1:-1;34953:62:0;;34664:874;-1:-1:-1;35522:4:0;34492:1053;;;;;;:::o;58192:100::-;58244:13;58277:7;58270:14;;;;;:::i;58070:112::-;58128:13;58161;58154:20;;;;;:::i;18978:723::-;19034:13;19255:5;19264:1;19255:10;19251:53;;-1:-1:-1;;19282:10:0;;;;;;;;;;;;-1:-1:-1;;;19282:10:0;;;;;18978:723::o;19251:53::-;19329:5;19314:12;19370:78;19377:9;;19370:78;;19403:8;;;;:::i;:::-;;-1:-1:-1;19426:10:0;;-1:-1:-1;19434:2:0;19426:10;;:::i;:::-;;;19370:78;;;19458:19;19490:6;19480:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19480:17:0;;19458:39;;19508:154;19515:10;;19508:154;;19542:11;19552:1;19542:11;;:::i;:::-;;-1:-1:-1;19611:10:0;19619:2;19611:5;:10;:::i;:::-;19598:24;;:2;:24;:::i;:::-;19585:39;;19568:6;19575;19568:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19568:56:0;;;;;;;;-1:-1:-1;19639:11:0;19648:2;19639:11;;:::i;:::-;;;19508:154;;40163:589;-1:-1:-1;;;;;40369:18:0;;40365:187;;40404:40;40436:7;41579:10;:17;;41552:24;;;;:15;:24;;;;;:44;;;41607:24;;;;;;;;;;;;41475:164;40404:40;40365:187;;;40474:2;-1:-1:-1;;;;;40466:10:0;:4;-1:-1:-1;;;;;40466:10:0;;40462:90;;40493:47;40526:4;40532:7;40493:32;:47::i;:::-;-1:-1:-1;;;;;40566:16:0;;40562:183;;40599:45;40636:7;40599:36;:45::i;40562:183::-;40672:4;-1:-1:-1;;;;;40666:10:0;:2;-1:-1:-1;;;;;40666:10:0;;40662:83;;40693:40;40721:2;40725:7;40693:27;:40::i;32323:360::-;32383:13;32399:23;32414:7;32399:14;:23::i;:::-;32383:39;;32435:48;32456:5;32471:1;32475:7;32435:20;:48::i;:::-;32524:29;32541:1;32545:7;32524:8;:29::i;:::-;-1:-1:-1;;;;;32566:16:0;;;;;;:9;:16;;;;;:21;;32586:1;;32566:16;:21;;32586:1;;32566:21;:::i;:::-;;;;-1:-1:-1;;32605:16:0;;;;:7;:16;;;;;;32598:23;;-1:-1:-1;;;;;;32598:23:0;;;32639:36;32613:7;;32605:16;-1:-1:-1;;;;;32639:36:0;;;;;32605:16;;32639:36;32372:311;32323:360;:::o;55428:278::-;55514:7;55549:12;55542:5;55534:28;;;;-1:-1:-1;;;55534:28:0;;;;;;;;:::i;:::-;-1:-1:-1;55573:9:0;55585:5;55589:1;55585;:5;:::i;:::-;55573:17;55428:278;-1:-1:-1;;;;;55428:278:0:o;42266:1002::-;42546:22;42596:1;42571:22;42588:4;42571:16;:22::i;:::-;:26;;;;:::i;:::-;42608:18;42629:26;;;:17;:26;;;;;;42546:51;;-1:-1:-1;42762:28:0;;;42758:328;;-1:-1:-1;;;;;42829:18:0;;42807:19;42829:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42880:30;;;;;;:44;;;42997:30;;:17;:30;;;;;:43;;;42758:328;-1:-1:-1;43182:26:0;;;;:17;:26;;;;;;;;43175:33;;;-1:-1:-1;;;;;43226:18:0;;;;;:12;:18;;;;;:34;;;;;;;43219:41;42266:1002::o;43563:1079::-;43841:10;:17;43816:22;;43841:21;;43861:1;;43841:21;:::i;:::-;43873:18;43894:24;;;:15;:24;;;;;;44267:10;:26;;43816:46;;-1:-1:-1;43894:24:0;;43816:46;;44267:26;;;;;;:::i;:::-;;;;;;;;;44245:48;;44331:11;44306:10;44317;44306:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44411:28;;;:15;:28;;;;;;;:41;;;44583:24;;;;;44576:31;44618:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43634:1008;;;43563:1079;:::o;41053:221::-;41138:14;41155:20;41172:2;41155:16;:20::i;:::-;-1:-1:-1;;;;;41186:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41231:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41053:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;391:131::-;-1:-1:-1;;;;;;465:32:1;;455:43;;445:71;;512:1;509;502:12;527:245;585:6;638:2;626:9;617:7;613:23;609:32;606:52;;;654:1;651;644:12;606:52;693:9;680:23;712:30;736:5;712:30;:::i;777:173::-;845:20;;-1:-1:-1;;;;;894:31:1;;884:42;;874:70;;940:1;937;930:12;874:70;777:173;;;:::o;955:186::-;1014:6;1067:2;1055:9;1046:7;1042:23;1038:32;1035:52;;;1083:1;1080;1073:12;1035:52;1106:29;1125:9;1106:29;:::i;1146:258::-;1218:1;1228:113;1242:6;1239:1;1236:13;1228:113;;;1318:11;;;1312:18;1299:11;;;1292:39;1264:2;1257:10;1228:113;;;1359:6;1356:1;1353:13;1350:48;;;-1:-1:-1;;1394:1:1;1376:16;;1369:27;1146:258::o;1409:::-;1451:3;1489:5;1483:12;1516:6;1511:3;1504:19;1532:63;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1532:63;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1409:258;-1:-1:-1;;1409:258:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:275;3082:2;3076:9;3147:2;3128:13;;-1:-1:-1;;3124:27:1;3112:40;;3182:18;3167:34;;3203:22;;;3164:62;3161:88;;;3229:18;;:::i;:::-;3265:2;3258:22;3011:275;;-1:-1:-1;3011:275:1:o;3291:183::-;3351:4;3384:18;3376:6;3373:30;3370:56;;;3406:18;;:::i;:::-;-1:-1:-1;3451:1:1;3447:14;3463:4;3443:25;;3291:183::o;3479:668::-;3533:5;3586:3;3579:4;3571:6;3567:17;3563:27;3553:55;;3604:1;3601;3594:12;3553:55;3640:6;3627:20;3666:4;3690:60;3706:43;3746:2;3706:43;:::i;:::-;3690:60;:::i;:::-;3784:15;;;3870:1;3866:10;;;;3854:23;;3850:32;;;3815:12;;;;3894:15;;;3891:35;;;3922:1;3919;3912:12;3891:35;3958:2;3950:6;3946:15;3970:148;3986:6;3981:3;3978:15;3970:148;;;4052:23;4071:3;4052:23;:::i;:::-;4040:36;;4096:12;;;;4003;;3970:148;;;-1:-1:-1;4136:5:1;3479:668;-1:-1:-1;;;;;;3479:668:1:o;4152:416::-;4245:6;4253;4306:2;4294:9;4285:7;4281:23;4277:32;4274:52;;;4322:1;4319;4312:12;4274:52;4362:9;4349:23;4395:18;4387:6;4384:30;4381:50;;;4427:1;4424;4417:12;4381:50;4450:61;4503:7;4494:6;4483:9;4479:22;4450:61;:::i;:::-;4440:71;4558:2;4543:18;;;;4530:32;;-1:-1:-1;;;;4152:416:1:o;4573:248::-;4641:6;4649;4702:2;4690:9;4681:7;4677:23;4673:32;4670:52;;;4718:1;4715;4708:12;4670:52;-1:-1:-1;;4741:23:1;;;4811:2;4796:18;;;4783:32;;-1:-1:-1;4573:248:1:o;5105:662::-;5159:5;5212:3;5205:4;5197:6;5193:17;5189:27;5179:55;;5230:1;5227;5220:12;5179:55;5266:6;5253:20;5292:4;5316:60;5332:43;5372:2;5332:43;:::i;5316:60::-;5410:15;;;5496:1;5492:10;;;;5480:23;;5476:32;;;5441:12;;;;5520:15;;;5517:35;;;5548:1;5545;5538:12;5517:35;5584:2;5576:6;5572:15;5596:142;5612:6;5607:3;5604:15;5596:142;;;5678:17;;5666:30;;5716:12;;;;5629;;5596:142;;5772:348;5856:6;5909:2;5897:9;5888:7;5884:23;5880:32;5877:52;;;5925:1;5922;5915:12;5877:52;5965:9;5952:23;5998:18;5990:6;5987:30;5984:50;;;6030:1;6027;6020:12;5984:50;6053:61;6106:7;6097:6;6086:9;6082:22;6053:61;:::i;6125:272::-;6183:6;6236:2;6224:9;6215:7;6211:23;6207:32;6204:52;;;6252:1;6249;6242:12;6204:52;6291:9;6278:23;6341:6;6334:5;6330:18;6323:5;6320:29;6310:57;;6363:1;6360;6353:12;6402:348;6486:6;6539:2;6527:9;6518:7;6514:23;6510:32;6507:52;;;6555:1;6552;6545:12;6507:52;6595:9;6582:23;6628:18;6620:6;6617:30;6614:50;;;6660:1;6657;6650:12;6614:50;6683:61;6736:7;6727:6;6716:9;6712:22;6683:61;:::i;6755:407::-;6820:5;6854:18;6846:6;6843:30;6840:56;;;6876:18;;:::i;:::-;6914:57;6959:2;6938:15;;-1:-1:-1;;6934:29:1;6965:4;6930:40;6914:57;:::i;:::-;6905:66;;6994:6;6987:5;6980:21;7034:3;7025:6;7020:3;7016:16;7013:25;7010:45;;;7051:1;7048;7041:12;7010:45;7100:6;7095:3;7088:4;7081:5;7077:16;7064:43;7154:1;7147:4;7138:6;7131:5;7127:18;7123:29;7116:40;6755:407;;;;;:::o;7167:222::-;7210:5;7263:3;7256:4;7248:6;7244:17;7240:27;7230:55;;7281:1;7278;7271:12;7230:55;7303:80;7379:3;7370:6;7357:20;7350:4;7342:6;7338:17;7303:80;:::i;7394:322::-;7463:6;7516:2;7504:9;7495:7;7491:23;7487:32;7484:52;;;7532:1;7529;7522:12;7484:52;7572:9;7559:23;7605:18;7597:6;7594:30;7591:50;;;7637:1;7634;7627:12;7591:50;7660;7702:7;7693:6;7682:9;7678:22;7660:50;:::i;7721:390::-;7799:6;7807;7860:2;7848:9;7839:7;7835:23;7831:32;7828:52;;;7876:1;7873;7866:12;7828:52;7912:9;7899:23;7889:33;;7973:2;7962:9;7958:18;7945:32;8000:18;7992:6;7989:30;7986:50;;;8032:1;8029;8022:12;7986:50;8055;8097:7;8088:6;8077:9;8073:22;8055:50;:::i;:::-;8045:60;;;7721:390;;;;;:::o;8116:422::-;8209:6;8217;8270:2;8258:9;8249:7;8245:23;8241:32;8238:52;;;8286:1;8283;8276:12;8238:52;8309:29;8328:9;8309:29;:::i;:::-;8299:39;;8389:2;8378:9;8374:18;8361:32;8416:18;8408:6;8405:30;8402:50;;;8448:1;8445;8438:12;8402:50;8471:61;8524:7;8515:6;8504:9;8500:22;8471:61;:::i;8543:118::-;8629:5;8622:13;8615:21;8608:5;8605:32;8595:60;;8651:1;8648;8641:12;8666:315;8731:6;8739;8792:2;8780:9;8771:7;8767:23;8763:32;8760:52;;;8808:1;8805;8798:12;8760:52;8831:29;8850:9;8831:29;:::i;:::-;8821:39;;8910:2;8899:9;8895:18;8882:32;8923:28;8945:5;8923:28;:::i;:::-;8970:5;8960:15;;;8666:315;;;;;:::o;8986:667::-;9081:6;9089;9097;9105;9158:3;9146:9;9137:7;9133:23;9129:33;9126:53;;;9175:1;9172;9165:12;9126:53;9198:29;9217:9;9198:29;:::i;:::-;9188:39;;9246:38;9280:2;9269:9;9265:18;9246:38;:::i;:::-;9236:48;;9331:2;9320:9;9316:18;9303:32;9293:42;;9386:2;9375:9;9371:18;9358:32;9413:18;9405:6;9402:30;9399:50;;;9445:1;9442;9435:12;9399:50;9468:22;;9521:4;9513:13;;9509:27;-1:-1:-1;9499:55:1;;9550:1;9547;9540:12;9499:55;9573:74;9639:7;9634:2;9621:16;9616:2;9612;9608:11;9573:74;:::i;:::-;9563:84;;;8986:667;;;;;;;:::o;9658:241::-;9714:6;9767:2;9755:9;9746:7;9742:23;9738:32;9735:52;;;9783:1;9780;9773:12;9735:52;9822:9;9809:23;9841:28;9863:5;9841:28;:::i;9904:632::-;10075:2;10127:21;;;10197:13;;10100:18;;;10219:22;;;10046:4;;10075:2;10298:15;;;;10272:2;10257:18;;;10046:4;10341:169;10355:6;10352:1;10349:13;10341:169;;;10416:13;;10404:26;;10485:15;;;;10450:12;;;;10377:1;10370:9;10341:169;;;-1:-1:-1;10527:3:1;;9904:632;-1:-1:-1;;;;;;9904:632:1:o;10541:260::-;10609:6;10617;10670:2;10658:9;10649:7;10645:23;10641:32;10638:52;;;10686:1;10683;10676:12;10638:52;10709:29;10728:9;10709:29;:::i;:::-;10699:39;;10757:38;10791:2;10780:9;10776:18;10757:38;:::i;:::-;10747:48;;10541:260;;;;;:::o;11059:356::-;11261:2;11243:21;;;11280:18;;;11273:30;11339:34;11334:2;11319:18;;11312:62;11406:2;11391:18;;11059:356::o;11420:380::-;11499:1;11495:12;;;;11542;;;11563:61;;11617:4;11609:6;11605:17;11595:27;;11563:61;11670:2;11662:6;11659:14;11639:18;11636:38;11633:161;;11716:10;11711:3;11707:20;11704:1;11697:31;11751:4;11748:1;11741:15;11779:4;11776:1;11769:15;13045:413;13247:2;13229:21;;;13286:2;13266:18;;;13259:30;13325:34;13320:2;13305:18;;13298:62;-1:-1:-1;;;13391:2:1;13376:18;;13369:47;13448:3;13433:19;;13045:413::o;13463:127::-;13524:10;13519:3;13515:20;13512:1;13505:31;13555:4;13552:1;13545:15;13579:4;13576:1;13569:15;13595:127;13656:10;13651:3;13647:20;13644:1;13637:31;13687:4;13684:1;13677:15;13711:4;13708:1;13701:15;13727:135;13766:3;13787:17;;;13784:43;;13807:18;;:::i;:::-;-1:-1:-1;13854:1:1;13843:13;;13727:135::o;13867:168::-;13907:7;13973:1;13969;13965:6;13961:14;13958:1;13955:21;13950:1;13943:9;13936:17;13932:45;13929:71;;;13980:18;;:::i;:::-;-1:-1:-1;14020:9:1;;13867:168::o;14040:127::-;14101:10;14096:3;14092:20;14089:1;14082:31;14132:4;14129:1;14122:15;14156:4;14153:1;14146:15;14172:120;14212:1;14238;14228:35;;14243:18;;:::i;:::-;-1:-1:-1;14277:9:1;;14172:120::o;15055:112::-;15087:1;15113;15103:35;;15118:18;;:::i;:::-;-1:-1:-1;15152:9:1;;15055:112::o;17918:184::-;17988:6;18041:2;18029:9;18020:7;18016:23;18012:32;18009:52;;;18057:1;18054;18047:12;18009:52;-1:-1:-1;18080:16:1;;17918:184;-1:-1:-1;17918:184:1:o;18107:245::-;18174:6;18227:2;18215:9;18206:7;18202:23;18198:32;18195:52;;;18243:1;18240;18233:12;18195:52;18275:9;18269:16;18294:28;18316:5;18294:28;:::i;20320:340::-;20522:2;20504:21;;;20561:2;20541:18;;;20534:30;-1:-1:-1;;;20595:2:1;20580:18;;20573:46;20651:2;20636:18;;20320:340::o;21017:128::-;21057:3;21088:1;21084:6;21081:1;21078:13;21075:39;;;21094:18;;:::i;:::-;-1:-1:-1;21130:9:1;;21017:128::o;21856:125::-;21896:4;21924:1;21921;21918:8;21915:34;;;21929:18;;:::i;:::-;-1:-1:-1;21966:9:1;;21856:125::o;23180:175::-;23217:3;23261:4;23254:5;23250:16;23290:4;23281:7;23278:17;23275:43;;23298:18;;:::i;:::-;23347:1;23334:15;;23180:175;-1:-1:-1;;23180:175:1:o;26477:414::-;26679:2;26661:21;;;26718:2;26698:18;;;26691:30;26757:34;26752:2;26737:18;;26730:62;-1:-1:-1;;;26823:2:1;26808:18;;26801:48;26881:3;26866:19;;26477:414::o;27314:664::-;27541:3;27579:6;27573:13;27595:53;27641:6;27636:3;27629:4;27621:6;27617:17;27595:53;:::i;:::-;27711:13;;27670:16;;;;27733:57;27711:13;27670:16;27767:4;27755:17;;27733:57;:::i;:::-;27857:13;;27812:20;;;27879:57;27857:13;27812:20;27913:4;27901:17;;27879:57;:::i;:::-;27952:20;;27314:664;-1:-1:-1;;;;;27314:664:1:o;28385:489::-;-1:-1:-1;;;;;28654:15:1;;;28636:34;;28706:15;;28701:2;28686:18;;28679:43;28753:2;28738:18;;28731:34;;;28801:3;28796:2;28781:18;;28774:31;;;28579:4;;28822:46;;28848:19;;28840:6;28822:46;:::i;:::-;28814:54;28385:489;-1:-1:-1;;;;;;28385:489:1:o;28879:249::-;28948:6;29001:2;28989:9;28980:7;28976:23;28972:32;28969:52;;;29017:1;29014;29007:12;28969:52;29049:9;29043:16;29068:30;29092:5;29068:30;:::i;29133:127::-;29194:10;29189:3;29185:20;29182:1;29175:31;29225:4;29222:1;29215:15;29249:4;29246:1;29239:15
Swarm Source
ipfs://54a3911f82385d09b014dc5135a09260d28eaf821ff3e74d2317e25f050ed664
Loading...
Loading
[ 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.