ERC-721
Overview
Max Total Supply
258 SK
Holders
156
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
3 SKLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Samuraikittens
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-19 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. 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; } } function reset(Counter storage counter) internal { counter._value = 0; } } 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); } } 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); } } } } 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); } 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); } 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; } } 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; } 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); } 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); } 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; } } 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) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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 ""; } /** * @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, true); _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, true); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } function _burnSave(address owner, uint256 tokenId) internal virtual { _beforeTokenTransfer(owner, address(0), tokenId, false); // 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, true); // 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, bool isDelete) internal virtual { } } 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, bool isDelete) internal virtual override { super._beforeTokenTransfer(from, to, tokenId, isDelete); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0) && isDelete) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from && isDelete) { _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(); } } pragma solidity ^0.8.0; contract Samuraikittens is ERC721Enumerable, Ownable{ using Counters for Counters.Counter; string private _baseTokenURI; uint private reservePrice = 300 ether; uint public currentPrice; uint public previousPrice; uint private addPriceIncrease = 0.3 ether; uint private max_Kittens = 500; uint256 private max_TokenCountOfAccount = 2; uint private mintTaxRateForDeveloper = 5000; // 50% bool private enableMintTaxForDeveloper = true; address private devAccount; bool private enableDistributeShare = true; struct DistributeShareInfo { address _account; uint256 _share; } DistributeShareInfo[] private _distributeShareInfo; Counters.Counter private _tokenIdTracker; enum Status { Pending, Reserved, Minted } mapping(uint => Status) private _tokenStatus; mapping(uint => uint256) private _tokenPrice; mapping(address => uint) private _tokenCountOfAccount; struct ReservedToken { uint256[] tokenId; uint256[] price; } mapping (address => ReservedToken) private _reservedInfo; uint private currentReservedTokenId = 0; uint256 private reservedPeriod = 33 * 3600; // 24 hours uint256 private mintReservedTokenPeriod = 33 * 3600; // 24 hours uint256 private initialTime; uint256 private initialReservePrice = 449 ether; uint private rateOGShareDistribute = 50; // 0.5% uint private amountOfOGShareDistribute; bool private enableOGSharedistribute = true; mapping (address => bool) private _excludedHolders; address private addressOfPumpkitten; mapping (address => uint256) private _claimedFTM; uint private unlocked = 1; modifier lock() { require(unlocked == 1, 'SamuraiKittens: LOCKED'); unlocked = 0; _; unlocked = 1; } constructor() ERC721 ("SamuraiKittens", "SK") { // _baseTokenURI = "https://gateway.pinata.cloud/ipfs/QmXMvgmj9aNxymSvbB3m9CKkjFUTqS5t2H7FUVobpe2E64/"; // addressOfPumpkitten = 0x31EC182dfBc6B6B19D68419C0500067Ce000318d; _baseTokenURI = "https://gateway.pinata.cloud/ipfs/QmYsWPzR6uxJkfzeqAdwAr5EASacJCXaUviZcAFdnbAWWm/"; addressOfPumpkitten = 0xF185cf59c710a0E83362fb7B8813b633Ba073600; currentPrice = reservePrice; devAccount = _msgSender(); initialTime = block.timestamp; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function buyKittens() payable public lock { require(_tokenIdTracker.current() <= max_Kittens, "Too Many Tokens"); require(_tokenCountOfAccount[_msgSender()] < max_TokenCountOfAccount, "Too Many Tokens For a Account"); require(!((block.timestamp - initialTime) < mintReservedTokenPeriod && !isReservedAddress(_msgSender())), "Not right to mint now"); if ((block.timestamp - initialTime) <= mintReservedTokenPeriod) { for (uint i=0; i<max_TokenCountOfAccount; i++) { if (_tokenStatus[_reservedInfo[_msgSender()].tokenId[i]] == Status.Minted) continue; _tokenIdTracker.increment(); require(msg.value == _reservedInfo[_msgSender()].price[i]); _mint(_msgSender(), _reservedInfo[_msgSender()].tokenId[i]); _tokenCountOfAccount[_msgSender()] ++; _tokenStatus[_reservedInfo[_msgSender()].tokenId[i]] = Status.Minted; _tokenPrice[_reservedInfo[_msgSender()].tokenId[i]] = _reservedInfo[_msgSender()].price[i]; previousPrice = _reservedInfo[_msgSender()].price[i]; _reservedInfo[_msgSender()].price[i] = 0; break; } } else{ uint256 tokenId = 0; if (initialReservePrice > 0) { currentPrice = initialReservePrice; initialReservePrice = 0; } if (_tokenIdTracker.current() < currentReservedTokenId) { uint i; for (i=1; i<currentReservedTokenId + 1; i++) { if (_tokenStatus[i] != Status.Minted) { tokenId = i; break; } } _tokenIdTracker.increment(); } else{ _tokenIdTracker.increment(); tokenId = _tokenIdTracker.current(); } require(msg.value == currentPrice); _mint(_msgSender(), tokenId); _tokenStatus[tokenId] = Status.Minted; _tokenPrice[tokenId] = currentPrice; _tokenCountOfAccount[_msgSender()] ++; previousPrice = currentPrice; // currentPrice = previousPrice + addPriceIncrease; } uint256 mintTaxAmount; if (mintTaxRateForDeveloper > 0 && enableMintTaxForDeveloper && devAccount != address(0)) { mintTaxAmount = previousPrice * mintTaxRateForDeveloper / (10000); require(payable(devAccount).send(mintTaxAmount)); } if (enableOGSharedistribute) { uint length = ERC721Enumerable(addressOfPumpkitten).totalSupply(); amountOfOGShareDistribute += previousPrice * rateOGShareDistribute * length / (10000); } if (enableDistributeShare) { uint nlength = _distributeShareInfo.length; address account; uint amount; for(uint i=0; i<nlength; i++) { account = _distributeShareInfo[i]._account; amount = previousPrice * _distributeShareInfo[i]._share / (10000); require(amount < address(this).balance, "Balance is insufficient"); payable(account).transfer(amount); } } } function pendingFTM() public view returns (uint256){ if (_excludedHolders[msg.sender] == true ) return 0; uint balance = ERC721Enumerable(addressOfPumpkitten).balanceOf(msg.sender); if (balance == 0) return 0; uint length = ERC721Enumerable(addressOfPumpkitten).totalSupply(); uint256 amountOfHolder = amountOfOGShareDistribute * balance / length - _claimedFTM[msg.sender]; return amountOfHolder; } function claimFTM() external lock { require(_excludedHolders[msg.sender] == false, 'You are excluded.'); uint balance = ERC721Enumerable(addressOfPumpkitten).balanceOf(msg.sender); require(balance > 0, 'You are not a holder of OG Pumpkittens.'); uint length = ERC721Enumerable(addressOfPumpkitten).totalSupply(); uint256 amountOfHolder = amountOfOGShareDistribute * balance / length - _claimedFTM[msg.sender]; require(amountOfHolder > 0, "Balance is not zero"); require(amountOfHolder < address(this).balance, "Insufficient balance."); require(payable(msg.sender).send(amountOfHolder)); _claimedFTM[msg.sender] += amountOfHolder; } function setOGShareDistribute(bool enable) public onlyOwner { enableOGSharedistribute = enable; } function setExcludedListOGShareDistribute(address account) public onlyOwner { _excludedHolders[account] = true; } function setExcludedListOGShareDistribute(uint tokenIdofPumpkitten) public onlyOwner { address account = ERC721Enumerable(addressOfPumpkitten).ownerOf(tokenIdofPumpkitten); _excludedHolders[account] = true; } function addReserveToken(address account) public onlyOwner { require((block.timestamp - initialTime) < reservedPeriod, "End time"); require(_reservedInfo[account].tokenId.length < max_TokenCountOfAccount, "Too Many Tokens"); require(currentReservedTokenId <= max_Kittens - max_TokenCountOfAccount, "Too Many Tokens"); uint length = _reservedInfo[account].tokenId.length; for (uint i=length; i<max_TokenCountOfAccount; i++) { _reservedInfo[account].price.push(currentPrice); currentReservedTokenId++; _reservedInfo[account].tokenId.push(currentReservedTokenId); _tokenStatus[currentReservedTokenId] = Status.Reserved; previousPrice = currentPrice; currentPrice = previousPrice + addPriceIncrease; } } function deleteReserveToken(address account) public onlyOwner { uint length = _reservedInfo[account].tokenId.length; for (uint i=0; i<length; i++) { _reservedInfo[account].tokenId[i] = 0; _reservedInfo[account].price[i] = 0; _tokenStatus[ _reservedInfo[account].tokenId[i]] = Status.Pending; } } function getReservedTokenPrice(address account) public view returns (uint256) { uint length = _reservedInfo[account].price.length; if (length == 0) return 0; uint price; for (uint i=0; i<length; i++) { price = _reservedInfo[account].price[i]; if (price > 0) break; } return price; } function getReservedTokenInfo(address account) public view returns (ReservedToken memory) { return _reservedInfo[account]; } function isReservedAddress(address account) public view returns (bool) { if (_reservedInfo[account].tokenId.length > 0) return true; return false; } function isReservePeriod() public view returns (bool) { if (block.timestamp - initialTime > mintReservedTokenPeriod) return false; return true; } function setInitialReservePrice(uint256 _price) public onlyOwner { require(_price > 0, "Price is wrong"); initialReservePrice = _price; } function setPrice(uint _price) public onlyOwner { currentPrice = _price; } function getPrice() public view returns(uint) { if (_tokenIdTracker.current() == max_Kittens) return 0; if (_tokenIdTracker.current() <= currentReservedTokenId && (block.timestamp - initialTime) > mintReservedTokenPeriod) { if (initialReservePrice > 0) return initialReservePrice; } return currentPrice; } function setAddPriceIncrease(uint _increase) public onlyOwner { addPriceIncrease = _increase; } function getAddPriceIncrease() public view returns(uint) { return addPriceIncrease; } function withdrawAll() public payable onlyOwner { require(address(this).balance > 0, "No balance of FTM."); require(payable(msg.sender).send(address(this).balance)); } function getTokenCount() public view returns(uint) { return _tokenCountOfAccount[address(msg.sender)]; } function setMaxKittens(uint amount) public onlyOwner { max_Kittens = amount; } function setMaxTokenCountOfAccount(uint amount) public onlyOwner { max_TokenCountOfAccount = amount; } function getTokenIdsOfOwner(address account) public view returns(uint[] memory tokenIds, uint256[] memory priceOfTokenIds, string[] memory tokenURIs) { uint balance = balanceOf(account); tokenIds = new uint[](balance); priceOfTokenIds = new uint[](balance); tokenURIs = new string[](balance); for (uint i=0; i<balance; i++) { tokenIds[i] = tokenOfOwnerByIndex(account, i); priceOfTokenIds[i] = _tokenPrice[tokenIds[i]]; tokenURIs[i] = tokenURI(tokenIds[i]); } } function setDeveloperAddress(address _devAccount) public onlyOwner { require(_devAccount != address(0), "Cannot be zero address"); devAccount = _devAccount; } function setDistributeShare(bool enable) public onlyOwner { enableDistributeShare = enable; } function addListForDistributeShare(address _account, uint _share) public onlyOwner { require(_account != address(0), "Address is wrong."); DistributeShareInfo memory info; info._account = _account; info._share = _share; uint nlength = _distributeShareInfo.length; address account; for(uint i=0; i<nlength; i++) { account = _distributeShareInfo[i]._account; if (account == _account) { _distributeShareInfo[i]._share = _share; return; } } _distributeShareInfo.push(info); } function setMintTaxRateForDeveloper(uint _mintTaxRate) public onlyOwner { require(_mintTaxRate > 0, "Cannot be zero value"); mintTaxRateForDeveloper = _mintTaxRate; } function setEnableMintTax(bool _enableMintTax) public onlyOwner { enableMintTaxForDeveloper = _enableMintTax; } function setReservePeriod(uint _period) public onlyOwner { reservedPeriod = _period; } function setMintReservedTokenPeriod(uint _period) public onlyOwner { mintReservedTokenPeriod = _period; } function destroySmartContract(address payable _to) public onlyOwner{ selfdestruct(_to); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_share","type":"uint256"}],"name":"addListForDistributeShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addReserveToken","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":"buyKittens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimFTM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"deleteReserveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"destroySmartContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAddPriceIncrease","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReservedTokenInfo","outputs":[{"components":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"}],"internalType":"struct Samuraikittens.ReservedToken","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReservedTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTokenIdsOfOwner","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"priceOfTokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"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":"isReservePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReservedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingFTM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"_increase","type":"uint256"}],"name":"setAddPriceIncrease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAccount","type":"address"}],"name":"setDeveloperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setDistributeShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableMintTax","type":"bool"}],"name":"setEnableMintTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdofPumpkitten","type":"uint256"}],"name":"setExcludedListOGShareDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludedListOGShareDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setInitialReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxKittens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTokenCountOfAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setMintReservedTokenPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintTaxRate","type":"uint256"}],"name":"setMintTaxRateForDeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setOGShareDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setReservePeriod","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":"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052681043561a8829300000600c55670429d069189e0000600f556101f460105560026011556113886012556013805460ff60ff60a81b01191675010000000000000000000000000000000000000000011790556000601a556201d010601b819055601c5568185720711896640000601e556032601f556021805460ff191660019081179091556025553480156200009957600080fd5b50604080518082018252600e81526d53616d757261694b697474656e7360901b602080830191825283518085019094526002845261534b60f01b908401528151919291620000ea91600091620001fd565b50805162000100906001906020840190620001fd565b505050600062000115620001f960201b60201c565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060405180608001604052806051815260200162003e9c6051913980516200019391600b91602090910190620001fd565b50602380546001600160a01b03191673f185cf59c710a0e83362fb7b8813b633ba073600179055600c54600d55620001c83390565b601380546001600160a01b039290921661010002610100600160a81b031990921691909117905542601d55620002e0565b3390565b8280546200020b90620002a3565b90600052602060002090601f0160209004810192826200022f57600085556200027a565b82601f106200024a57805160ff19168380011785556200027a565b828001600101855582156200027a579182015b828111156200027a5782518255916020019190600101906200025d565b50620002889291506200028c565b5090565b5b808211156200028857600081556001016200028d565b600181811c90821680620002b857607f821691505b60208210811415620002da57634e487b7160e01b600052602260045260246000fd5b50919050565b613bac80620002f06000396000f3fe6080604052600436106102e45760003560e01c8063853828b611610190578063b88d4fde116100dc578063d218764b11610095578063e3ab7a291161006f578063e3ab7a2914610884578063e985e9c5146108a4578063ef0af1ac146108ed578063f2fde38b1461090d57600080fd5b8063d218764b14610824578063dcc345f214610844578063e2008f8c1461086457600080fd5b8063b88d4fde1461076f578063c6bf240a1461078f578063c87b56dd146107af578063ca9be0f2146107cf578063cb0e7207146107ef578063ceab30341461080457600080fd5b806395d89b41116101495780639d1b464a116101235780639d1b464a146106f9578063a22cb4651461070f578063ac0eafb61461072f578063b619d0431461074f57600080fd5b806395d89b41146106af57806395f26eec146106c457806398d5fdca146106e457600080fd5b8063853828b6146106135780638762dad91461061b5780638da5cb5b1461063b5780638dd0526614610659578063914e245a1461067957806391b7f5ed1461068f57600080fd5b806342842e0e1161024f57806372e8e5e3116102085780637b924464116101e25780637b924464146105b65780637c2920a7146105d65780637e406bab146105eb57806383f617401461060b57600080fd5b806372e8e5e31461055257806378a895671461057f5780637a991cfd146105a157600080fd5b806342842e0e1461049d5780634f6ccce7146104bd5780636352211e146104dd5780636caf7d61146104fd57806370a082311461051d578063715018a61461053d57600080fd5b80630dac4f3b116102a15780630dac4f3b146103e957806318160ddd1461040957806323b872dd146104285780632f745c591461044857806339df43ff146104685780633b6a4f501461048857600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc146103405780630884dab11461037857806308a5d0ad1461039a578063095ea7b3146103c9575b600080fd5b3480156102f557600080fd5b506103096103043660046136b0565b61092d565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610958565b6040516103159190613876565b34801561034c57600080fd5b5061036061035b3660046136ea565b6109ea565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610398610393366004613695565b610a84565b005b3480156103a657600080fd5b506103ba6103b53660046134a0565b610acc565b604051610315939291906137ef565b3480156103d557600080fd5b506103986103e4366004613669565b610c90565b3480156103f557600080fd5b50610398610404366004613695565b610da6565b34801561041557600080fd5b506008545b604051908152602001610315565b34801561043457600080fd5b50610398610443366004613513565b610de3565b34801561045457600080fd5b5061041a610463366004613669565b610e14565b34801561047457600080fd5b506103986104833660046134a0565b610eaa565b34801561049457600080fd5b50600f5461041a565b3480156104a957600080fd5b506103986104b8366004613513565b610ee0565b3480156104c957600080fd5b5061041a6104d83660046136ea565b610efb565b3480156104e957600080fd5b506103606104f83660046136ea565b610f8e565b34801561050957600080fd5b506103986105183660046134a0565b611005565b34801561052957600080fd5b5061041a6105383660046134a0565b611140565b34801561054957600080fd5b506103986111c7565b34801561055e57600080fd5b5061057261056d3660046134a0565b61123b565b604051610315919061398a565b34801561058b57600080fd5b503360009081526018602052604090205461041a565b3480156105ad57600080fd5b5061041a61131a565b3480156105c257600080fd5b506103986105d13660046136ea565b611487565b3480156105e257600080fd5b506103096114b6565b3480156105f757600080fd5b506103986106063660046136ea565b6114db565b61039861150a565b610398611c98565b34801561062757600080fd5b506103986106363660046134a0565b611d2d565b34801561064757600080fd5b50600a546001600160a01b0316610360565b34801561066557600080fd5b506103986106743660046136ea565b611ee0565b34801561068557600080fd5b5061041a600e5481565b34801561069b57600080fd5b506103986106aa3660046136ea565b611fad565b3480156106bb57600080fd5b50610333611fdc565b3480156106d057600080fd5b5061041a6106df3660046134a0565b611feb565b3480156106f057600080fd5b5061041a612083565b34801561070557600080fd5b5061041a600d5481565b34801561071b57600080fd5b5061039861072a366004613634565b6120d9565b34801561073b57600080fd5b5061039861074a366004613695565b61219e565b34801561075b57600080fd5b5061039861076a3660046136ea565b6121db565b34801561077b57600080fd5b5061039861078a366004613554565b61220a565b34801561079b57600080fd5b506103986107aa3660046136ea565b612242565b3480156107bb57600080fd5b506103336107ca3660046136ea565b6122b8565b3480156107db57600080fd5b506103986107ea3660046136ea565b612393565b3480156107fb57600080fd5b506103986123c2565b34801561081057600080fd5b5061039861081f3660046136ea565b6126dc565b34801561083057600080fd5b5061039861083f3660046134a0565b61274c565b34801561085057600080fd5b5061039861085f3660046134a0565b61279a565b34801561087057600080fd5b5061039861087f3660046136ea565b61283b565b34801561089057600080fd5b5061030961089f3660046134a0565b61286a565b3480156108b057600080fd5b506103096108bf3660046134da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f957600080fd5b50610398610908366004613669565b612898565b34801561091957600080fd5b506103986109283660046134a0565b612a42565b60006001600160e01b0319821663780e9d6360e01b1480610952575061095282612b2d565b92915050565b60606000805461096790613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461099390613a5a565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a685760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600a546001600160a01b03163314610aae5760405162461bcd60e51b8152600401610a5f90613904565b60138054911515600160a81b0260ff60a81b19909216919091179055565b60608060606000610adc85611140565b90508067ffffffffffffffff811115610af757610af7613b32565b604051908082528060200260200182016040528015610b20578160200160208202803683370190505b5093508067ffffffffffffffff811115610b3c57610b3c613b32565b604051908082528060200260200182016040528015610b65578160200160208202803683370190505b5092508067ffffffffffffffff811115610b8157610b81613b32565b604051908082528060200260200182016040528015610bb457816020015b6060815260200190600190039081610b9f5790505b50915060005b81811015610c8757610bcc8682610e14565b858281518110610bde57610bde613b1c565b60200260200101818152505060176000868381518110610c0057610c00613b1c565b6020026020010151815260200190815260200160002054848281518110610c2957610c29613b1c565b602002602001018181525050610c57858281518110610c4a57610c4a613b1c565b60200260200101516122b8565b838281518110610c6957610c69613b1c565b60200260200101819052508080610c7f90613a95565b915050610bba565b50509193909250565b6000610c9b82610f8e565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5f565b336001600160a01b0382161480610d255750610d2581336108bf565b610d975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5f565b610da18383612b7d565b505050565b600a546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610a5f90613904565b6013805460ff1916911515919091179055565b610ded3382612beb565b610e095760405162461bcd60e51b8152600401610a5f90613939565b610da1838383612cde565b6000610e1f83611140565b8210610e815760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610a5f90613904565b806001600160a01b0316ff5b610da18383836040518060200160405280600081525061220a565b6000610f0660085490565b8210610f695760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5f565b60088281548110610f7c57610f7c613b1c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5f565b600a546001600160a01b0316331461102f5760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b038116600090815260196020526040812054905b81811015610da1576001600160a01b038316600090815260196020526040812080548390811061107c5761107c613b1c565b60009182526020808320909101929092556001600160a01b03851681526019909152604081206001018054839081106110b7576110b7613b1c565b60009182526020808320909101929092556001600160a01b038516815260199091526040812080546016918391859081106110f4576110f4613b1c565b600091825260208083209091015483528201929092526040019020805460ff1916600183600281111561112957611129613af0565b02179055508061113881613a95565b91505061104a565b60006001600160a01b0382166111ab5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111f15760405162461bcd60e51b8152600401610a5f90613904565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b604080518082018252606080825260208083018290526001600160a01b038516600090815260198252849020845181549283028101840186529485018281529394939092849284918401828280156112b257602002820191906000526020600020905b81548152602001906001019080831161129e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561130a57602002820191906000526020600020905b8154815260200190600101908083116112f6575b5050505050815250509050919050565b3360009081526022602052604081205460ff1615156001141561133d5750600090565b6023546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561138157600080fd5b505afa158015611395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b99190613703565b9050806113c857600091505090565b602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561140d57600080fd5b505afa158015611421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114459190613703565b33600090815260246020908152604082205490549293509091839061146b9086906139f8565b61147591906139e4565b61147f9190613a17565b949350505050565b600a546001600160a01b031633146114b15760405162461bcd60e51b8152600401610a5f90613904565b601c55565b6000601c54601d54426114c99190613a17565b11156114d55750600090565b50600190565b600a546001600160a01b031633146115055760405162461bcd60e51b8152600401610a5f90613904565b601b55565b6025546001146115555760405162461bcd60e51b815260206004820152601660248201527514d85b5d5c985a52da5d1d195b9cce881313d0d2d15160521b6044820152606401610a5f565b6000602555601054601554111561157e5760405162461bcd60e51b8152600401610a5f90613889565b60115433600090815260186020526040902054106115de5760405162461bcd60e51b815260206004820152601d60248201527f546f6f204d616e7920546f6b656e7320466f722061204163636f756e740000006044820152606401610a5f565b601c54601d546115ee9042613a17565b10801561160157506115ff3361286a565b155b156116465760405162461bcd60e51b81526020600482015260156024820152744e6f7420726967687420746f206d696e74206e6f7760581b6044820152606401610a5f565b601c54601d546116569042613a17565b116119015760005b6011548110156118fb57336000908152601960205260408120805460029260169290918590811061169157611691613b1c565b6000918252602080832090910154835282019290925260400190205460ff1660028111156116c1576116c1613af0565b14156116cc576118e9565b6116da601580546001019055565b3360009081526019602052604090206001018054829081106116fe576116fe613b1c565b9060005260206000200154341461171457600080fd5b336000818152601960205260409020805461174b9291908490811061173b5761173b613b1c565b9060005260206000200154612e8b565b33600090815260186020526040812080549161176683613a95565b91905055506002601660006019600061177c3390565b6001600160a01b0316815260208101919091526040016000208054859081106117a7576117a7613b1c565b600091825260208083209091015483528201929092526040019020805460ff191660018360028111156117dc576117dc613af0565b021790555033600090815260196020526040902060010180548290811061180557611805613b1c565b9060005260206000200154601760006019600061181f3390565b6001600160a01b03168152602081019190915260400160002080548590811061184a5761184a613b1c565b9060005260206000200154815260200190815260200160002081905550601960006118723390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060010181815481106118a6576118a6613b1c565b600091825260208083209190910154600e5533825260199052604081206001018054839081106118d8576118d8613b1c565b6000918252602090912001556118fb565b806118f381613a95565b91505061165e565b50611a09565b601e546000901561191857601e8054600d55600090555b601a5460155410156119945760015b601a546119359060016139cc565b81101561198057600260008281526016602052604090205460ff16600281111561196157611961613af0565b1461196e57809150611980565b8061197881613a95565b915050611927565b61198e601580546001019055565b506119a7565b6119a2601580546001019055565b506015545b600d5434146119b557600080fd5b6119bf3382612e8b565b6000818152601660209081526040808320805460ff19166002179055600d546017835281842055338352601890915281208054916119fc83613a95565b9091555050600d54600e55505b600080601254118015611a1e575060135460ff165b8015611a39575060135461010090046001600160a01b031615155b15611a9357612710601254600e54611a5191906139f8565b611a5b91906139e4565b60135460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050611a9357600080fd5b60215460ff1615611b5d57602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611ae357600080fd5b505afa158015611af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613703565b905061271081601f54600e54611b3191906139f8565b611b3b91906139f8565b611b4591906139e4565b60206000828254611b5691906139cc565b9091555050505b601354600160a81b900460ff1615611c9057601454600080805b83811015611c8b5760148181548110611b9257611b92613b1c565b6000918252602090912060029091020154601480546001600160a01b0390921694506127109183908110611bc857611bc8613b1c565b906000526020600020906002020160010154600e54611be791906139f8565b611bf191906139e4565b9150478210611c425760405162461bcd60e51b815260206004820152601760248201527f42616c616e636520697320696e73756666696369656e740000000000000000006044820152606401610a5f565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611c78573d6000803e3d6000fd5b5080611c8381613a95565b915050611b77565b505050505b506001602555565b600a546001600160a01b03163314611cc25760405162461bcd60e51b8152600401610a5f90613904565b60004711611d075760405162461bcd60e51b81526020600482015260126024820152712737903130b630b731b29037b310232a269760711b6044820152606401610a5f565b60405133904780156108fc02916000818181858888f19350505050611d2b57600080fd5b565b600a546001600160a01b03163314611d575760405162461bcd60e51b8152600401610a5f90613904565b601b54601d54611d679042613a17565b10611d9f5760405162461bcd60e51b8152602060048201526008602482015267456e642074696d6560c01b6044820152606401610a5f565b6011546001600160a01b03821660009081526019602052604090205410611dd85760405162461bcd60e51b8152600401610a5f90613889565b601154601054611de89190613a17565b601a541115611e095760405162461bcd60e51b8152600401610a5f90613889565b6001600160a01b038116600090815260196020526040902054805b601154811015610da1576001600160a01b03831660009081526019602090815260408220600d5460019182018054928301815584529183200155601a805491611e6c83613a95565b90915550506001600160a01b0383166000908152601960209081526040808320601a805482546001808201855593875285872001555484526016909252909120805460ff19169091179055600d54600e819055600f54611ecb916139cc565b600d5580611ed881613a95565b915050611e24565b600a546001600160a01b03163314611f0a5760405162461bcd60e51b8152600401610a5f90613904565b6023546040516331a9108f60e11b8152600481018390526000916001600160a01b031690636352211e9060240160206040518083038186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8791906134bd565b6001600160a01b03166000908152602260205260409020805460ff191660011790555050565b600a546001600160a01b03163314611fd75760405162461bcd60e51b8152600401610a5f90613904565b600d55565b60606001805461096790613a5a565b6001600160a01b038116600090815260196020526040812060010154806120155750600092915050565b6000805b8281101561207b576001600160a01b038516600090815260196020526040902060010180548290811061204e5761204e613b1c565b9060005260206000200154915060008211156120695761207b565b8061207381613a95565b915050612019565b509392505050565b600060105461209160155490565b141561209d5750600090565b601a54601554111580156120be5750601c54601d546120bc9042613a17565b115b156120d257601e54156120d25750601e5490565b50600d5490565b6001600160a01b0382163314156121325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146121c85760405162461bcd60e51b8152600401610a5f90613904565b6021805460ff1916911515919091179055565b600a546001600160a01b031633146122055760405162461bcd60e51b8152600401610a5f90613904565b601155565b6122143383612beb565b6122305760405162461bcd60e51b8152600401610a5f90613939565b61223c84848484612fdb565b50505050565b600a546001600160a01b0316331461226c5760405162461bcd60e51b8152600401610a5f90613904565b600081116122b35760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206265207a65726f2076616c756560601b6044820152606401610a5f565b601255565b6000818152600260205260409020546060906001600160a01b03166123375760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5f565b600061234161300e565b90506000815111612361576040518060200160405280600081525061238c565b8061236b8461301d565b60405160200161237c929190613783565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123bd5760405162461bcd60e51b8152600401610a5f90613904565b601055565b60255460011461240d5760405162461bcd60e51b815260206004820152601660248201527514d85b5d5c985a52da5d1d195b9cce881313d0d2d15160521b6044820152606401610a5f565b600060258190553381526022602052604090205460ff16156124655760405162461bcd60e51b81526020600482015260116024820152702cb7ba9030b9329032bc31b63ab232b21760791b6044820152606401610a5f565b6023546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156124a957600080fd5b505afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e19190613703565b9050600081116125435760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f74206120686f6c646572206f66204f472050756d706b60448201526634ba3a32b7399760c91b6064820152608401610a5f565b602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561258857600080fd5b505afa15801561259c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c09190613703565b3360009081526024602090815260408220549054929350909183906125e69086906139f8565b6125f091906139e4565b6125fa9190613a17565b9050600081116126425760405162461bcd60e51b815260206004820152601360248201527242616c616e6365206973206e6f74207a65726f60681b6044820152606401610a5f565b4781106126895760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b6044820152606401610a5f565b604051339082156108fc029083906000818181858888f193505050506126ae57600080fd5b33600090815260246020526040812080548392906126cd9084906139cc565b90915550506001602555505050565b600a546001600160a01b031633146127065760405162461bcd60e51b8152600401610a5f90613904565b600081116127475760405162461bcd60e51b815260206004820152600e60248201526d50726963652069732077726f6e6760901b6044820152606401610a5f565b601e55565b600a546001600160a01b031633146127765760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b03166000908152602260205260409020805460ff19166001179055565b600a546001600160a01b031633146127c45760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b0381166128135760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a5f565b601380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a546001600160a01b031633146128655760405162461bcd60e51b8152600401610a5f90613904565b600f55565b6001600160a01b0381166000908152601960205260408120541561289057506001919050565b506000919050565b600a546001600160a01b031633146128c25760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b03821661290c5760405162461bcd60e51b815260206004820152601160248201527020b2323932b9b99034b9903bb937b7339760791b6044820152606401610a5f565b604080518082019091526001600160a01b0383168152602081018290526014546000805b828110156129b5576014818154811061294b5761294b613b1c565b60009182526020909120600290910201546001600160a01b03908116925086168214156129a357846014828154811061298657612986613b1c565b906000526020600020906002020160010181905550505050505050565b806129ad81613a95565b915050612930565b50506014805460018101825560009190915282517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec600290920291820180546001600160a01b0319166001600160a01b039092169190911790556020909201517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ed90920191909155505050565b600a546001600160a01b03163314612a6c5760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b038116612ad15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5f565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480612b5e57506001600160e01b03198216635b5e139f60e01b145b8061095257506301ffc9a760e01b6001600160e01b0319831614610952565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612bb282610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612c645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5f565b6000612c6f83610f8e565b9050806001600160a01b0316846001600160a01b03161480612caa5750836001600160a01b0316612c9f846109ea565b6001600160a01b0316145b8061147f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661147f565b826001600160a01b0316612cf182610f8e565b6001600160a01b031614612d595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a5f565b6001600160a01b038216612dbb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5f565b612dc8838383600161311b565b612dd3600082612b7d565b6001600160a01b0383166000908152600360205260408120805460019290612dfc908490613a17565b90915550506001600160a01b0382166000908152600360205260408120805460019290612e2a9084906139cc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612ee15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5f565b6000818152600260205260409020546001600160a01b031615612f465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5f565b612f5460008383600161311b565b6001600160a01b0382166000908152600360205260408120805460019290612f7d9084906139cc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612fe6848484612cde565b612ff2848484846131ee565b61223c5760405162461bcd60e51b8152600401610a5f906138b2565b6060600b805461096790613a5a565b6060816130415750506040805180820190915260018152600360fc1b602082015290565b8160005b811561306b578061305581613a95565b91506130649050600a836139e4565b9150613045565b60008167ffffffffffffffff81111561308657613086613b32565b6040519080825280601f01601f1916602001820160405280156130b0576020820181803683370190505b5090505b841561147f576130c5600183613a17565b91506130d2600a86613ab0565b6130dd9060306139cc565b60f81b8183815181106130f2576130f2613b1c565b60200101906001600160f81b031916908160001a905350613114600a866139e4565b94506130b4565b6001600160a01b0384166131765761317182600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613199565b826001600160a01b0316846001600160a01b0316146131995761319984836132fb565b6001600160a01b0383161580156131ad5750805b156131c0576131bb82613398565b61223c565b836001600160a01b0316836001600160a01b0316141580156131df5750805b1561223c5761223c8383613447565b60006001600160a01b0384163b156132f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132329033908990889088906004016137b2565b602060405180830381600087803b15801561324c57600080fd5b505af192505050801561327c575060408051601f3d908101601f19168201909252613279918101906136cd565b60015b6132d6573d8080156132aa576040519150601f19603f3d011682016040523d82523d6000602084013e6132af565b606091505b5080516132ce5760405162461bcd60e51b8152600401610a5f906138b2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147f565b506001949350505050565b6000600161330884611140565b6133129190613a17565b600083815260076020526040902054909150808214613365576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133aa90600190613a17565b600083815260096020526040812054600880549394509092849081106133d2576133d2613b1c565b9060005260206000200154905080600883815481106133f3576133f3613b1c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061342b5761342b613b06565b6001900381819060005260206000200160009055905550505050565b600061345283611140565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8035801515811461349b57600080fd5b919050565b6000602082840312156134b257600080fd5b813561238c81613b48565b6000602082840312156134cf57600080fd5b815161238c81613b48565b600080604083850312156134ed57600080fd5b82356134f881613b48565b9150602083013561350881613b48565b809150509250929050565b60008060006060848603121561352857600080fd5b833561353381613b48565b9250602084013561354381613b48565b929592945050506040919091013590565b6000806000806080858703121561356a57600080fd5b843561357581613b48565b9350602085013561358581613b48565b925060408501359150606085013567ffffffffffffffff808211156135a957600080fd5b818701915087601f8301126135bd57600080fd5b8135818111156135cf576135cf613b32565b604051601f8201601f19908116603f011681019083821181831017156135f7576135f7613b32565b816040528281528a602084870101111561361057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561364757600080fd5b823561365281613b48565b91506136606020840161348b565b90509250929050565b6000806040838503121561367c57600080fd5b823561368781613b48565b946020939093013593505050565b6000602082840312156136a757600080fd5b61238c8261348b565b6000602082840312156136c257600080fd5b813561238c81613b60565b6000602082840312156136df57600080fd5b815161238c81613b60565b6000602082840312156136fc57600080fd5b5035919050565b60006020828403121561371557600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561374c57815187529582019590820190600101613730565b509495945050505050565b6000815180845261376f816020860160208601613a2e565b601f01601f19169290920160200192915050565b60008351613795818460208801613a2e565b8351908301906137a9818360208801613a2e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137e590830184613757565b9695505050505050565b606081526000613802606083018661371c565b602083820381850152613815828761371c565b915083820360408501528185518084528284019150828160051b85010183880160005b8381101561386657601f19878403018552613854838351613757565b94860194925090850190600101613838565b50909a9950505050505050505050565b60208152600061238c6020830184613757565b6020808252600f908201526e546f6f204d616e7920546f6b656e7360881b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251604060208401526139a6606084018261371c565b90506020840151601f198483030160408501526139c3828261371c565b95945050505050565b600082198211156139df576139df613ac4565b500190565b6000826139f3576139f3613ada565b500490565b6000816000190483118215151615613a1257613a12613ac4565b500290565b600082821015613a2957613a29613ac4565b500390565b60005b83811015613a49578181015183820152602001613a31565b8381111561223c5750506000910152565b600181811c90821680613a6e57607f821691505b60208210811415613a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613aa957613aa9613ac4565b5060010190565b600082613abf57613abf613ada565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b5d57600080fd5b50565b6001600160e01b031981168114613b5d57600080fdfea26469706673582212203c207012999a8152c44b7e5222920d45f9574384dd110cc82711841f3111f4d764736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d597357507a523675784a6b667a657141647741723545415361634a4358615576695a634146646e624157576d2f
Deployed Bytecode
0x6080604052600436106102e45760003560e01c8063853828b611610190578063b88d4fde116100dc578063d218764b11610095578063e3ab7a291161006f578063e3ab7a2914610884578063e985e9c5146108a4578063ef0af1ac146108ed578063f2fde38b1461090d57600080fd5b8063d218764b14610824578063dcc345f214610844578063e2008f8c1461086457600080fd5b8063b88d4fde1461076f578063c6bf240a1461078f578063c87b56dd146107af578063ca9be0f2146107cf578063cb0e7207146107ef578063ceab30341461080457600080fd5b806395d89b41116101495780639d1b464a116101235780639d1b464a146106f9578063a22cb4651461070f578063ac0eafb61461072f578063b619d0431461074f57600080fd5b806395d89b41146106af57806395f26eec146106c457806398d5fdca146106e457600080fd5b8063853828b6146106135780638762dad91461061b5780638da5cb5b1461063b5780638dd0526614610659578063914e245a1461067957806391b7f5ed1461068f57600080fd5b806342842e0e1161024f57806372e8e5e3116102085780637b924464116101e25780637b924464146105b65780637c2920a7146105d65780637e406bab146105eb57806383f617401461060b57600080fd5b806372e8e5e31461055257806378a895671461057f5780637a991cfd146105a157600080fd5b806342842e0e1461049d5780634f6ccce7146104bd5780636352211e146104dd5780636caf7d61146104fd57806370a082311461051d578063715018a61461053d57600080fd5b80630dac4f3b116102a15780630dac4f3b146103e957806318160ddd1461040957806323b872dd146104285780632f745c591461044857806339df43ff146104685780633b6a4f501461048857600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc146103405780630884dab11461037857806308a5d0ad1461039a578063095ea7b3146103c9575b600080fd5b3480156102f557600080fd5b506103096103043660046136b0565b61092d565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610958565b6040516103159190613876565b34801561034c57600080fd5b5061036061035b3660046136ea565b6109ea565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610398610393366004613695565b610a84565b005b3480156103a657600080fd5b506103ba6103b53660046134a0565b610acc565b604051610315939291906137ef565b3480156103d557600080fd5b506103986103e4366004613669565b610c90565b3480156103f557600080fd5b50610398610404366004613695565b610da6565b34801561041557600080fd5b506008545b604051908152602001610315565b34801561043457600080fd5b50610398610443366004613513565b610de3565b34801561045457600080fd5b5061041a610463366004613669565b610e14565b34801561047457600080fd5b506103986104833660046134a0565b610eaa565b34801561049457600080fd5b50600f5461041a565b3480156104a957600080fd5b506103986104b8366004613513565b610ee0565b3480156104c957600080fd5b5061041a6104d83660046136ea565b610efb565b3480156104e957600080fd5b506103606104f83660046136ea565b610f8e565b34801561050957600080fd5b506103986105183660046134a0565b611005565b34801561052957600080fd5b5061041a6105383660046134a0565b611140565b34801561054957600080fd5b506103986111c7565b34801561055e57600080fd5b5061057261056d3660046134a0565b61123b565b604051610315919061398a565b34801561058b57600080fd5b503360009081526018602052604090205461041a565b3480156105ad57600080fd5b5061041a61131a565b3480156105c257600080fd5b506103986105d13660046136ea565b611487565b3480156105e257600080fd5b506103096114b6565b3480156105f757600080fd5b506103986106063660046136ea565b6114db565b61039861150a565b610398611c98565b34801561062757600080fd5b506103986106363660046134a0565b611d2d565b34801561064757600080fd5b50600a546001600160a01b0316610360565b34801561066557600080fd5b506103986106743660046136ea565b611ee0565b34801561068557600080fd5b5061041a600e5481565b34801561069b57600080fd5b506103986106aa3660046136ea565b611fad565b3480156106bb57600080fd5b50610333611fdc565b3480156106d057600080fd5b5061041a6106df3660046134a0565b611feb565b3480156106f057600080fd5b5061041a612083565b34801561070557600080fd5b5061041a600d5481565b34801561071b57600080fd5b5061039861072a366004613634565b6120d9565b34801561073b57600080fd5b5061039861074a366004613695565b61219e565b34801561075b57600080fd5b5061039861076a3660046136ea565b6121db565b34801561077b57600080fd5b5061039861078a366004613554565b61220a565b34801561079b57600080fd5b506103986107aa3660046136ea565b612242565b3480156107bb57600080fd5b506103336107ca3660046136ea565b6122b8565b3480156107db57600080fd5b506103986107ea3660046136ea565b612393565b3480156107fb57600080fd5b506103986123c2565b34801561081057600080fd5b5061039861081f3660046136ea565b6126dc565b34801561083057600080fd5b5061039861083f3660046134a0565b61274c565b34801561085057600080fd5b5061039861085f3660046134a0565b61279a565b34801561087057600080fd5b5061039861087f3660046136ea565b61283b565b34801561089057600080fd5b5061030961089f3660046134a0565b61286a565b3480156108b057600080fd5b506103096108bf3660046134da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108f957600080fd5b50610398610908366004613669565b612898565b34801561091957600080fd5b506103986109283660046134a0565b612a42565b60006001600160e01b0319821663780e9d6360e01b1480610952575061095282612b2d565b92915050565b60606000805461096790613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461099390613a5a565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a685760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600a546001600160a01b03163314610aae5760405162461bcd60e51b8152600401610a5f90613904565b60138054911515600160a81b0260ff60a81b19909216919091179055565b60608060606000610adc85611140565b90508067ffffffffffffffff811115610af757610af7613b32565b604051908082528060200260200182016040528015610b20578160200160208202803683370190505b5093508067ffffffffffffffff811115610b3c57610b3c613b32565b604051908082528060200260200182016040528015610b65578160200160208202803683370190505b5092508067ffffffffffffffff811115610b8157610b81613b32565b604051908082528060200260200182016040528015610bb457816020015b6060815260200190600190039081610b9f5790505b50915060005b81811015610c8757610bcc8682610e14565b858281518110610bde57610bde613b1c565b60200260200101818152505060176000868381518110610c0057610c00613b1c565b6020026020010151815260200190815260200160002054848281518110610c2957610c29613b1c565b602002602001018181525050610c57858281518110610c4a57610c4a613b1c565b60200260200101516122b8565b838281518110610c6957610c69613b1c565b60200260200101819052508080610c7f90613a95565b915050610bba565b50509193909250565b6000610c9b82610f8e565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5f565b336001600160a01b0382161480610d255750610d2581336108bf565b610d975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5f565b610da18383612b7d565b505050565b600a546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610a5f90613904565b6013805460ff1916911515919091179055565b610ded3382612beb565b610e095760405162461bcd60e51b8152600401610a5f90613939565b610da1838383612cde565b6000610e1f83611140565b8210610e815760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610a5f90613904565b806001600160a01b0316ff5b610da18383836040518060200160405280600081525061220a565b6000610f0660085490565b8210610f695760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5f565b60088281548110610f7c57610f7c613b1c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5f565b600a546001600160a01b0316331461102f5760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b038116600090815260196020526040812054905b81811015610da1576001600160a01b038316600090815260196020526040812080548390811061107c5761107c613b1c565b60009182526020808320909101929092556001600160a01b03851681526019909152604081206001018054839081106110b7576110b7613b1c565b60009182526020808320909101929092556001600160a01b038516815260199091526040812080546016918391859081106110f4576110f4613b1c565b600091825260208083209091015483528201929092526040019020805460ff1916600183600281111561112957611129613af0565b02179055508061113881613a95565b91505061104a565b60006001600160a01b0382166111ab5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111f15760405162461bcd60e51b8152600401610a5f90613904565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b604080518082018252606080825260208083018290526001600160a01b038516600090815260198252849020845181549283028101840186529485018281529394939092849284918401828280156112b257602002820191906000526020600020905b81548152602001906001019080831161129e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561130a57602002820191906000526020600020905b8154815260200190600101908083116112f6575b5050505050815250509050919050565b3360009081526022602052604081205460ff1615156001141561133d5750600090565b6023546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561138157600080fd5b505afa158015611395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b99190613703565b9050806113c857600091505090565b602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561140d57600080fd5b505afa158015611421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114459190613703565b33600090815260246020908152604082205490549293509091839061146b9086906139f8565b61147591906139e4565b61147f9190613a17565b949350505050565b600a546001600160a01b031633146114b15760405162461bcd60e51b8152600401610a5f90613904565b601c55565b6000601c54601d54426114c99190613a17565b11156114d55750600090565b50600190565b600a546001600160a01b031633146115055760405162461bcd60e51b8152600401610a5f90613904565b601b55565b6025546001146115555760405162461bcd60e51b815260206004820152601660248201527514d85b5d5c985a52da5d1d195b9cce881313d0d2d15160521b6044820152606401610a5f565b6000602555601054601554111561157e5760405162461bcd60e51b8152600401610a5f90613889565b60115433600090815260186020526040902054106115de5760405162461bcd60e51b815260206004820152601d60248201527f546f6f204d616e7920546f6b656e7320466f722061204163636f756e740000006044820152606401610a5f565b601c54601d546115ee9042613a17565b10801561160157506115ff3361286a565b155b156116465760405162461bcd60e51b81526020600482015260156024820152744e6f7420726967687420746f206d696e74206e6f7760581b6044820152606401610a5f565b601c54601d546116569042613a17565b116119015760005b6011548110156118fb57336000908152601960205260408120805460029260169290918590811061169157611691613b1c565b6000918252602080832090910154835282019290925260400190205460ff1660028111156116c1576116c1613af0565b14156116cc576118e9565b6116da601580546001019055565b3360009081526019602052604090206001018054829081106116fe576116fe613b1c565b9060005260206000200154341461171457600080fd5b336000818152601960205260409020805461174b9291908490811061173b5761173b613b1c565b9060005260206000200154612e8b565b33600090815260186020526040812080549161176683613a95565b91905055506002601660006019600061177c3390565b6001600160a01b0316815260208101919091526040016000208054859081106117a7576117a7613b1c565b600091825260208083209091015483528201929092526040019020805460ff191660018360028111156117dc576117dc613af0565b021790555033600090815260196020526040902060010180548290811061180557611805613b1c565b9060005260206000200154601760006019600061181f3390565b6001600160a01b03168152602081019190915260400160002080548590811061184a5761184a613b1c565b9060005260206000200154815260200190815260200160002081905550601960006118723390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060010181815481106118a6576118a6613b1c565b600091825260208083209190910154600e5533825260199052604081206001018054839081106118d8576118d8613b1c565b6000918252602090912001556118fb565b806118f381613a95565b91505061165e565b50611a09565b601e546000901561191857601e8054600d55600090555b601a5460155410156119945760015b601a546119359060016139cc565b81101561198057600260008281526016602052604090205460ff16600281111561196157611961613af0565b1461196e57809150611980565b8061197881613a95565b915050611927565b61198e601580546001019055565b506119a7565b6119a2601580546001019055565b506015545b600d5434146119b557600080fd5b6119bf3382612e8b565b6000818152601660209081526040808320805460ff19166002179055600d546017835281842055338352601890915281208054916119fc83613a95565b9091555050600d54600e55505b600080601254118015611a1e575060135460ff165b8015611a39575060135461010090046001600160a01b031615155b15611a9357612710601254600e54611a5191906139f8565b611a5b91906139e4565b60135460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050611a9357600080fd5b60215460ff1615611b5d57602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611ae357600080fd5b505afa158015611af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613703565b905061271081601f54600e54611b3191906139f8565b611b3b91906139f8565b611b4591906139e4565b60206000828254611b5691906139cc565b9091555050505b601354600160a81b900460ff1615611c9057601454600080805b83811015611c8b5760148181548110611b9257611b92613b1c565b6000918252602090912060029091020154601480546001600160a01b0390921694506127109183908110611bc857611bc8613b1c565b906000526020600020906002020160010154600e54611be791906139f8565b611bf191906139e4565b9150478210611c425760405162461bcd60e51b815260206004820152601760248201527f42616c616e636520697320696e73756666696369656e740000000000000000006044820152606401610a5f565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611c78573d6000803e3d6000fd5b5080611c8381613a95565b915050611b77565b505050505b506001602555565b600a546001600160a01b03163314611cc25760405162461bcd60e51b8152600401610a5f90613904565b60004711611d075760405162461bcd60e51b81526020600482015260126024820152712737903130b630b731b29037b310232a269760711b6044820152606401610a5f565b60405133904780156108fc02916000818181858888f19350505050611d2b57600080fd5b565b600a546001600160a01b03163314611d575760405162461bcd60e51b8152600401610a5f90613904565b601b54601d54611d679042613a17565b10611d9f5760405162461bcd60e51b8152602060048201526008602482015267456e642074696d6560c01b6044820152606401610a5f565b6011546001600160a01b03821660009081526019602052604090205410611dd85760405162461bcd60e51b8152600401610a5f90613889565b601154601054611de89190613a17565b601a541115611e095760405162461bcd60e51b8152600401610a5f90613889565b6001600160a01b038116600090815260196020526040902054805b601154811015610da1576001600160a01b03831660009081526019602090815260408220600d5460019182018054928301815584529183200155601a805491611e6c83613a95565b90915550506001600160a01b0383166000908152601960209081526040808320601a805482546001808201855593875285872001555484526016909252909120805460ff19169091179055600d54600e819055600f54611ecb916139cc565b600d5580611ed881613a95565b915050611e24565b600a546001600160a01b03163314611f0a5760405162461bcd60e51b8152600401610a5f90613904565b6023546040516331a9108f60e11b8152600481018390526000916001600160a01b031690636352211e9060240160206040518083038186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8791906134bd565b6001600160a01b03166000908152602260205260409020805460ff191660011790555050565b600a546001600160a01b03163314611fd75760405162461bcd60e51b8152600401610a5f90613904565b600d55565b60606001805461096790613a5a565b6001600160a01b038116600090815260196020526040812060010154806120155750600092915050565b6000805b8281101561207b576001600160a01b038516600090815260196020526040902060010180548290811061204e5761204e613b1c565b9060005260206000200154915060008211156120695761207b565b8061207381613a95565b915050612019565b509392505050565b600060105461209160155490565b141561209d5750600090565b601a54601554111580156120be5750601c54601d546120bc9042613a17565b115b156120d257601e54156120d25750601e5490565b50600d5490565b6001600160a01b0382163314156121325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146121c85760405162461bcd60e51b8152600401610a5f90613904565b6021805460ff1916911515919091179055565b600a546001600160a01b031633146122055760405162461bcd60e51b8152600401610a5f90613904565b601155565b6122143383612beb565b6122305760405162461bcd60e51b8152600401610a5f90613939565b61223c84848484612fdb565b50505050565b600a546001600160a01b0316331461226c5760405162461bcd60e51b8152600401610a5f90613904565b600081116122b35760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206265207a65726f2076616c756560601b6044820152606401610a5f565b601255565b6000818152600260205260409020546060906001600160a01b03166123375760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5f565b600061234161300e565b90506000815111612361576040518060200160405280600081525061238c565b8061236b8461301d565b60405160200161237c929190613783565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146123bd5760405162461bcd60e51b8152600401610a5f90613904565b601055565b60255460011461240d5760405162461bcd60e51b815260206004820152601660248201527514d85b5d5c985a52da5d1d195b9cce881313d0d2d15160521b6044820152606401610a5f565b600060258190553381526022602052604090205460ff16156124655760405162461bcd60e51b81526020600482015260116024820152702cb7ba9030b9329032bc31b63ab232b21760791b6044820152606401610a5f565b6023546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156124a957600080fd5b505afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e19190613703565b9050600081116125435760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f74206120686f6c646572206f66204f472050756d706b60448201526634ba3a32b7399760c91b6064820152608401610a5f565b602354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561258857600080fd5b505afa15801561259c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c09190613703565b3360009081526024602090815260408220549054929350909183906125e69086906139f8565b6125f091906139e4565b6125fa9190613a17565b9050600081116126425760405162461bcd60e51b815260206004820152601360248201527242616c616e6365206973206e6f74207a65726f60681b6044820152606401610a5f565b4781106126895760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b6044820152606401610a5f565b604051339082156108fc029083906000818181858888f193505050506126ae57600080fd5b33600090815260246020526040812080548392906126cd9084906139cc565b90915550506001602555505050565b600a546001600160a01b031633146127065760405162461bcd60e51b8152600401610a5f90613904565b600081116127475760405162461bcd60e51b815260206004820152600e60248201526d50726963652069732077726f6e6760901b6044820152606401610a5f565b601e55565b600a546001600160a01b031633146127765760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b03166000908152602260205260409020805460ff19166001179055565b600a546001600160a01b031633146127c45760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b0381166128135760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a5f565b601380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a546001600160a01b031633146128655760405162461bcd60e51b8152600401610a5f90613904565b600f55565b6001600160a01b0381166000908152601960205260408120541561289057506001919050565b506000919050565b600a546001600160a01b031633146128c25760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b03821661290c5760405162461bcd60e51b815260206004820152601160248201527020b2323932b9b99034b9903bb937b7339760791b6044820152606401610a5f565b604080518082019091526001600160a01b0383168152602081018290526014546000805b828110156129b5576014818154811061294b5761294b613b1c565b60009182526020909120600290910201546001600160a01b03908116925086168214156129a357846014828154811061298657612986613b1c565b906000526020600020906002020160010181905550505050505050565b806129ad81613a95565b915050612930565b50506014805460018101825560009190915282517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec600290920291820180546001600160a01b0319166001600160a01b039092169190911790556020909201517fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ed90920191909155505050565b600a546001600160a01b03163314612a6c5760405162461bcd60e51b8152600401610a5f90613904565b6001600160a01b038116612ad15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5f565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480612b5e57506001600160e01b03198216635b5e139f60e01b145b8061095257506301ffc9a760e01b6001600160e01b0319831614610952565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612bb282610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612c645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5f565b6000612c6f83610f8e565b9050806001600160a01b0316846001600160a01b03161480612caa5750836001600160a01b0316612c9f846109ea565b6001600160a01b0316145b8061147f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661147f565b826001600160a01b0316612cf182610f8e565b6001600160a01b031614612d595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a5f565b6001600160a01b038216612dbb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5f565b612dc8838383600161311b565b612dd3600082612b7d565b6001600160a01b0383166000908152600360205260408120805460019290612dfc908490613a17565b90915550506001600160a01b0382166000908152600360205260408120805460019290612e2a9084906139cc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612ee15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5f565b6000818152600260205260409020546001600160a01b031615612f465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5f565b612f5460008383600161311b565b6001600160a01b0382166000908152600360205260408120805460019290612f7d9084906139cc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612fe6848484612cde565b612ff2848484846131ee565b61223c5760405162461bcd60e51b8152600401610a5f906138b2565b6060600b805461096790613a5a565b6060816130415750506040805180820190915260018152600360fc1b602082015290565b8160005b811561306b578061305581613a95565b91506130649050600a836139e4565b9150613045565b60008167ffffffffffffffff81111561308657613086613b32565b6040519080825280601f01601f1916602001820160405280156130b0576020820181803683370190505b5090505b841561147f576130c5600183613a17565b91506130d2600a86613ab0565b6130dd9060306139cc565b60f81b8183815181106130f2576130f2613b1c565b60200101906001600160f81b031916908160001a905350613114600a866139e4565b94506130b4565b6001600160a01b0384166131765761317182600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613199565b826001600160a01b0316846001600160a01b0316146131995761319984836132fb565b6001600160a01b0383161580156131ad5750805b156131c0576131bb82613398565b61223c565b836001600160a01b0316836001600160a01b0316141580156131df5750805b1561223c5761223c8383613447565b60006001600160a01b0384163b156132f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132329033908990889088906004016137b2565b602060405180830381600087803b15801561324c57600080fd5b505af192505050801561327c575060408051601f3d908101601f19168201909252613279918101906136cd565b60015b6132d6573d8080156132aa576040519150601f19603f3d011682016040523d82523d6000602084013e6132af565b606091505b5080516132ce5760405162461bcd60e51b8152600401610a5f906138b2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147f565b506001949350505050565b6000600161330884611140565b6133129190613a17565b600083815260076020526040902054909150808214613365576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133aa90600190613a17565b600083815260096020526040812054600880549394509092849081106133d2576133d2613b1c565b9060005260206000200154905080600883815481106133f3576133f3613b1c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061342b5761342b613b06565b6001900381819060005260206000200160009055905550505050565b600061345283611140565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8035801515811461349b57600080fd5b919050565b6000602082840312156134b257600080fd5b813561238c81613b48565b6000602082840312156134cf57600080fd5b815161238c81613b48565b600080604083850312156134ed57600080fd5b82356134f881613b48565b9150602083013561350881613b48565b809150509250929050565b60008060006060848603121561352857600080fd5b833561353381613b48565b9250602084013561354381613b48565b929592945050506040919091013590565b6000806000806080858703121561356a57600080fd5b843561357581613b48565b9350602085013561358581613b48565b925060408501359150606085013567ffffffffffffffff808211156135a957600080fd5b818701915087601f8301126135bd57600080fd5b8135818111156135cf576135cf613b32565b604051601f8201601f19908116603f011681019083821181831017156135f7576135f7613b32565b816040528281528a602084870101111561361057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561364757600080fd5b823561365281613b48565b91506136606020840161348b565b90509250929050565b6000806040838503121561367c57600080fd5b823561368781613b48565b946020939093013593505050565b6000602082840312156136a757600080fd5b61238c8261348b565b6000602082840312156136c257600080fd5b813561238c81613b60565b6000602082840312156136df57600080fd5b815161238c81613b60565b6000602082840312156136fc57600080fd5b5035919050565b60006020828403121561371557600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561374c57815187529582019590820190600101613730565b509495945050505050565b6000815180845261376f816020860160208601613a2e565b601f01601f19169290920160200192915050565b60008351613795818460208801613a2e565b8351908301906137a9818360208801613a2e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137e590830184613757565b9695505050505050565b606081526000613802606083018661371c565b602083820381850152613815828761371c565b915083820360408501528185518084528284019150828160051b85010183880160005b8381101561386657601f19878403018552613854838351613757565b94860194925090850190600101613838565b50909a9950505050505050505050565b60208152600061238c6020830184613757565b6020808252600f908201526e546f6f204d616e7920546f6b656e7360881b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251604060208401526139a6606084018261371c565b90506020840151601f198483030160408501526139c3828261371c565b95945050505050565b600082198211156139df576139df613ac4565b500190565b6000826139f3576139f3613ada565b500490565b6000816000190483118215151615613a1257613a12613ac4565b500290565b600082821015613a2957613a29613ac4565b500390565b60005b83811015613a49578181015183820152602001613a31565b8381111561223c5750506000910152565b600181811c90821680613a6e57607f821691505b60208210811415613a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613aa957613aa9613ac4565b5060010190565b600082613abf57613abf613ada565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b5d57600080fd5b50565b6001600160e01b031981168114613b5d57600080fdfea26469706673582212203c207012999a8152c44b7e5222920d45f9574384dd110cc82711841f3111f4d764736f6c63430008070033
Deployed Bytecode Sourcemap
50561:14496:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44360:233;;;;;;;;;;-1:-1:-1;44360:233:0;;;;;:::i;:::-;;:::i;:::-;;;7995:14:1;;7988:22;7970:41;;7958:2;7943:18;44360:233:0;;;;;;;;32282:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33734:221::-;;;;;;;;;;-1:-1:-1;33734:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6116:32:1;;;6098:51;;6086:2;6071:18;33734:221:0;5952:203:1;63584:107:0;;;;;;;;;;-1:-1:-1;63584:107:0;;;;;:::i;:::-;;:::i;:::-;;62784:593;;;;;;;;;;-1:-1:-1;62784:593:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;33271:397::-;;;;;;;;;;-1:-1:-1;33271:397:0;;;;;:::i;:::-;;:::i;64571:125::-;;;;;;;;;;-1:-1:-1;64571:125:0;;;;;:::i;:::-;;:::i;45009:113::-;;;;;;;;;;-1:-1:-1;45097:10:0;:17;45009:113;;;21448:25:1;;;21436:2;21421:18;45009:113:0;21302:177:1;34624:305:0;;;;;;;;;;-1:-1:-1;34624:305:0;;;;;:::i;:::-;;:::i;44677:256::-;;;;;;;;;;-1:-1:-1;44677:256:0;;;;;:::i;:::-;;:::i;64951:103::-;;;;;;;;;;-1:-1:-1;64951:103:0;;;;;:::i;:::-;;:::i;62107:99::-;;;;;;;;;;-1:-1:-1;62182:16:0;;62107:99;;35000:151;;;;;;;;;;-1:-1:-1;35000:151:0;;;;;:::i;:::-;;:::i;45199:233::-;;;;;;;;;;-1:-1:-1;45199:233:0;;;;;:::i;:::-;;:::i;31976:239::-;;;;;;;;;;-1:-1:-1;31976:239:0;;;;;:::i;:::-;;:::i;59882:377::-;;;;;;;;;;-1:-1:-1;59882:377:0;;;;;:::i;:::-;;:::i;31706:208::-;;;;;;;;;;-1:-1:-1;31706:208:0;;;;;:::i;:::-;;:::i;29540:148::-;;;;;;;;;;;;;:::i;60719:138::-;;;;;;;;;;-1:-1:-1;60719:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62422:118::-;;;;;;;;;;-1:-1:-1;62520:10:0;62467:4;62491:41;;;:20;:41;;;;;;62422:118;;57144:521;;;;;;;;;;;;;:::i;64820:119::-;;;;;;;;;;-1:-1:-1;64820:119:0;;;;;:::i;:::-;;:::i;61075:191::-;;;;;;;;;;;;;:::i;64708:100::-;;;;;;;;;;-1:-1:-1;64708:100:0;;;;;:::i;:::-;;:::i;53295:3837::-;;;:::i;62218:190::-;;;:::i;58971:899::-;;;;;;;;;;-1:-1:-1;58971:899:0;;;;;:::i;:::-;;:::i;28889:87::-;;;;;;;;;;-1:-1:-1;28962:6:0;;-1:-1:-1;;;;;28962:6:0;28889:87;;58732:231;;;;;;;;;;-1:-1:-1;58732:231:0;;;;;:::i;:::-;;:::i;50778:25::-;;;;;;;;;;;;;;;;61446:88;;;;;;;;;;-1:-1:-1;61446:88:0;;;;;:::i;:::-;;:::i;32451:104::-;;;;;;;;;;;;;:::i;60271:436::-;;;;;;;;;;-1:-1:-1;60271:436:0;;;;;:::i;:::-;;:::i;61546:428::-;;;;;;;;;;;;;:::i;50747:24::-;;;;;;;;;;;;;;;;34027:295;;;;;;;;;;-1:-1:-1;34027:295:0;;;;;:::i;:::-;;:::i;58470:111::-;;;;;;;;;;-1:-1:-1;58470:111:0;;;;;:::i;:::-;;:::i;62656:116::-;;;;;;;;;;-1:-1:-1;62656:116:0;;;;;:::i;:::-;;:::i;35222:285::-;;;;;;;;;;-1:-1:-1;35222:285:0;;;;;:::i;:::-;;:::i;64370:189::-;;;;;;;;;;-1:-1:-1;64370:189:0;;;;;:::i;:::-;;:::i;32626:352::-;;;;;;;;;;-1:-1:-1;32626:352:0;;;;;:::i;:::-;;:::i;62552:92::-;;;;;;;;;;-1:-1:-1;62552:92:0;;;;;:::i;:::-;;:::i;57677:781::-;;;;;;;;;;;;;:::i;61274:160::-;;;;;;;;;;-1:-1:-1;61274:160:0;;;;;:::i;:::-;;:::i;58593:127::-;;;;;;;;;;-1:-1:-1;58593:127:0;;;;;:::i;:::-;;:::i;63389:181::-;;;;;;;;;;-1:-1:-1;63389:181:0;;;;;:::i;:::-;;:::i;61986:109::-;;;;;;;;;;-1:-1:-1;61986:109:0;;;;;:::i;:::-;;:::i;60869:194::-;;;;;;;;;;-1:-1:-1;60869:194:0;;;;;:::i;:::-;;:::i;34393:164::-;;;;;;;;;;-1:-1:-1;34393:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34514:25:0;;;34490:4;34514:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34393:164;63699:659;;;;;;;;;;-1:-1:-1;63699:659:0;;;;;:::i;:::-;;:::i;29843:246::-;;;;;;;;;;-1:-1:-1;29843:246:0;;;;;:::i;:::-;;:::i;44360:233::-;44462:4;-1:-1:-1;;;;;;44486:50:0;;-1:-1:-1;;;44486:50:0;;:99;;;44549:36;44573:11;44549:23;:36::i;:::-;44479:106;44360:233;-1:-1:-1;;44360:233:0:o;32282:100::-;32336:13;32369:5;32362:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32282:100;:::o;33734:221::-;33810:7;37063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37063:16:0;33830:73;;;;-1:-1:-1;;;33830:73:0;;15262:2:1;33830:73:0;;;15244:21:1;15301:2;15281:18;;;15274:30;15340:34;15320:18;;;15313:62;-1:-1:-1;;;15391:18:1;;;15384:42;15443:19;;33830:73:0;;;;;;;;;-1:-1:-1;33923:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33923:24:0;;33734:221::o;63584:107::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;63653:21:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;63653:30:0::1;-1:-1:-1::0;;;;63653:30:0;;::::1;::::0;;;::::1;::::0;;63584:107::o;62784:593::-;62859:22;62883:32;62917:25;62960:12;62975:18;62985:7;62975:9;:18::i;:::-;62960:33;;63026:7;63015:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63015:19:0;;63004:30;;63074:7;63063:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63063:19:0;;63045:37;;63118:7;63105:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63093:33;;63152:6;63147:223;63164:7;63162:1;:9;63147:223;;;63216:31;63236:7;63245:1;63216:19;:31::i;:::-;63202:8;63211:1;63202:11;;;;;;;;:::i;:::-;;;;;;:45;;;;;63283:11;:24;63295:8;63304:1;63295:11;;;;;;;;:::i;:::-;;;;;;;63283:24;;;;;;;;;;;;63262:15;63278:1;63262:18;;;;;;;;:::i;:::-;;;;;;:45;;;;;63337:21;63346:8;63355:1;63346:11;;;;;;;;:::i;:::-;;;;;;;63337:8;:21::i;:::-;63322:9;63332:1;63322:12;;;;;;;;:::i;:::-;;;;;;:36;;;;63173:3;;;;;:::i;:::-;;;;63147:223;;;;62949:428;62784:593;;;;;:::o;33271:397::-;33352:13;33368:23;33383:7;33368:14;:23::i;:::-;33352:39;;33416:5;-1:-1:-1;;;;;33410:11:0;:2;-1:-1:-1;;;;;33410:11:0;;;33402:57;;;;-1:-1:-1;;;33402:57:0;;17621:2:1;33402:57:0;;;17603:21:1;17660:2;17640:18;;;17633:30;17699:34;17679:18;;;17672:62;-1:-1:-1;;;17750:18:1;;;17743:31;17791:19;;33402:57:0;17419:397:1;33402:57:0;27586:10;-1:-1:-1;;;;;33480:21:0;;;;:62;;-1:-1:-1;33505:37:0;33522:5;27586:10;34393:164;:::i;33505:37::-;33472:154;;;;-1:-1:-1;;;33472:154:0;;13305:2:1;33472:154:0;;;13287:21:1;13344:2;13324:18;;;13317:30;13383:34;13363:18;;;13356:62;13454:26;13434:18;;;13427:54;13498:19;;33472:154:0;13103:420:1;33472:154:0;33639:21;33648:2;33652:7;33639:8;:21::i;:::-;33341:327;33271:397;;:::o;64571:125::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;64646:25:::1;:42:::0;;-1:-1:-1;;64646:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64571:125::o;34624:305::-;34785:41;27586:10;34818:7;34785:18;:41::i;:::-;34777:103;;;;-1:-1:-1;;;34777:103:0;;;;;;;:::i;:::-;34893:28;34903:4;34909:2;34913:7;34893:9;:28::i;44677:256::-;44774:7;44810:23;44827:5;44810:16;:23::i;:::-;44802:5;:31;44794:87;;;;-1:-1:-1;;;44794:87:0;;9128:2:1;44794:87:0;;;9110:21:1;9167:2;9147:18;;;9140:30;9206:34;9186:18;;;9179:62;-1:-1:-1;;;9257:18:1;;;9250:41;9308:19;;44794:87:0;8926:407:1;44794:87:0;-1:-1:-1;;;;;;44899:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44677:256::o;64951:103::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;65042:3:::1;-1:-1:-1::0;;;;;65029:17:0::1;;35000:151:::0;35104:39;35121:4;35127:2;35131:7;35104:39;;;;;;;;;;;;:16;:39::i;45199:233::-;45274:7;45310:30;45097:10;:17;;45009:113;45310:30;45302:5;:38;45294:95;;;;-1:-1:-1;;;45294:95:0;;18789:2:1;45294:95:0;;;18771:21:1;18828:2;18808:18;;;18801:30;18867:34;18847:18;;;18840:62;-1:-1:-1;;;18918:18:1;;;18911:42;18970:19;;45294:95:0;18587:408:1;45294:95:0;45407:10;45418:5;45407:17;;;;;;;;:::i;:::-;;;;;;;;;45400:24;;45199:233;;;:::o;31976:239::-;32048:7;32084:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32084:16:0;32119:19;32111:73;;;;-1:-1:-1;;;32111:73:0;;14141:2:1;32111:73:0;;;14123:21:1;14180:2;14160:18;;;14153:30;14219:34;14199:18;;;14192:62;-1:-1:-1;;;14270:18:1;;;14263:39;14319:19;;32111:73:0;13939:405:1;59882:377:0;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59969:22:0;::::1;59955:11;59969:22:::0;;;:13:::1;:22;::::0;;;;:37;;60019:233:::1;60036:6;60034:1;:8;60019:233;;;-1:-1:-1::0;;;;;60073:22:0;::::1;60109:1;60073:22:::0;;;:13:::1;:22;::::0;;;;:33;;60104:1;;60073:33;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:37:::0;;;;-1:-1:-1;;;;;60125:22:0;::::1;::::0;;:13:::1;:22:::0;;;;;;:28:::1;;:31:::0;;60154:1;;60125:31;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:35:::0;;;;-1:-1:-1;;;;;60189:22:0;::::1;::::0;;:13:::1;:22:::0;;;;;;:33;;60175:12:::1;::::0;60125:31;;60220:1;;60189:33;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;60175:48;;;::::1;::::0;;;;;;;;:65;;-1:-1:-1;;60175:65:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;60044:3:0;::::1;::::0;::::1;:::i;:::-;;;;60019:233;;31706:208:::0;31778:7;-1:-1:-1;;;;;31806:19:0;;31798:74;;;;-1:-1:-1;;;31798:74:0;;13730:2:1;31798:74:0;;;13712:21:1;13769:2;13749:18;;;13742:30;13808:34;13788:18;;;13781:62;-1:-1:-1;;;13859:18:1;;;13852:40;13909:19;;31798:74:0;13528:406:1;31798:74:0;-1:-1:-1;;;;;;31890:16:0;;;;;:9;:16;;;;;;;31706:208::o;29540:148::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;29631:6:::1;::::0;29610:40:::1;::::0;29647:1:::1;::::0;-1:-1:-1;;;;;29631:6:0::1;::::0;29610:40:::1;::::0;29647:1;;29610:40:::1;29661:6;:19:::0;;-1:-1:-1;;;;;;29661:19:0::1;::::0;;29540:148::o;60719:138::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;60827:22:0;;-1:-1:-1;60827:22:0;;;:13;:22;;;;;60820:29;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60820:29:0;60827:22;;60820:29;;60827:22;;60820:29;;60827:22;60820:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60719:138;;;:::o;57144:521::-;57227:10;57187:7;57210:28;;;:16;:28;;;;;;;;:36;;:28;:36;57206:64;;;-1:-1:-1;57269:1:0;;57144:521::o;57206:64::-;57327:19;;57310:59;;-1:-1:-1;;;57310:59:0;;57358:10;57310:59;;;6098:51:1;57295:12:0;;-1:-1:-1;;;;;57327:19:0;;57310:47;;6071:18:1;;57310:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57295:74;-1:-1:-1;57384:12:0;57380:39;;57418:1;57411:8;;;57144:521;:::o;57380:39::-;57475:19;;57458:51;;;-1:-1:-1;;;57458:51:0;;;;57444:11;;-1:-1:-1;;;;;57475:19:0;;57458:49;;:51;;;;;;;;;;;;;;57475:19;57458:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57604:10;57520:22;57592:23;;;:11;:23;;;;;;;;57545:25;;57444:65;;-1:-1:-1;57520:22:0;;57444:65;;57545:35;;57573:7;;57545:35;:::i;:::-;:44;;;;:::i;:::-;:70;;;;:::i;:::-;57520:95;57144:521;-1:-1:-1;;;;57144:521:0:o;64820:119::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;64898:23:::1;:33:::0;64820:119::o;61075:191::-;61123:4;61176:23;;61162:11;;61144:15;:29;;;;:::i;:::-;:55;61140:86;;;-1:-1:-1;61221:5:0;;61075:191::o;61140:86::-;-1:-1:-1;61254:4:0;;61075:191::o;64708:100::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;64776:14:::1;:24:::0;64708:100::o;53295:3837::-;52479:8;;52491:1;52479:13;52471:48;;;;-1:-1:-1;;;52471:48:0;;17270:2:1;52471:48:0;;;17252:21:1;17309:2;17289:18;;;17282:30;-1:-1:-1;;;17328:18:1;;;17321:52;17390:18;;52471:48:0;17068:346:1;52471:48:0;52541:1;52530:8;:12;53385:11:::1;::::0;53356:15:::1;7751:14:::0;53356:40:::1;;53348:68;;;;-1:-1:-1::0;;;53348:68:0::1;;;;;;;:::i;:::-;53474:23;::::0;27586:10;53437:34:::1;::::0;;;:20:::1;:34;::::0;;;;;:60:::1;53429:102;;;::::0;-1:-1:-1;;;53429:102:0;;10723:2:1;53429:102:0::1;::::0;::::1;10705:21:1::0;10762:2;10742:18;;;10735:30;10801:31;10781:18;;;10774:59;10850:18;;53429:102:0::1;10521:353:1::0;53429:102:0::1;53588:23;::::0;53573:11:::1;::::0;53555:29:::1;::::0;:15:::1;:29;:::i;:::-;53554:57;:93;;;;-1:-1:-1::0;53616:31:0::1;27586:10:::0;60869:194;:::i;53616:31::-:1;53615:32;53554:93;53552:96;53544:130;;;::::0;-1:-1:-1;;;53544:130:0;;19202:2:1;53544:130:0::1;::::0;::::1;19184:21:1::0;19241:2;19221:18;;;19214:30;-1:-1:-1;;;19260:18:1;;;19253:51;19321:18;;53544:130:0::1;19000:345:1::0;53544:130:0::1;53734:23;::::0;53718:11:::1;::::0;53700:29:::1;::::0;:15:::1;:29;:::i;:::-;53699:58;53695:2317;;53788:6;53783:945;53800:23;;53798:1;:25;53783:945;;;27586:10:::0;53866:52:::1;53879:27:::0;;;:13:::1;:27;::::0;;;;:38;;53922:13:::1;::::0;53866:12:::1;::::0;:52;;53915:1;;53879:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;53866:52;;;::::1;::::0;;;;;;;;;::::1;;:69;::::0;::::1;;;;;;:::i;:::-;;53862:104;;;53958:8;;53862:104;54003:27;:15;7870:19:::0;;7888:1;7870:19;;;7781:127;54003:27:::1;27586:10:::0;54088:27:::1;::::0;;;:13:::1;:27;::::0;;;;:33:::1;;:36:::0;;54122:1;;54088:36;::::1;;;;;:::i;:::-;;;;;;;;;54075:9;:49;54067:58;;;::::0;::::1;;27586:10:::0;54182:27:::1;::::0;;;:13:::1;:27;::::0;;;;:38;;54162:59:::1;::::0;27586:10;54182:27;54218:1;;54182:38;::::1;;;;;:::i;:::-;;;;;;;;;54162:5;:59::i;:::-;27586:10:::0;54258:34:::1;::::0;;;:20:::1;:34;::::0;;;;:37;;;::::1;::::0;::::1;:::i;:::-;;;;;;54387:13;54332:12;:52;54345:13;:27;54359:12;27586:10:::0;;27506:98;54359:12:::1;-1:-1:-1::0;;;;;54345:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54345:27:0;:38;;54381:1;;54345:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;54332:52;;;::::1;::::0;;;;;;;;:68;;-1:-1:-1;;54332:68:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;27586:10:0;54473:27:::1;::::0;;;:13:::1;:27;::::0;;;;:33:::1;;:36:::0;;54507:1;;54473:36;::::1;;;;;:::i;:::-;;;;;;;;;54419:11;:51;54431:13;:27;54445:12;27586:10:::0;;27506:98;54445:12:::1;-1:-1:-1::0;;;;;54431:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54431:27:0;:38;;54467:1;;54431:38;::::1;;;;;:::i;:::-;;;;;;;;;54419:51;;;;;;;;;;;:90;;;;54575:13;:27;54589:12;27586:10:::0;;27506:98;54589:12:::1;-1:-1:-1::0;;;;;54575:27:0::1;-1:-1:-1::0;;;;;54575:27:0::1;;;;;;;;;;;;:33;;54609:1;54575:36;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;54558:13:::1;:53:::0;27586:10;54630:27;;:13:::1;:27:::0;;;;;:33:::1;;:36:::0;;54664:1;;54630:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:40:::0;54707:5:::1;;53783:945;53825:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53783:945;;;;53695:2317;;;54808:19;::::0;54768:15:::1;::::0;54808:23;54804:153:::1;;54880:19;::::0;;54865:12:::1;:34:::0;-1:-1:-1;54918:23:0;;54804:153:::1;55017:22;::::0;54989:15:::1;7751:14:::0;54989:50:::1;54985:583;;;55105:1;55098:257;55110:22;::::0;:26:::1;::::0;55135:1:::1;55110:26;:::i;:::-;55108:1;:28;55098:257;;;55206:13;55187:15;::::0;;;:12:::1;:15;::::0;;;;;::::1;;:32;::::0;::::1;;;;;;:::i;:::-;;55183:153;;55279:1;55269:11;;55307:5;;55183:153;55138:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55098:257;;;55373:27;:15;7870:19:::0;;7888:1;7870:19;;;7781:127;55373:27:::1;55054:362;54985:583;;;55453:27;:15;7870:19:::0;;7888:1;7870:19;;;7781:127;55453:27:::1;-1:-1:-1::0;55527:15:0::1;7751:14:::0;54985:583:::1;55617:12;;55604:9;:25;55596:34;;;::::0;::::1;;55659:28;27586:10:::0;55679:7:::1;55659:5;:28::i;:::-;55716:21;::::0;;;:12:::1;:21;::::0;;;;;;;:37;;-1:-1:-1;;55716:37:0::1;55740:13;55716:37;::::0;;55791:12:::1;::::0;55768:11:::1;:20:::0;;;;;:35;27586:10;55832:34;;:20:::1;:34:::0;;;;;:37;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;55926:12:0::1;::::0;55910:13:::1;:28:::0;-1:-1:-1;53695:2317:0::1;56032:21;56094:1:::0;56068:23:::1;;:27;:56;;;;-1:-1:-1::0;56099:25:0::1;::::0;::::1;;56068:56;:84;;;;-1:-1:-1::0;56128:10:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;56128:10:0::1;:24:::0;::::1;56068:84;56064:268;;;56237:5;56210:23;;56194:13;;:39;;;;:::i;:::-;:49;;;;:::i;:::-;56288:10;::::0;56280:39:::1;::::0;56178:65;;-1:-1:-1;56288:10:0::1;::::0;::::1;-1:-1:-1::0;;;;;56288:10:0::1;::::0;56280:39:::1;::::0;::::1;;::::0;56178:65;;56280:39:::1;::::0;;;56178:65;56288:10;56280:39;::::1;;;;;;56272:48;;;::::0;::::1;;56356:23;::::0;::::1;;56352:244;;;56436:19;::::0;56419:51:::1;::::0;;-1:-1:-1;;;56419:51:0;;;;56405:11:::1;::::0;-1:-1:-1;;;;;56436:19:0::1;::::0;56419:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;56436:19;56419:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56405:65;;56578:5;56568:6;56544:21;;56528:13;;:37;;;;:::i;:::-;:46;;;;:::i;:::-;:56;;;;:::i;:::-;56499:25;;:85;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;56352:244:0::1;56612:21;::::0;-1:-1:-1;;;56612:21:0;::::1;;;56608:517;;;56674:20;:27:::0;56659:12:::1;::::0;;56772:340:::1;56788:7;56786:1;:9;56772:340;;;56831:20;56852:1;56831:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:32:::0;56907:20:::1;:23:::0;;-1:-1:-1;;;;;56831:32:0;;::::1;::::0;-1:-1:-1;56941:5:0::1;::::0;56928:1;;56907:23;::::1;;;;;:::i;:::-;;;;;;;;;;;:30;;;56891:13;;:46;;;;:::i;:::-;:56;;;;:::i;:::-;56882:65;;56989:21;56980:6;:30;56972:66;;;::::0;-1:-1:-1;;;56972:66:0;;11081:2:1;56972:66:0::1;::::0;::::1;11063:21:1::0;11120:2;11100:18;;;11093:30;11159:25;11139:18;;;11132:53;11202:18;;56972:66:0::1;10879:347:1::0;56972:66:0::1;57063:33;::::0;-1:-1:-1;;;;;57063:25:0;::::1;::::0;:33;::::1;;;::::0;57089:6;;57063:33:::1;::::0;;;57089:6;57063:25;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;56797:3:0;::::1;::::0;::::1;:::i;:::-;;;;56772:340;;;;56644:481;;;56608:517;-1:-1:-1::0;52576:1:0;52565:8;:12;53295:3837::o;62218:190::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;62309:1:::1;62285:21;:25;62277:56;;;::::0;-1:-1:-1;;;62277:56:0;;19552:2:1;62277:56:0::1;::::0;::::1;19534:21:1::0;19591:2;19571:18;;;19564:30;-1:-1:-1;;;19610:18:1;;;19603:48;19668:18;;62277:56:0::1;19350:342:1::0;62277:56:0::1;62352:47;::::0;62360:10:::1;::::0;62377:21:::1;62352:47:::0;::::1;;;::::0;::::1;::::0;;;62377:21;62360:10;62352:47;::::1;;;;;;62344:56;;;::::0;::::1;;62218:190::o:0;58971:899::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;59083:14:::1;::::0;59068:11:::1;::::0;59050:29:::1;::::0;:15:::1;:29;:::i;:::-;59049:48;59041:69;;;::::0;-1:-1:-1;;;59041:69:0;;8448:2:1;59041:69:0::1;::::0;::::1;8430:21:1::0;8487:1;8467:18;;;8460:29;-1:-1:-1;;;8505:18:1;;;8498:38;8553:18;;59041:69:0::1;8246:331:1::0;59041:69:0::1;59169:23;::::0;-1:-1:-1;;;;;59129:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;:37;:63:::1;59121:91;;;;-1:-1:-1::0;;;59121:91:0::1;;;;;;;:::i;:::-;59271:23;;59257:11;;:37;;;;:::i;:::-;59231:22;;:63;;59223:91;;;;-1:-1:-1::0;;;59223:91:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59349:22:0;::::1;59335:11;59349:22:::0;;;:13:::1;:22;::::0;;;;:37;;59399:464:::1;59421:23;;59419:1;:25;59399:464;;;-1:-1:-1::0;;;;;59475:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;;59509:12:::1;::::0;59475:28:::1;::::0;;::::1;:47:::0;;;;::::1;::::0;;;;;;;::::1;::::0;59551:22:::1;:24:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;59590:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;;;59626::::1;::::0;;59590:59;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;59691:22;59678:36;;:12:::1;:36:::0;;;;;;:54;;-1:-1:-1;;59678:54:0::1;::::0;;::::1;::::0;;59777:12:::1;::::0;59761:13:::1;:28:::0;;;59835:16:::1;::::0;59819:32:::1;::::0;::::1;:::i;:::-;59804:12;:47:::0;59446:3;::::1;::::0;::::1;:::i;:::-;;;;59399:464;;58732:231:::0;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;58863:19:::1;::::0;58846:66:::1;::::0;-1:-1:-1;;;58846:66:0;;::::1;::::0;::::1;21448:25:1::0;;;58828:15:0::1;::::0;-1:-1:-1;;;;;58863:19:0::1;::::0;58846:45:::1;::::0;21421:18:1;;58846:66:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58923:25:0::1;;::::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;58923:32:0::1;58951:4;58923:32;::::0;;-1:-1:-1;;58732:231:0:o;61446:88::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;61505:12:::1;:21:::0;61446:88::o;32451:104::-;32507:13;32540:7;32533:14;;;;;:::i;60271:436::-;-1:-1:-1;;;;;60374:22:0;;60340:7;60374:22;;;:13;:22;;;;;:28;;:35;60434:11;60430:38;;-1:-1:-1;60467:1:0;;60271:436;-1:-1:-1;;60271:436:0:o;60430:38::-;60489:10;;60510:157;60527:6;60525:1;:8;60510:157;;;-1:-1:-1;;;;;60572:22:0;;;;;;:13;:22;;;;;:28;;:31;;60601:1;;60572:31;;;;;;:::i;:::-;;;;;;;;;60564:39;;60630:1;60622:5;:9;60618:37;;;60650:5;;60618:37;60535:3;;;;:::i;:::-;;;;60510:157;;;-1:-1:-1;60694:5:0;60271:436;-1:-1:-1;;;60271:436:0:o;61546:428::-;61586:4;61636:11;;61607:25;:15;7751:14;;7659:114;61607:25;:40;61603:67;;;-1:-1:-1;61669:1:0;;61546:428::o;61603:67::-;61728:22;;61699:15;7751:14;61699:51;;:126;;;;-1:-1:-1;61802:23:0;;61787:11;;61769:29;;:15;:29;:::i;:::-;61768:57;61699:126;61695:240;;;61855:19;;:23;61851:72;;-1:-1:-1;61904:19:0;;;61546:428::o;61851:72::-;-1:-1:-1;61954:12:0;;;61546:428::o;34027:295::-;-1:-1:-1;;;;;34130:24:0;;27586:10;34130:24;;34122:62;;;;-1:-1:-1;;;34122:62:0;;11838:2:1;34122:62:0;;;11820:21:1;11877:2;11857:18;;;11850:30;11916:27;11896:18;;;11889:55;11961:18;;34122:62:0;11636:349:1;34122:62:0;27586:10;34197:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34197:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34197:53:0;;;;;;;;;;34266:48;;7970:41:1;;;34197:42:0;;27586:10;34266:48;;7943:18:1;34266:48:0;;;;;;;34027:295;;:::o;58470:111::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;58541:23:::1;:32:::0;;-1:-1:-1;;58541:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58470:111::o;62656:116::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;62732:23:::1;:32:::0;62656:116::o;35222:285::-;35354:41;27586:10;35387:7;35354:18;:41::i;:::-;35346:103;;;;-1:-1:-1;;;35346:103:0;;;;;;;:::i;:::-;35460:39;35474:4;35480:2;35484:7;35493:5;35460:13;:39::i;:::-;35222:285;;;;:::o;64370:189::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;64476:1:::1;64461:12;:16;64453:49;;;::::0;-1:-1:-1;;;64453:49:0;;12605:2:1;64453:49:0::1;::::0;::::1;12587:21:1::0;12644:2;12624:18;;;12617:30;-1:-1:-1;;;12663:18:1;;;12656:50;12723:18;;64453:49:0::1;12403:344:1::0;64453:49:0::1;64513:23;:38:::0;64370:189::o;32626:352::-;37039:4;37063:16;;;:7;:16;;;;;;32699:13;;-1:-1:-1;;;;;37063:16:0;32725:76;;;;-1:-1:-1;;;32725:76:0;;16446:2:1;32725:76:0;;;16428:21:1;16485:2;16465:18;;;16458:30;16524:34;16504:18;;;16497:62;-1:-1:-1;;;16575:18:1;;;16568:45;16630:19;;32725:76:0;16244:411:1;32725:76:0;32814:21;32838:10;:8;:10::i;:::-;32814:34;;32890:1;32872:7;32866:21;:25;:104;;;;;;;;;;;;;;;;;32927:7;32936:18;:7;:16;:18::i;:::-;32910:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32866:104;32859:111;32626:352;-1:-1:-1;;;32626:352:0:o;62552:92::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;62616:11:::1;:20:::0;62552:92::o;57677:781::-;52479:8;;52491:1;52479:13;52471:48;;;;-1:-1:-1;;;52471:48:0;;17270:2:1;52471:48:0;;;17252:21:1;17309:2;17289:18;;;17282:30;-1:-1:-1;;;17328:18:1;;;17321:52;17390:18;;52471:48:0;17068:346:1;52471:48:0;52541:1;52530:8;:12;;;57747:10:::1;57730:28:::0;;:16:::1;:28;::::0;;;;;::::1;;:37;57722:67;;;::::0;-1:-1:-1;;;57722:67:0;;20242:2:1;57722:67:0::1;::::0;::::1;20224:21:1::0;20281:2;20261:18;;;20254:30;-1:-1:-1;;;20300:18:1;;;20293:47;20357:18;;57722:67:0::1;20040:341:1::0;57722:67:0::1;57842:19;::::0;57825:59:::1;::::0;-1:-1:-1;;;57825:59:0;;57873:10:::1;57825:59;::::0;::::1;6098:51:1::0;57810:12:0::1;::::0;-1:-1:-1;;;;;57842:19:0::1;::::0;57825:47:::1;::::0;6071:18:1;;57825:59:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57810:74;;57913:1;57903:7;:11;57895:63;;;::::0;-1:-1:-1;;;57895:63:0;;16862:2:1;57895:63:0::1;::::0;::::1;16844:21:1::0;16901:2;16881:18;;;16874:30;16940:34;16920:18;;;16913:62;-1:-1:-1;;;16991:18:1;;;16984:37;17038:19;;57895:63:0::1;16660:403:1::0;57895:63:0::1;58010:19;::::0;57993:51:::1;::::0;;-1:-1:-1;;;57993:51:0;;;;57979:11:::1;::::0;-1:-1:-1;;;;;58010:19:0::1;::::0;57993:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;58010:19;57993:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58139:10;58055:22;58127:23:::0;;;:11:::1;:23;::::0;;;;;;;58080:25;;57979:65;;-1:-1:-1;58055:22:0;;57979:65;;58080:35:::1;::::0;58108:7;;58080:35:::1;:::i;:::-;:44;;;;:::i;:::-;:70;;;;:::i;:::-;58055:95;;58196:1;58179:14;:18;58171:50;;;::::0;-1:-1:-1;;;58171:50:0;;18441:2:1;58171:50:0::1;::::0;::::1;18423:21:1::0;18480:2;18460:18;;;18453:30;-1:-1:-1;;;18499:18:1;;;18492:49;18558:18;;58171:50:0::1;18239:343:1::0;58171:50:0::1;58267:21;58250:14;:38;58242:72;;;::::0;-1:-1:-1;;;58242:72:0;;14551:2:1;58242:72:0::1;::::0;::::1;14533:21:1::0;14590:2;14570:18;;;14563:30;-1:-1:-1;;;14609:18:1;;;14602:51;14670:18;;58242:72:0::1;14349:345:1::0;58242:72:0::1;58343:40;::::0;58351:10:::1;::::0;58343:40;::::1;;;::::0;58368:14;;58343:40:::1;::::0;;;58368:14;58351:10;58343:40;::::1;;;;;;58335:49;;;::::0;::::1;;58421:10;58409:23;::::0;;;:11:::1;:23;::::0;;;;:41;;58436:14;;58409:23;:41:::1;::::0;58436:14;;58409:41:::1;:::i;:::-;::::0;;;-1:-1:-1;;52576:1:0;52565:8;:12;-1:-1:-1;;;57677:781:0:o;61274:160::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;61367:1:::1;61358:6;:10;61350:37;;;::::0;-1:-1:-1;;;61350:37:0;;19899:2:1;61350:37:0::1;::::0;::::1;19881:21:1::0;19938:2;19918:18;;;19911:30;-1:-1:-1;;;19957:18:1;;;19950:44;20011:18;;61350:37:0::1;19697:338:1::0;61350:37:0::1;61398:19;:28:::0;61274:160::o;58593:127::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58680:25:0::1;;::::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;58680:32:0::1;58708:4;58680:32;::::0;;58593:127::o;63389:181::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63475:25:0;::::1;63467:60;;;::::0;-1:-1:-1;;;63467:60:0;;12954:2:1;63467:60:0::1;::::0;::::1;12936:21:1::0;12993:2;12973:18;;;12966:30;-1:-1:-1;;;13012:18:1;;;13005:52;13074:18;;63467:60:0::1;12752:346:1::0;63467:60:0::1;63538:10;:24:::0;;-1:-1:-1;;;;;63538:24:0;;::::1;;;-1:-1:-1::0;;;;;;63538:24:0;;::::1;::::0;;;::::1;::::0;;63389:181::o;61986:109::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;62059:16:::1;:28:::0;61986:109::o;60869:194::-;-1:-1:-1;;;;;60955:22:0;;60934:4;60955:22;;;:13;:22;;;;;:37;:41;60951:71;;-1:-1:-1;61018:4:0;;60869:194;-1:-1:-1;60869:194:0:o;60951:71::-;-1:-1:-1;61050:5:0;;60869:194;-1:-1:-1;60869:194:0:o;63699:659::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63801:22:0;::::1;63793:52;;;::::0;-1:-1:-1;;;63793:52:0;;20588:2:1;63793:52:0::1;::::0;::::1;20570:21:1::0;20627:2;20607:18;;;20600:30;-1:-1:-1;;;20646:18:1;;;20639:47;20703:18;;63793:52:0::1;20386:341:1::0;63793:52:0::1;-1:-1:-1::0;;;;;;;;;;;;;;63900:24:0;::::1;::::0;;-1:-1:-1;;;63935:20:0;;;63991::::1;:27:::0;-1:-1:-1;;64055:252:0::1;64071:7;64069:1;:9;64055:252;;;64110:20;64131:1;64110:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:32:::0;-1:-1:-1;;;;;64110:32:0;;::::1;::::0;-1:-1:-1;64163:19:0;::::1;::::0;::::1;64159:137;;;64249:6;64216:20;64237:1;64216:23;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:39;;;;64274:7;;;;63699:659:::0;;:::o;64159:137::-:1;64080:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64055:252;;;-1:-1:-1::0;;64319:20:0::1;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;64319:31:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;64319:31:0::1;-1:-1:-1::0;;;;;64319:31:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;;;63699:659:0:o;29843:246::-;28962:6;;-1:-1:-1;;;;;28962:6:0;27586:10;29109:23;29101:68;;;;-1:-1:-1;;;29101:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29934:22:0;::::1;29926:73;;;::::0;-1:-1:-1;;;29926:73:0;;9959:2:1;29926:73:0::1;::::0;::::1;9941:21:1::0;9998:2;9978:18;;;9971:30;10037:34;10017:18;;;10010:62;-1:-1:-1;;;10088:18:1;;;10081:36;10134:19;;29926:73:0::1;9757:402:1::0;29926:73:0::1;30036:6;::::0;30015:38:::1;::::0;-1:-1:-1;;;;;30015:38:0;;::::1;::::0;30036:6:::1;::::0;30015:38:::1;::::0;30036:6:::1;::::0;30015:38:::1;30064:6;:17:::0;;-1:-1:-1;;;;;;30064:17:0::1;-1:-1:-1::0;;;;;30064:17:0;;;::::1;::::0;;;::::1;::::0;;29843:246::o;31358:284::-;31460:4;-1:-1:-1;;;;;;31484:40:0;;-1:-1:-1;;;31484:40:0;;:101;;-1:-1:-1;;;;;;;31537:48:0;;-1:-1:-1;;;31537:48:0;31484:101;:150;;;-1:-1:-1;;;;;;;;;;20688:40:0;;;31598:36;20579:157;41213:174;41288:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41288:29:0;-1:-1:-1;;;;;41288:29:0;;;;;;;;:24;;41342:23;41288:24;41342:14;:23::i;:::-;-1:-1:-1;;;;;41333:46:0;;;;;;;;;;;41213:174;;:::o;37268:348::-;37361:4;37063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37063:16:0;37378:73;;;;-1:-1:-1;;;37378:73:0;;12192:2:1;37378:73:0;;;12174:21:1;12231:2;12211:18;;;12204:30;12270:34;12250:18;;;12243:62;-1:-1:-1;;;12321:18:1;;;12314:42;12373:19;;37378:73:0;11990:408:1;37378:73:0;37462:13;37478:23;37493:7;37478:14;:23::i;:::-;37462:39;;37531:5;-1:-1:-1;;;;;37520:16:0;:7;-1:-1:-1;;;;;37520:16:0;;:51;;;;37564:7;-1:-1:-1;;;;;37540:31:0;:20;37552:7;37540:11;:20::i;:::-;-1:-1:-1;;;;;37540:31:0;;37520:51;:87;;;-1:-1:-1;;;;;;34514:25:0;;;34490:4;34514:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37575:32;34393:164;40545:550;40670:4;-1:-1:-1;;;;;40643:31:0;:23;40658:7;40643:14;:23::i;:::-;-1:-1:-1;;;;;40643:31:0;;40635:85;;;;-1:-1:-1;;;40635:85:0;;16036:2:1;40635:85:0;;;16018:21:1;16075:2;16055:18;;;16048:30;16114:34;16094:18;;;16087:62;-1:-1:-1;;;16165:18:1;;;16158:39;16214:19;;40635:85:0;15834:405:1;40635:85:0;-1:-1:-1;;;;;40739:16:0;;40731:65;;;;-1:-1:-1;;;40731:65:0;;11433:2:1;40731:65:0;;;11415:21:1;11472:2;11452:18;;;11445:30;11511:34;11491:18;;;11484:62;-1:-1:-1;;;11562:18:1;;;11555:34;11606:19;;40731:65:0;11231:400:1;40731:65:0;40809:45;40830:4;40836:2;40840:7;40849:4;40809:20;:45::i;:::-;40919:29;40936:1;40940:7;40919:8;:29::i;:::-;-1:-1:-1;;;;;40961:15:0;;;;;;:9;:15;;;;;:20;;40980:1;;40961:15;:20;;40980:1;;40961:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40992:13:0;;;;;;:9;:13;;;;;:18;;41009:1;;40992:13;:18;;41009:1;;40992:18;:::i;:::-;;;;-1:-1:-1;;41021:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41021:21:0;-1:-1:-1;;;;;41021:21:0;;;;;;;;;41060:27;;41021:16;;41060:27;;;;;;;40545:550;;;:::o;38881:388::-;-1:-1:-1;;;;;38961:16:0;;38953:61;;;;-1:-1:-1;;;38953:61:0;;14901:2:1;38953:61:0;;;14883:21:1;;;14920:18;;;14913:30;14979:34;14959:18;;;14952:62;15031:18;;38953:61:0;14699:356:1;38953:61:0;37039:4;37063:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37063:16:0;:30;39025:58;;;;-1:-1:-1;;;39025:58:0;;10366:2:1;39025:58:0;;;10348:21:1;10405:2;10385:18;;;10378:30;10444;10424:18;;;10417:58;10492:18;;39025:58:0;10164:352:1;39025:58:0;39096:51;39125:1;39129:2;39133:7;39142:4;39096:20;:51::i;:::-;-1:-1:-1;;;;;39160:13:0;;;;;;:9;:13;;;;;:18;;39177:1;;39160:13;:18;;39177:1;;39160:18;:::i;:::-;;;;-1:-1:-1;;39189:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39189:21:0;-1:-1:-1;;;;;39189:21:0;;;;;;;;39228:33;;39189:16;;;39228:33;;39189:16;;39228:33;38881:388;;:::o;36389:272::-;36503:28;36513:4;36519:2;36523:7;36503:9;:28::i;:::-;36550:48;36573:4;36579:2;36583:7;36592:5;36550:22;:48::i;:::-;36542:111;;;;-1:-1:-1;;;36542:111:0;;;;;;;:::i;53169:114::-;53229:13;53262;53255:20;;;;;:::i;8503:723::-;8559:13;8780:10;8776:53;;-1:-1:-1;;8807:10:0;;;;;;;;;;;;-1:-1:-1;;;8807:10:0;;;;;8503:723::o;8776:53::-;8854:5;8839:12;8895:78;8902:9;;8895:78;;8928:8;;;;:::i;:::-;;-1:-1:-1;8951:10:0;;-1:-1:-1;8959:2:0;8951:10;;:::i;:::-;;;8895:78;;;8983:19;9015:6;9005:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9005:17:0;;8983:39;;9033:154;9040:10;;9033:154;;9067:11;9077:1;9067:11;;:::i;:::-;;-1:-1:-1;9136:10:0;9144:2;9136:5;:10;:::i;:::-;9123:24;;:2;:24;:::i;:::-;9110:39;;9093:6;9100;9093:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9093:56:0;;;;;;;;-1:-1:-1;9164:11:0;9173:2;9164:11;;:::i;:::-;;;9033:154;;46045:604;-1:-1:-1;;;;;46242:18:0;;46238:187;;46277:40;46309:7;47476:10;:17;;47449:24;;;;:15;:24;;;;;:44;;;47504:24;;;;;;;;;;;;47372:164;46277:40;46238:187;;;46347:2;-1:-1:-1;;;;;46339:10:0;:4;-1:-1:-1;;;;;46339:10:0;;46335:90;;46366:47;46399:4;46405:7;46366:32;:47::i;:::-;-1:-1:-1;;;;;46439:16:0;;;:28;;;;;46459:8;46439:28;46435:207;;;46484:45;46521:7;46484:36;:45::i;:::-;46435:207;;;46557:4;-1:-1:-1;;;;;46551:10:0;:2;-1:-1:-1;;;;;46551:10:0;;;:22;;;;;46565:8;46551:22;46547:95;;;46590:40;46618:2;46622:7;46590:27;:40::i;41952:839::-;42069:4;-1:-1:-1;;;;;42095:13:0;;11335:20;11374:8;42091:693;;42131:72;;-1:-1:-1;;;42131:72:0;;-1:-1:-1;;;;;42131:36:0;;;;;:72;;27586:10;;42182:4;;42188:7;;42197:5;;42131:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42131:72:0;;;;;;;;-1:-1:-1;;42131:72:0;;;;;;;;;;;;:::i;:::-;;;42127:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42377:13:0;;42373:341;;42420:60;;-1:-1:-1;;;42420:60:0;;;;;;;:::i;42373:341::-;42664:6;42658:13;42649:6;42645:2;42641:15;42634:38;42127:602;-1:-1:-1;;;;;;42254:55:0;-1:-1:-1;;;42254:55:0;;-1:-1:-1;42247:62:0;;42091:693;-1:-1:-1;42768:4:0;41952:839;;;;;;:::o;48163:988::-;48429:22;48479:1;48454:22;48471:4;48454:16;:22::i;:::-;:26;;;;:::i;:::-;48491:18;48512:26;;;:17;:26;;;;;;48429:51;;-1:-1:-1;48645:28:0;;;48641:328;;-1:-1:-1;;;;;48712:18:0;;48690:19;48712:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48763:30;;;;;;:44;;;48880:30;;:17;:30;;;;;:43;;;48641:328;-1:-1:-1;49065:26:0;;;;:17;:26;;;;;;;;49058:33;;;-1:-1:-1;;;;;49109:18:0;;;;;:12;:18;;;;;:34;;;;;;;49102:41;48163:988::o;49446:1079::-;49724:10;:17;49699:22;;49724:21;;49744:1;;49724:21;:::i;:::-;49756:18;49777:24;;;:15;:24;;;;;;50150:10;:26;;49699:46;;-1:-1:-1;49777:24:0;;49699:46;;50150:26;;;;;;:::i;:::-;;;;;;;;;50128:48;;50214:11;50189:10;50200;50189:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50294:28;;;:15;:28;;;;;;;:41;;;50466:24;;;;;50459:31;50501:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49517:1008;;;49446:1079;:::o;46950:221::-;47035:14;47052:20;47069:2;47052:16;:20::i;:::-;-1:-1:-1;;;;;47083:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47128:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46950:221:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;947:388::-;1015:6;1023;1076:2;1064:9;1055:7;1051:23;1047:32;1044:52;;;1092:1;1089;1082:12;1044:52;1131:9;1118:23;1150:31;1175:5;1150:31;:::i;:::-;1200:5;-1:-1:-1;1257:2:1;1242:18;;1229:32;1270:33;1229:32;1270:33;:::i;:::-;1322:7;1312:17;;;947:388;;;;;:::o;1340:456::-;1417:6;1425;1433;1486:2;1474:9;1465:7;1461:23;1457:32;1454:52;;;1502:1;1499;1492:12;1454:52;1541:9;1528:23;1560:31;1585:5;1560:31;:::i;:::-;1610:5;-1:-1:-1;1667:2:1;1652:18;;1639:32;1680:33;1639:32;1680:33;:::i;:::-;1340:456;;1732:7;;-1:-1:-1;;;1786:2:1;1771:18;;;;1758:32;;1340:456::o;1801:1266::-;1896:6;1904;1912;1920;1973:3;1961:9;1952:7;1948:23;1944:33;1941:53;;;1990:1;1987;1980:12;1941:53;2029:9;2016:23;2048:31;2073:5;2048:31;:::i;:::-;2098:5;-1:-1:-1;2155:2:1;2140:18;;2127:32;2168:33;2127:32;2168:33;:::i;:::-;2220:7;-1:-1:-1;2274:2:1;2259:18;;2246:32;;-1:-1:-1;2329:2:1;2314:18;;2301:32;2352:18;2382:14;;;2379:34;;;2409:1;2406;2399:12;2379:34;2447:6;2436:9;2432:22;2422:32;;2492:7;2485:4;2481:2;2477:13;2473:27;2463:55;;2514:1;2511;2504:12;2463:55;2550:2;2537:16;2572:2;2568;2565:10;2562:36;;;2578:18;;:::i;:::-;2653:2;2647:9;2621:2;2707:13;;-1:-1:-1;;2703:22:1;;;2727:2;2699:31;2695:40;2683:53;;;2751:18;;;2771:22;;;2748:46;2745:72;;;2797:18;;:::i;:::-;2837:10;2833:2;2826:22;2872:2;2864:6;2857:18;2912:7;2907:2;2902;2898;2894:11;2890:20;2887:33;2884:53;;;2933:1;2930;2923:12;2884:53;2989:2;2984;2980;2976:11;2971:2;2963:6;2959:15;2946:46;3034:1;3029:2;3024;3016:6;3012:15;3008:24;3001:35;3055:6;3045:16;;;;;;;1801:1266;;;;;;;:::o;3072:315::-;3137:6;3145;3198:2;3186:9;3177:7;3173:23;3169:32;3166:52;;;3214:1;3211;3204:12;3166:52;3253:9;3240:23;3272:31;3297:5;3272:31;:::i;:::-;3322:5;-1:-1:-1;3346:35:1;3377:2;3362:18;;3346:35;:::i;:::-;3336:45;;3072:315;;;;;:::o;3392:::-;3460:6;3468;3521:2;3509:9;3500:7;3496:23;3492:32;3489:52;;;3537:1;3534;3527:12;3489:52;3576:9;3563:23;3595:31;3620:5;3595:31;:::i;:::-;3645:5;3697:2;3682:18;;;;3669:32;;-1:-1:-1;;;3392:315:1:o;3712:180::-;3768:6;3821:2;3809:9;3800:7;3796:23;3792:32;3789:52;;;3837:1;3834;3827:12;3789:52;3860:26;3876:9;3860:26;:::i;3897:245::-;3955:6;4008:2;3996:9;3987:7;3983:23;3979:32;3976:52;;;4024:1;4021;4014:12;3976:52;4063:9;4050:23;4082:30;4106:5;4082:30;:::i;4147:249::-;4216:6;4269:2;4257:9;4248:7;4244:23;4240:32;4237:52;;;4285:1;4282;4275:12;4237:52;4317:9;4311:16;4336:30;4360:5;4336:30;:::i;4401:180::-;4460:6;4513:2;4501:9;4492:7;4488:23;4484:32;4481:52;;;4529:1;4526;4519:12;4481:52;-1:-1:-1;4552:23:1;;4401:180;-1:-1:-1;4401:180:1:o;4586:184::-;4656:6;4709:2;4697:9;4688:7;4684:23;4680:32;4677:52;;;4725:1;4722;4715:12;4677:52;-1:-1:-1;4748:16:1;;4586:184;-1:-1:-1;4586:184:1:o;4775:435::-;4828:3;4866:5;4860:12;4893:6;4888:3;4881:19;4919:4;4948:2;4943:3;4939:12;4932:19;;4985:2;4978:5;4974:14;5006:1;5016:169;5030:6;5027:1;5024:13;5016:169;;;5091:13;;5079:26;;5125:12;;;;5160:15;;;;5052:1;5045:9;5016:169;;;-1:-1:-1;5201:3:1;;4775:435;-1:-1:-1;;;;;4775:435:1:o;5215:257::-;5256:3;5294:5;5288:12;5321:6;5316:3;5309:19;5337:63;5393:6;5386:4;5381:3;5377:14;5370:4;5363:5;5359:16;5337:63;:::i;:::-;5454:2;5433:15;-1:-1:-1;;5429:29:1;5420:39;;;;5461:4;5416:50;;5215:257;-1:-1:-1;;5215:257:1:o;5477:470::-;5656:3;5694:6;5688:13;5710:53;5756:6;5751:3;5744:4;5736:6;5732:17;5710:53;:::i;:::-;5826:13;;5785:16;;;;5848:57;5826:13;5785:16;5882:4;5870:17;;5848:57;:::i;:::-;5921:20;;5477:470;-1:-1:-1;;;;5477:470:1:o;6160:488::-;-1:-1:-1;;;;;6429:15:1;;;6411:34;;6481:15;;6476:2;6461:18;;6454:43;6528:2;6513:18;;6506:34;;;6576:3;6571:2;6556:18;;6549:31;;;6354:4;;6597:45;;6622:19;;6614:6;6597:45;:::i;:::-;6589:53;6160:488;-1:-1:-1;;;;;;6160:488:1:o;6653:1172::-;7008:2;6997:9;6990:21;6971:4;7034:56;7086:2;7075:9;7071:18;7063:6;7034:56;:::i;:::-;7109:2;7159:9;7151:6;7147:22;7142:2;7131:9;7127:18;7120:50;7193:44;7230:6;7222;7193:44;:::i;:::-;7179:58;;7285:9;7277:6;7273:22;7268:2;7257:9;7253:18;7246:50;7316:6;7351;7345:13;7382:6;7374;7367:22;7417:2;7409:6;7405:15;7398:22;;7476:2;7466:6;7463:1;7459:14;7451:6;7447:27;7443:36;7514:2;7506:6;7502:15;7535:1;7545:251;7559:6;7556:1;7553:13;7545:251;;;7649:2;7645:7;7636:6;7628;7624:19;7620:33;7615:3;7608:46;7677:39;7709:6;7700;7694:13;7677:39;:::i;:::-;7774:12;;;;7667:49;-1:-1:-1;7739:15:1;;;;7581:1;7574:9;7545:251;;;-1:-1:-1;7813:6:1;;6653:1172;-1:-1:-1;;;;;;;;;;6653:1172:1:o;8022:219::-;8171:2;8160:9;8153:21;8134:4;8191:44;8231:2;8220:9;8216:18;8208:6;8191:44;:::i;8582:339::-;8784:2;8766:21;;;8823:2;8803:18;;;8796:30;-1:-1:-1;;;8857:2:1;8842:18;;8835:45;8912:2;8897:18;;8582:339::o;9338:414::-;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;9618:34;9613:2;9598:18;;9591:62;-1:-1:-1;;;9684:2:1;9669:18;;9662:48;9742:3;9727:19;;9338:414::o;15473:356::-;15675:2;15657:21;;;15694:18;;;15687:30;15753:34;15748:2;15733:18;;15726:62;15820:2;15805:18;;15473:356::o;17821:413::-;18023:2;18005:21;;;18062:2;18042:18;;;18035:30;18101:34;18096:2;18081:18;;18074:62;-1:-1:-1;;;18167:2:1;18152:18;;18145:47;18224:3;18209:19;;17821:413::o;20732:565::-;20923:2;20912:9;20905:21;20886:4;20961:6;20955:13;21004:4;20999:2;20988:9;20984:18;20977:32;21032:62;21090:2;21079:9;21075:18;21061:12;21032:62;:::i;:::-;21018:76;;21143:2;21135:6;21131:15;21125:22;21217:2;21213:7;21201:9;21193:6;21189:22;21185:36;21178:4;21167:9;21163:20;21156:66;21239:52;21284:6;21268:14;21239:52;:::i;:::-;21231:60;20732:565;-1:-1:-1;;;;;20732:565:1:o;21484:128::-;21524:3;21555:1;21551:6;21548:1;21545:13;21542:39;;;21561:18;;:::i;:::-;-1:-1:-1;21597:9:1;;21484:128::o;21617:120::-;21657:1;21683;21673:35;;21688:18;;:::i;:::-;-1:-1:-1;21722:9:1;;21617:120::o;21742:168::-;21782:7;21848:1;21844;21840:6;21836:14;21833:1;21830:21;21825:1;21818:9;21811:17;21807:45;21804:71;;;21855:18;;:::i;:::-;-1:-1:-1;21895:9:1;;21742:168::o;21915:125::-;21955:4;21983:1;21980;21977:8;21974:34;;;21988:18;;:::i;:::-;-1:-1:-1;22025:9:1;;21915:125::o;22045:258::-;22117:1;22127:113;22141:6;22138:1;22135:13;22127:113;;;22217:11;;;22211:18;22198:11;;;22191:39;22163:2;22156:10;22127:113;;;22258:6;22255:1;22252:13;22249:48;;;-1:-1:-1;;22293:1:1;22275:16;;22268:27;22045:258::o;22308:380::-;22387:1;22383:12;;;;22430;;;22451:61;;22505:4;22497:6;22493:17;22483:27;;22451:61;22558:2;22550:6;22547:14;22527:18;22524:38;22521:161;;;22604:10;22599:3;22595:20;22592:1;22585:31;22639:4;22636:1;22629:15;22667:4;22664:1;22657:15;22521:161;;22308:380;;;:::o;22693:135::-;22732:3;-1:-1:-1;;22753:17:1;;22750:43;;;22773:18;;:::i;:::-;-1:-1:-1;22820:1:1;22809:13;;22693:135::o;22833:112::-;22865:1;22891;22881:35;;22896:18;;:::i;:::-;-1:-1:-1;22930:9:1;;22833:112::o;22950:127::-;23011:10;23006:3;23002:20;22999:1;22992:31;23042:4;23039:1;23032:15;23066:4;23063:1;23056:15;23082:127;23143:10;23138:3;23134:20;23131:1;23124:31;23174:4;23171:1;23164:15;23198:4;23195:1;23188:15;23214:127;23275:10;23270:3;23266:20;23263:1;23256:31;23306:4;23303:1;23296:15;23330:4;23327:1;23320:15;23346:127;23407:10;23402:3;23398:20;23395:1;23388:31;23438:4;23435:1;23428:15;23462:4;23459:1;23452:15;23478:127;23539:10;23534:3;23530:20;23527:1;23520:31;23570:4;23567:1;23560:15;23594:4;23591:1;23584:15;23610:127;23671:10;23666:3;23662:20;23659:1;23652:31;23702:4;23699:1;23692:15;23726:4;23723:1;23716:15;23742:131;-1:-1:-1;;;;;23817:31:1;;23807:42;;23797:70;;23863:1;23860;23853:12;23797:70;23742:131;:::o;23878:::-;-1:-1:-1;;;;;;23952:32:1;;23942:43;;23932:71;;23999:1;23996;23989:12
Swarm Source
ipfs://3c207012999a8152c44b7e5222920d45f9574384dd110cc82711841f3111f4d7
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.