ERC-721
Overview
Max Total Supply
91 OWLETS
Holders
41
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
3 OWLETSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
AdvTokenNFT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-01-05 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI, ".json")); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString(), ".json")); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 || ERC721.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 _tokenOwners.contains(tokenId); } /** * @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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function mint(address to, uint256 amount) external returns (bool); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.7.0; pragma abicoder v2; contract AdvTokenNFT is ERC721, Ownable { using SafeMath for uint256; using Strings for uint256; string public PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN TOKENS ARE ALL SOLD OUT string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE uint256 public constant tokenPrice = 300000000000000000; // 0.3 MOVR uint public constant maxTokenPurchase = 5; uint256 public constant MAX_TOKENS = 1000; bool public saleIsActive = false; struct attributes { string name; uint level; uint pets; uint battlesWon; uint health; uint strength; uint defense; uint speed; uint luck; uint xp; uint log; uint lastRewardBlock; } mapping(uint256 => attributes) public attrIndex; // Reserve 256 for team - Giveaways/Prizes etc uint public tokenReserve = 0; event nameChange(address _by, uint _tokenId, string _name); event licenseisLocked(string _licenseText); event erc20Minted(address _by, uint amount); event sentAdventuring(address _by, uint tokenIndex); event levelUpToken(address _by, uint tokenIndex); event tokenPet(address _by, uint tokenIndex); event tokenCreated(uint tokenIndex); IERC20 public erc20 = IERC20(0x000000000000000000000000000000000000dEaD); address public deadAddress = 0x000000000000000000000000000000000000dEaD; uint luckDigits = 4; uint luckModulus = 10 ** luckDigits; uint public cumulativeLevel = 0; uint public mintingRate = 10000; uint public feeMul = 1; uint constant xp_per_day = 250e18; uint constant DAY = 1 days; // Low Res Base URI string private _baseURI; // High Res Base URI string private _hBaseURI; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; address private _battleground = owner(); modifier onlyBattleground() { require(battleground() == _msgSender(), "Ownable: caller is not the owner"); _; } constructor() ERC721("Moon Owlets", "OWLETS") { } function withdraw() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } function admin_seterc20(address newERC20) public onlyOwner { erc20 = IERC20(newERC20); } function admin_reserve(address _to, uint256 _reserveAmount) public onlyOwner { uint supply = totalSupply(); require(_reserveAmount > 0 && _reserveAmount <= tokenReserve, "Not enough reserve left for team"); for (uint i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } tokenReserve = tokenReserve.sub(_reserveAmount); } function admin_setProvenanceHash(string memory provenanceHash) public onlyOwner { PROVENANCE = provenanceHash; } function admin_setLowBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function admin_setHighBaseURI(string memory newhBaseURI) public onlyOwner { _hBaseURI = newhBaseURI; } function hBaseURI() public view virtual returns (string memory) { return _hBaseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory base = baseURI(); string memory hBase = hBaseURI(); // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. if (attrIndex[tokenId].level >= 3){ return string(abi.encodePacked(hBase, tokenId.toString())); } else { return string(abi.encodePacked(base, tokenId.toString())); } } function admin_flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function battleground() public view virtual returns (address) { return _battleground; } function admin_setBattleground(address newBattleground) public onlyOwner { _battleground = newBattleground; } function resetPets(uint tokenIndex, uint newPets) external onlyBattleground { attrIndex[tokenIndex].pets = newPets; } function wonBattle(uint tokenIndex) external onlyBattleground { attrIndex[tokenIndex].battlesWon = attrIndex[tokenIndex].battlesWon.add(1); } function resetXP(uint tokenIndex, uint newXP) external onlyBattleground { attrIndex[tokenIndex].xp = newXP; } function minterc20(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(attrIndex[tokenId].level >= 3, "Level must be at least 3 to claim!"); uint reward = mintingRate.mul((getMultiplier(attrIndex[tokenId].lastRewardBlock, block.number)).mul(attrIndex[tokenId].luck).mul(attrIndex[tokenId].level)).div(cumulativeLevel); attrIndex[tokenId].lastRewardBlock = block.number; erc20.mint(msg.sender, reward); emit erc20Minted(msg.sender, reward); } //For the front-end function viewOwedTokens(uint tokenId) public view returns (uint) { return mintingRate.mul((getMultiplier(attrIndex[tokenId].lastRewardBlock, block.number)).mul(attrIndex[tokenId].luck).mul(attrIndex[tokenId].level)).div(cumulativeLevel); } function burn(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); uint reward = mintingRate.mul(2000000000000000000); erc20.mint(msg.sender, reward); emit erc20Minted(msg.sender, reward); _burn(tokenId); } function xp_required(uint curent_level) public pure returns (uint xp_to_next_level) { xp_to_next_level = curent_level * 1000e18; for (uint i = 1; i < curent_level; i++) { xp_to_next_level += i * 1000e18; } } function adventure(uint tokenIndex) external { require(_isApprovedOrOwner(msg.sender, tokenIndex)); require(block.timestamp > attrIndex[tokenIndex].log); attrIndex[tokenIndex].log = block.timestamp.add(DAY); attrIndex[tokenIndex].xp += xp_per_day; emit sentAdventuring(msg.sender, tokenIndex); } function levelUptoken(uint tokenId) public { require(ownerOf(tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(attrIndex[tokenId].level <= 9, "token already max level!"); require(erc20.balanceOf(address(msg.sender)) >= feeMul.mul(50000000000000000000).mul(attrIndex[tokenId].level), "You don't have enough tokens."); uint _xp_required = xp_required(attrIndex[tokenId].level); require(attrIndex[tokenId].xp >= _xp_required, "Need more XP!"); uint levelUpFee = feeMul.mul(1000000000).mul(attrIndex[tokenId].level); uint256 allowance = erc20.allowance(msg.sender, address(this)); require(allowance >= levelUpFee, "Check the token allowance"); erc20.transferFrom(msg.sender, address(this), levelUpFee); attrIndex[tokenId].xp -= _xp_required; attrIndex[tokenId].level = attrIndex[tokenId].level.add(1); //Burn whatever we got uint burnAmount = erc20.balanceOf(address(this)); erc20.transfer(deadAddress, burnAmount); emit levelUpToken(msg.sender, tokenId); } function petToken(uint tokenId) public { require(attrIndex[tokenId].pets <= 25, "Can't be pet beyond 10!"); if(attrIndex[tokenId].pets >= 1){ require(erc20.balanceOf(address(msg.sender)) >= feeMul.mul(5000000000000000000).mul(attrIndex[tokenId].pets), "You don't have enough erc20."); uint petUpFee = feeMul.mul(5000000000000000000).mul(attrIndex[tokenId].pets); uint256 allowance = erc20.allowance(msg.sender, address(this)); require(allowance >= petUpFee, string(abi.encodePacked("Check the token allowance:",erc20.allowance(msg.sender, address(this))," , ",petUpFee))); erc20.transferFrom(msg.sender, address(this), petUpFee); uint burnAmount = erc20.balanceOf(address(this)); erc20.transfer(deadAddress, burnAmount); } attrIndex[tokenId].pets = attrIndex[tokenId].pets.add(1); emit tokenPet(msg.sender, tokenId); } function admin_setFeeMul(uint newFee) public onlyOwner { feeMul = newFee; } function admin_setMintingRate(uint newMintingRate) public onlyOwner { mintingRate = newMintingRate; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Returns the license for tokens function tokenLicense(uint _id) public view returns(string memory) { require(_id < totalSupply(), "CHOOSE A token WITHIN RANGE"); return LICENSE_TEXT; } // Locks the license to prevent further changes function admin_lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } // Change the license function admin_changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked"); LICENSE_TEXT = _license; } function mintToken(uint numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint token"); require(numberOfTokens > 0 && numberOfTokens <= maxTokenPurchase, "Can only mint 5 tokens at a time"); require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply of tokens"); require(msg.value >= tokenPrice.mul(numberOfTokens), "Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply() +1; if (totalSupply() < MAX_TOKENS) { attrIndex[totalSupply()].level = 1; attrIndex[totalSupply()].pets = 0; attrIndex[totalSupply()].battlesWon = 0; attrIndex[totalSupply()].log = block.timestamp; attrIndex[totalSupply()].lastRewardBlock = block.number; attrIndex[totalSupply()].health = generateRandom(totalSupply().mul(128)); attrIndex[totalSupply()].strength = generateRandom(totalSupply().mul(25)); attrIndex[totalSupply()].defense = generateRandom(totalSupply().mul(420)); attrIndex[totalSupply()].speed = generateRandom(totalSupply().mul(69)); attrIndex[totalSupply()].luck = generateRandom(totalSupply().mul(10)); cumulativeLevel = cumulativeLevel.add(1); _safeMint(msg.sender, mintIndex); emit tokenCreated(mintIndex); } } } function generateRandom(uint mintIndex) internal view returns(uint){ uint blockDna = mintIndex.mul(block.number); uint rand = uint(keccak256(abi.encodePacked(blockDna))); return rand % luckModulus; } function viewTokenBattleStats(uint mintIndex) public view returns (uint, uint, uint, uint, uint) { require(mintIndex >= 0, "Please choose a token within valid range."); require(mintIndex <= totalSupply(), "Token hasn't been minted yet!"); return (attrIndex[mintIndex].health.add((attrIndex[mintIndex].pets).mul(attrIndex[mintIndex].level).mul(4)), attrIndex[mintIndex].strength.add((attrIndex[mintIndex].pets.mul(attrIndex[mintIndex].level).mul(4))), attrIndex[mintIndex].defense.add((attrIndex[mintIndex].pets.mul(attrIndex[mintIndex].level).mul(4))), attrIndex[mintIndex].speed, attrIndex[mintIndex].luck); } function changeTokenName(uint _tokenId, string memory _name) public { require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this token!"); require(sha256(bytes(_name)) != sha256(bytes(attrIndex[_tokenId].name)), "New name is same as the current one"); attrIndex[_tokenId].name = _name; emit nameChange(msg.sender, _tokenId, _name); } function viewTokenName(uint _tokenId) public view returns( string memory ){ require( _tokenId < totalSupply(), "Choose a token within range" ); if(attrIndex[_tokenId].level <= 2){ return attrIndex[_tokenId].name; } if(attrIndex[_tokenId].level == 3){ string[1] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name)); return output; } if(attrIndex[_tokenId].level <= 5){ string[2] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name , ', ', name[1])); return output; } if(attrIndex[_tokenId].level <= 7){ string[3] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; name[2] = suffixes[attrIndex[_tokenId].luck % suffixes.length]; string memory output = string(abi.encodePacked(name[0], ' ', attrIndex[_tokenId].name , ', ', name[1], ' ', name[2])); return output; } else { string[4] memory name; name[0] = namePreffixes[attrIndex[_tokenId].luck % namePreffixes.length]; name[1] = prefixes[attrIndex[_tokenId].luck % prefixes.length]; name[2] = suffixes[attrIndex[_tokenId].luck % suffixes.length]; name[3] = prePrefixes[attrIndex[_tokenId].luck % prePrefixes.length]; string memory output = string(abi.encodePacked(name[3], '-', name[0], ' ', attrIndex[_tokenId].name , ', ', name[1], ' ', name[2] )); return output; } } function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } string[] private prePrefixes = [ "Bard", "Druid", "Sorcerer", "Wizard", "Loremaster", "Vermin Lord", "Silverstar", "Arcane", "Spelldancer", "Bane", "Void", "BlackFlame", "Beholder", "Incantatrix", "Bladesinger", "Diabolist", "Queen of the Wild", "Gold", "Silver", "Bronze", "Platinum", "Titanium" ]; string[] private namePreffixes = [ "Bane", "Root", "Bite", "Song", "Roar", "Grasp", "Instrument", "Glow", "Bender", "Shadow", "Whisper", "Shout", "Growl", "Tear", "Peak", "Form", "Sun", "Moon" ]; // Name string[] private prefixes = [ "Agony", "Apocalypse", "Armageddon", "Beast", "Behemoth", "Blight", "Blood", "Bramble", "Brimstone", "Brood", "Carrion", "Cataclysm", "Chimeric", "Corpse", "Corruption", "Damnation", "Death", "Demon", "Dire", "Dragon", "Dread", "Doom", "Dusk", "Eagle", "Empyrean", "Fate", "Foe", "Gale", "Ghoul", "Gloom", "Glyph", "Golem", "Grim", "Hate", "Havoc", "Honour", "Horror", "Hypnotic", "Kraken", "Loath", "Maelstrom", "Mind", "Miracle", "Morbid", "Oblivion", "Onslaught", "Pain", "Pandemonium", "Phoenix", "Plague", "Rage", "Rapture", "Rune", "Skull", "Sol", "Soul", "Sorrow", "Spirit", "Storm", "Tempest", "Torment", "Vengeance", "Victory", "Viper", "Vortex", "Woe", "Wrath", "Light's", "Shimmering" ]; string[] private suffixes = [ "of Power", "of Giants", "of Titans", "of Skill", "of Perfection", "of Brilliance", "of Enlightenment", "of Protection", "of Anger", "of Rage", "of Fury", "of Vitriol", "of the Fox", "of Detection", "of Reflection", "of the Twins" ]; }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"erc20Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"levelUpToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"nameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"sentAdventuring","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"tokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"tokenPet","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"admin_changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"admin_reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBattleground","type":"address"}],"name":"admin_setBattleground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"admin_setFeeMul","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newhBaseURI","type":"string"}],"name":"admin_setHighBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"admin_setLowBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingRate","type":"uint256"}],"name":"admin_setMintingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"admin_setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newERC20","type":"address"}],"name":"admin_seterc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"adventure","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":"uint256","name":"","type":"uint256"}],"name":"attrIndex","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"pets","type":"uint256"},{"internalType":"uint256","name":"battlesWon","type":"uint256"},{"internalType":"uint256","name":"health","type":"uint256"},{"internalType":"uint256","name":"strength","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"luck","type":"uint256"},{"internalType":"uint256","name":"xp","type":"uint256"},{"internalType":"uint256","name":"log","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"battleground","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cumulativeLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMul","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hBaseURI","outputs":[{"internalType":"string","name":"","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"levelUptoken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"petToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"internalType":"uint256","name":"newPets","type":"uint256"}],"name":"resetPets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"internalType":"uint256","name":"newXP","type":"uint256"}],"name":"resetXP","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserve","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"viewOwedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"}],"name":"viewTokenBattleStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewTokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"wonBattle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curent_level","type":"uint256"}],"name":"xp_required","outputs":[{"internalType":"uint256","name":"xp_to_next_level","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600b9162001248565b506040805160208101918290526000908190526200003c91600c9162001248565b50600d805461ffff191690556000600f8190556010805461dead6001600160a01b0319918216811790925560118054909116909117905560046012556127106013819055601491909155601555600160165562000098620011da565b601a80546001600160a01b0319166001600160a01b0392909216919091179055604080516103008101825260046102c082018181526310985c9960e21b6102e08401528252825180840184526005815264111c9d5a5960da1b602080830191909152808401919091528351808501855260088082526729b7b931b2b932b960c11b82840152848601919091528451808601865260068082526515da5e985c9960d21b82850152606086019190915285518087018752600a808252692637b932b6b0b9ba32b960b11b82860152608087019190915286518088018852600b8082526a15995c9b5a5b88131bdc9960aa1b8287015260a0880191909152875180890189528281526929b4b63b32b939ba30b960b11b8187015260c08801528751808901895283815265417263616e6560d01b8187015260e0880152875180890189528181526a29b832b6363230b731b2b960a91b81870152610100880152875180890189528681526342616e6560e01b818701526101208801528751808901895286815263159bda5960e21b818701526101408801528751808901895291825269426c61636b466c616d6560b01b8286015261016087019190915286518088018852838152672132b437b63232b960c11b81860152610180870152865180880188528181526a092dcc6c2dce8c2e8e4d2f60ab1b818601526101a0870152865180880188529081526a213630b232b9b4b733b2b960a91b818501526101c0860152855180870187526009815268111a58589bdb1a5cdd60ba1b818501526101e0860152855180870187526011815270145d59595b881bd9881d1a194815da5b19607a1b81850152610200860152855180870187529384526311dbdb1960e21b84840152610220850193909352845180860186528381526529b4b63b32b960d11b81840152610240850152845180860186529283526542726f6e7a6560d01b838301526102608401929092528351808501855282815267506c6174696e756d60c01b81830152610280840152835180850190945290835267546974616e69756d60c01b908301526102a0810191909152620003b590601b906016620012dd565b506040805161028081018252600461024082018181526342616e6560e01b61026084015282528251808401845281815263149bdbdd60e21b6020828101919091528084019190915283518085018552828152634269746560e01b81830152838501528351808501855282815263536f6e6760e01b81830152606084015283518085018552828152632937b0b960e11b81830152608084015283518085018552600580825264047726173760dc1b8284015260a085019190915284518086018652600a815269125b9cdd1c9d5b595b9d60b21b8184015260c08501528451808601865283815263476c6f7760e01b8184015260e0850152845180860186526006808252652132b73232b960d11b828501526101008601919091528551808701875290815265536861646f7760d01b818401526101208501528451808601865260078152662bb434b9b832b960c91b81840152610140850152845180860186528181526414da1bdd5d60da1b81840152610160850152845180860186529081526411dc9bdddb60da1b8183015261018084015283518085018552828152632a32b0b960e11b818301526101a084015283518085018552828152635065616b60e01b818301526101c08401528351808501855282815263466f726d60e01b818301526101e084015283518085018552600381526229bab760e91b8183015261020084015283518085019094529083526326b7b7b760e11b90830152610220810191909152620005e690601c9060126200133d565b50604080516108e08101825260056108a082018181526441676f6e7960d81b6108c0840152825282518084018452600a8082526941706f63616c7970736560b01b60208381019190915280850192909252845180860186528181526920b936b0b3b2b23237b760b11b818401528486015284518086018652838152641099585cdd60da1b81840152606085015284518086018652600880825267084cad0cadadee8d60c31b82850152608086019190915285518087018752600680825265109b1a59da1d60d21b8286015260a08701919091528651808801885285815264109b1bdbd960da1b8186015260c0870152865180880188526007808252664272616d626c6560c81b8287015260e0880191909152875180890189526009808252684272696d73746f6e6560b81b828801526101008901919091528851808a018a5287815264109c9bdbd960da1b818801526101208901528851808a018a528281526621b0b93934b7b760c91b818801526101408901528851808a018a528181526843617461636c79736d60b81b818801526101608901528851808a018a52848152674368696d6572696360c01b818801526101808901528851808a018a5283815265436f7270736560d01b818801526101a08901528851808a018a528581526921b7b9393ab83a34b7b760b11b818801526101c08901528851808a018a52818152682230b6b730ba34b7b760b91b818801526101e08901528851808a018a5287815264088cac2e8d60db1b818801526102008901528851808a018a52878152642232b6b7b760d91b818801526102208901528851808a018a526004808252634469726560e01b828901526102408a01919091528951808b018b5284815265223930b3b7b760d11b818901526102608a01528951808b018b5288815264111c99585960da1b818901526102808a01528951808b018b5281815263446f6f6d60e01b818901526102a08a01528951808b018b52818152634475736b60e01b818901526102c08a01528951808b018b52888152644561676c6560d81b818901526102e08a01528951808b018b528581526722b6b83cb932b0b760c11b818901526103008a01528951808b018b52818152634661746560e01b818901526103208a01528951808b018b52600380825262466f6560e81b828a01526103408b01919091528a51808c018c528281526347616c6560e01b818a01526103608b01528a51808c018c528981526411da1bdd5b60da1b818a01526103808b01528a51808c018c5289815264476c6f6f6d60d81b818a01526103a08b01528a51808c018c528981526408ed8f2e0d60db1b818a01526103c08b01528a51808c018c5289815264476f6c656d60d81b818a01526103e08b01528a51808c018c52828152634772696d60e01b818a01526104008b01528a51808c018c52828152634861746560e01b818a01526104208b01528a51808c018c52898152644861766f6360d81b818a01526104408b01528a51808c018c52858152652437b737bab960d11b818a01526104608b01528a51808c018c52858152652437b93937b960d11b818a01526104808b01528a51808c018c52868152674879706e6f74696360c01b818a01526104a08b01528a51808c018c528581526525b930b5b2b760d11b818a01526104c08b01528a51808c018c5289815264098dec2e8d60db1b818a01526104e08b01528a51808c018c52838152684d61656c7374726f6d60b81b818a01526105008b01528a51808c018c5282815263135a5b9960e21b818a01526105208b01528a51808c018c52848152664d697261636c6560c81b818a01526105408b01528a51808c018c5285815265135bdc989a5960d21b818a01526105608b01528a51808c018c529586526727b13634bb34b7b760c11b868901526105808a01959095528951808b018b528281526813db9cdb185d59da1d60ba1b818901526105a08a01528951808b018b52818152632830b4b760e11b818901526105c08a01528951808b018b52600b81526a50616e64656d6f6e69756d60a81b818901526105e08a01528951808b018b52838152660a0d0decadcd2f60cb1b818901526106008a01528951808b018b5284815265506c6167756560d01b818901526106208a01528951808b018b52818152635261676560e01b818901526106408a01528951808b018b52838152665261707475726560c81b818901526106608a01528951808b018b528181526352756e6560e01b818901526106808a01528951808b018b528881526414dadd5b1b60da1b818901526106a08a01528951808b018b528581526214dbdb60ea1b818901526106c08a01528951808b018b529081526314dbdd5b60e21b818801526106e08901528851808a018a5283815265536f72726f7760d01b818801526107008901528851808a018a528381526514dc1a5c9a5d60d21b818801526107208901528851808a018a528781526453746f726d60d81b818801526107408901528851808a018a528281526615195b5c195cdd60ca1b818801526107608901528851808a018a5282815266151bdc9b595b9d60ca1b818801526107808901528851808a018a529081526856656e6765616e636560b81b818701526107a08801528751808901895281815266566963746f727960c81b818701526107c088015287518089018952868152642b34b832b960d91b818701526107e088015287518089018952918252650acdee4e8caf60d31b828601526108008701919091528651808801885291825262576f6560e81b8285015261082086019190915285518087018752938452640aee4c2e8d60db1b8484015261084085019390935284518086018652928352664c69676874277360c81b838301526108608401929092528351808501909452908352695368696d6d6572696e6760b01b9083015261088081019190915262000e5090601d9060456200138f565b506040805161024081018252600861020082018181526737b3102837bbb2b960c11b6102208401528252825180840184526009808252686f66204769616e747360b81b6020838101919091528085019290925284518086018652908152686f6620546974616e7360b81b818301528385015283518085018552828152671bd98814dada5b1b60c21b81830152606084015283518085018552600d8082526c37b3102832b93332b1ba34b7b760991b828401526080850191909152845180860186528181526c6f66204272696c6c69616e636560981b8184015260a08501528451808601865260108082526f1bd988115b9b1a59da1d195b9b595b9d60821b8285015260c0860191909152855180870187528281526c37b310283937ba32b1ba34b7b760991b8185015260e0860152855180870187529384526737b31020b733b2b960c11b84840152610100850193909352845180860186526007808252666f66205261676560c81b8285015261012086019190915285518087018752908152666f66204675727960c81b8184015261014085015284518086018652600a808252691bd988159a5d1c9a5bdb60b21b8285015261016086019190915285518087018752908152690decc40e8d0ca408cdef60b31b8184015261018085015284518086018652600c8082526b37b3102232ba32b1ba34b7b760a11b828501526101a0860191909152855180870187529182526c37b3102932b33632b1ba34b7b760991b828401526101c0850191909152845180860190955284526b6f6620746865205477696e7360a01b908401526101e0820192909252620010b491601e9190620013e1565b50348015620010c257600080fd5b50604080518082018252600b81526a4d6f6f6e204f776c65747360a81b602080830191909152825180840190935260068352654f574c45545360d01b9083015290620011156301ffc9a760e01b620011e9565b81516200112a90600690602085019062001248565b5080516200114090600790602084019062001248565b50620011536380ac58cd60e01b620011e9565b62001165635b5e139f60e01b620011e9565b6200117763780e9d6360e01b620011e9565b50600090506200118662001244565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620014ed565b600a546001600160a01b031690565b6001600160e01b031980821614156200121f5760405162461bcd60e51b81526004016200121690620014b6565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620012805760008555620012cb565b82601f106200129b57805160ff1916838001178555620012cb565b82800160010185558215620012cb579182015b82811115620012cb578251825591602001919060010190620012ae565b50620012d992915062001433565b5090565b8280548282559060005260206000209081019282156200132f579160200282015b828111156200132f57825180516200131e91849160209091019062001248565b5091602001919060010190620012fe565b50620012d99291506200144a565b8280548282559060005260206000209081019282156200132f579160200282015b828111156200132f57825180516200137e91849160209091019062001248565b50916020019190600101906200135e565b8280548282559060005260206000209081019282156200132f579160200282015b828111156200132f5782518051620013d091849160209091019062001248565b5091602001919060010190620013b0565b8280548282559060005260206000209081019282156200132f579160200282015b828111156200132f57825180516200142291849160209091019062001248565b509160200191906001019062001402565b5b80821115620012d9576000815560010162001434565b80821115620012d95760006200146182826200146b565b506001016200144a565b50805460018160011615610100020316600290046000825580601f10620014935750620014b3565b601f016020900490600052602060002090810190620014b3919062001433565b50565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6158b580620014fd6000396000f3fe6080604052600436106103c35760003560e01c80637ff9b596116101f2578063c634d0321161010d578063ef3efe67116100a0578063f84b40dc1161006f578063f84b40dc14610abe578063f86aa6bd14610ade578063fa5c20f914610af3578063fc667b3314610b13576103c3565b8063ef3efe6714610a49578063f2fde38b14610a69578063f47c84c514610a89578063f741251d14610a9e576103c3565b8063d9b137b2116100dc578063d9b137b2146109d4578063ddb9657c146109f4578063e985e9c514610a14578063eb8d244414610a34576103c3565b8063c634d0321461096c578063c87b56dd1461097f578063cbcb31711461099f578063d84fedd3146109b4576103c3565b80639f7ff88911610185578063aca10be311610154578063aca10be3146108db578063b00b52f1146108fb578063b88d4fde1461091b578063c38fdbbf1461093b576103c3565b80639f7ff88914610871578063a12a494b14610886578063a1b43c54146108a6578063a22cb465146108bb576103c3565b80638dbb1e3a116101c15780638dbb1e3a1461080757806395d89b41146108275780639be6ab9d1461083c5780639c3e72bd1461085c576103c3565b80637ff9b59614610790578063843ac051146107a55780638462151c146107c55780638da5cb5b146107f2576103c3565b806342842e0e116102e257806356ddea0a1161027557806370a082311161024457806370a0823114610726578063715018a614610746578063785e9e861461075b5780637a2b753d14610770576103c3565b806356ddea0a146106c75780636352211e146106dc5780636373a6b1146106fc5780636c0360eb14610711576103c3565b80634f6ccce7116102b15780634f6ccce71461065d57806353e1a7a01461067d578063542766ed146106925780635501c671146106b2576103c3565b806342842e0e146105e857806342966c681461060857806344cd4cec1461062857806348c5c00b14610648576103c3565b806323b872dd1161035a5780633c6444f6116103295780633c6444f6146105735780633ccfd60b146105935780633ce21c8e146105a85780633cfcccc1146105c8576103c3565b806323b872dd146104fe57806327c8f8351461051e5780632f745c59146105335780633228a48814610553576103c3565b806309aa3dcf1161039657806309aa3dcf1461046f57806318160ddd1461049157806318f5de38146104a65780631cc3a162146104de576103c3565b806301ffc9a7146103c857806306fdde03146103fe578063081812fc14610420578063095ea7b31461044d575b600080fd5b3480156103d457600080fd5b506103e86103e33660046147c1565b610b33565b6040516103f59190614c88565b60405180910390f35b34801561040a57600080fd5b50610413610b56565b6040516103f59190614c93565b34801561042c57600080fd5b5061044061043b36600461482c565b610bec565b6040516103f59190614b75565b34801561045957600080fd5b5061046d610468366004614764565b610c38565b005b34801561047b57600080fd5b50610484610cd0565b6040516103f59190614b6c565b34801561049d57600080fd5b50610484610cd5565b3480156104b257600080fd5b506104c66104c136600461482c565b610ce6565b6040516103f59c9b9a99989796959493929190614ca6565b3480156104ea57600080fd5b5061046d6104f936600461482c565b610dc9565b34801561050a57600080fd5b5061046d61051936600461467a565b610f58565b34801561052a57600080fd5b50610440610f90565b34801561053f57600080fd5b5061048461054e366004614764565b610f9f565b34801561055f57600080fd5b5061046d61056e36600461482c565b610fca565b34801561057f57600080fd5b5061046d61058e3660046147f9565b611463565b34801561059f57600080fd5b5061046d6114b9565b3480156105b457600080fd5b5061046d6105c3366004614889565b611527565b3480156105d457600080fd5b5061046d6105e336600461482c565b61157b565b3480156105f457600080fd5b5061046d61060336600461467a565b6119d8565b34801561061457600080fd5b5061046d61062336600461482c565b6119f3565b34801561063457600080fd5b5061046d61064336600461462e565b611b03565b34801561065457600080fd5b50610484611b64565b34801561066957600080fd5b5061048461067836600461482c565b611b6a565b34801561068957600080fd5b50610484611b80565b34801561069e57600080fd5b5061046d6106ad3660046147f9565b611b86565b3480156106be57600080fd5b5061046d611bfb565b3480156106d357600080fd5b50610440611c57565b3480156106e857600080fd5b506104406106f736600461482c565b611c66565b34801561070857600080fd5b50610413611c8e565b34801561071d57600080fd5b50610413611d1c565b34801561073257600080fd5b5061048461074136600461462e565b611d7d565b34801561075257600080fd5b5061046d611dc6565b34801561076757600080fd5b50610440611e4f565b34801561077c57600080fd5b5061048461078b36600461482c565b611e5e565b34801561079c57600080fd5b50610484611e9d565b3480156107b157600080fd5b5061046d6107c036600461482c565b611ea9565b3480156107d157600080fd5b506107e56107e036600461462e565b611eed565b6040516103f59190614c44565b3480156107fe57600080fd5b50610440611fa1565b34801561081357600080fd5b50610484610822366004614889565b611fb0565b34801561083357600080fd5b50610413611fbc565b34801561084857600080fd5b5061046d61085736600461482c565b61201d565b34801561086857600080fd5b50610413612061565b34801561087d57600080fd5b506104846120bc565b34801561089257600080fd5b5061046d6108a13660046147f9565b6120c2565b3480156108b257600080fd5b5061041361210d565b3480156108c757600080fd5b5061046d6108d636600461472e565b61216e565b3480156108e757600080fd5b506104846108f636600461482c565b61223c565b34801561090757600080fd5b5061046d61091636600461482c565b61226c565b34801561092757600080fd5b5061046d6109363660046146b5565b612305565b34801561094757600080fd5b5061095b61095636600461482c565b612344565b6040516103f59594939291906157a5565b61046d61097a36600461482c565b61246d565b34801561098b57600080fd5b5061041361099a36600461482c565b61274e565b3480156109ab57600080fd5b506104846127e4565b3480156109c057600080fd5b506104136109cf36600461482c565b6127ea565b3480156109e057600080fd5b506104136109ef36600461482c565b613257565b348015610a0057600080fd5b5061046d610a0f366004614764565b613311565b348015610a2057600080fd5b506103e8610a2f366004614648565b6133bf565b348015610a4057600080fd5b506103e86133ed565b348015610a5557600080fd5b5061046d610a6436600461482c565b6133fb565b348015610a7557600080fd5b5061046d610a8436600461462e565b61346c565b348015610a9557600080fd5b5061048461352d565b348015610aaa57600080fd5b5061046d610ab9366004614889565b613533565b348015610aca57600080fd5b5061046d610ad9366004614844565b613587565b348015610aea57600080fd5b5061046d6136d6565b348015610aff57600080fd5b5061046d610b0e36600461462e565b61375d565b348015610b1f57600080fd5b5061046d610b2e3660046147f9565b6137be565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b820191906000526020600020905b815481529060010190602001808311610bc557829003601f168201915b5050505050905090565b6000610bf782613810565b610c1c5760405162461bcd60e51b8152600401610c139061543c565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c4382611c66565b9050806001600160a01b0316836001600160a01b03161415610c775760405162461bcd60e51b8152600401610c1390615606565b806001600160a01b0316610c8961381d565b6001600160a01b03161480610ca55750610ca581610a2f61381d565b610cc15760405162461bcd60e51b8152600401610c13906151ee565b610ccb8383613821565b505050565b600581565b6000610ce1600261388f565b905090565b600e6020908152600091825260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909291839190830182828015610d7d5780601f10610d5257610100808354040283529160200191610d7d565b820191906000526020600020905b815481529060010190602001808311610d6057829003601f168201915b50505050509080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b33610dd382611c66565b6001600160a01b031614610df95760405162461bcd60e51b8152600401610c13906156ff565b6000818152600e602052604090206001015460031115610e2b5760405162461bcd60e51b8152600401610c139061513e565b6014546000828152600e6020526040812060018101546008820154600b909201549293610e7f939092610e7992610e70929091610e6a91829043611fb0565b9061389a565b6015549061389a565b906138d4565b6000838152600e60205260409081902043600b9091015560105490516340c10f1960e01b81529192506001600160a01b0316906340c10f1990610ec89033908590600401614c04565b602060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a919061478d565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051610f4c929190614c04565b60405180910390a15050565b610f69610f6361381d565b82613906565b610f855760405162461bcd60e51b8152600401610c1390615677565b610ccb83838361398b565b6011546001600160a01b031681565b6001600160a01b0382166000908152600160205260408120610fc19083613a99565b90505b92915050565b6000818152600e602052604090206002015460191015610ffc5760405162461bcd60e51b8152600401610c1390615488565b6000818152600e60205260409020600201546001116113f4576000818152600e60205260409020600201546016546110419190610e6a90674563918244f4000061389a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190611071903390600401614b75565b60206040518083038186803b15801561108957600080fd5b505afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c191906147a9565b10156110df5760405162461bcd60e51b8152600401610c1390615747565b6000818152600e602052604081206002015460165461110b9190610e6a90674563918244f4000061389a565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e906111439033903090600401614b89565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119391906147a9565b601054604051636eb1769f60e11b815291925083831015916001600160a01b039091169063dd62ed3e906111cd9033903090600401614b89565b60206040518083038186803b1580156111e557600080fd5b505afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d91906147a9565b8360405160200161122f929190614b2a565b6040516020818303038152906040529061125c5760405162461bcd60e51b8152600401610c139190614c93565b506010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061129190339030908790600401614ba3565b602060405180830381600087803b1580156112ab57600080fd5b505af11580156112bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e3919061478d565b506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611315903090600401614b75565b60206040518083038186803b15801561132d57600080fd5b505afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136591906147a9565b60105460115460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261139d9216908590600401614c04565b602060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ef919061478d565b505050505b6000818152600e6020526040902060020154611411906001613aa5565b6000828152600e60205260409081902060020191909155517f1b434a086dd5f568dcf1cb1c9460656430e95f3bce11b6b7bc20798bd706e49a906114589033908490614c04565b60405180910390a150565b61146b61381d565b6001600160a01b031661147c611fa1565b6001600160a01b0316146114a25760405162461bcd60e51b8152600401610c13906154bf565b80516114b590600b90602084019061443f565b5050565b6114c161381d565b6001600160a01b03166114d2611fa1565b6001600160a01b0316146114f85760405162461bcd60e51b8152600401610c13906154bf565b6040514790339082156108fc029083906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b61152f61381d565b6001600160a01b0316611540611c57565b6001600160a01b0316146115665760405162461bcd60e51b8152600401610c13906154bf565b6000918252600e602052604090912060020155565b3361158582611c66565b6001600160a01b0316146115ab5760405162461bcd60e51b8152600401610c13906156ff565b6000818152600e6020526040902060010154600910156115dd5760405162461bcd60e51b8152600401610c13906153c4565b6000818152600e602052604090206001015460165461160a9190610e6a906802b5e3af16b188000061389a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a082319061163a903390600401614b75565b60206040518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a91906147a9565b10156116a85760405162461bcd60e51b8152600401610c1390615316565b6000818152600e60205260408120600101546116c39061223c565b6000838152600e60205260409020600901549091508111156116f75760405162461bcd60e51b8152600401610c139061577e565b6000828152600e602052604081206001015460165461171f9190610e6a90633b9aca0061389a565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e906117579033903090600401614b89565b60206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906147a9565b9050818110156117c95760405162461bcd60e51b8152600401610c139061524b565b6010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117fd90339030908790600401614ba3565b602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184f919061478d565b506000848152600e60205260409020600981018054859003905560019081015461187891613aa5565b6000858152600e60205260408082206001019290925560105491516370a0823160e01b815290916001600160a01b0316906370a08231906118bd903090600401614b75565b60206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906147a9565b60105460115460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926119459216908590600401614c04565b602060405180830381600087803b15801561195f57600080fd5b505af1158015611973573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611997919061478d565b507f63f93e9c49e6ef55ed1cf3b3915e6f71ac510f5d0d265c19d42cb43e789fec5433866040516119c9929190614c04565b60405180910390a15050505050565b610ccb83838360405180602001604052806000815250612305565b336119fd82611c66565b6001600160a01b031614611a235760405162461bcd60e51b8152600401610c13906156ff565b601554600090611a3b90671bc16d674ec8000061389a565b6010546040516340c10f1960e01b81529192506001600160a01b0316906340c10f1990611a6e9033908590600401614c04565b602060405180830381600087803b158015611a8857600080fd5b505af1158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac0919061478d565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051611af2929190614c04565b60405180910390a16114b582613aca565b611b0b61381d565b6001600160a01b0316611b1c611fa1565b6001600160a01b031614611b425760405162461bcd60e51b8152600401610c13906154bf565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b600080611b78600284613b97565b509392505050565b60165481565b611b8e61381d565b6001600160a01b0316611b9f611fa1565b6001600160a01b031614611bc55760405162461bcd60e51b8152600401610c13906154bf565b600d5460ff1615611be85760405162461bcd60e51b8152600401610c1390615647565b80516114b590600c90602084019061443f565b611c0361381d565b6001600160a01b0316611c14611fa1565b6001600160a01b031614611c3a5760405162461bcd60e51b8152600401610c13906154bf565b600d805461ff001981166101009182900460ff1615909102179055565b601a546001600160a01b031690565b6000610fc4826040518060600160405280602981526020016158576029913960029190613bb3565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d145780601f10611ce957610100808354040283529160200191611d14565b820191906000526020600020905b815481529060010190602001808311611cf757829003601f168201915b505050505081565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b60006001600160a01b038216611da55760405162461bcd60e51b8152600401610c1390615282565b6001600160a01b0382166000908152600160205260409020610fc49061388f565b611dce61381d565b6001600160a01b0316611ddf611fa1565b6001600160a01b031614611e055760405162461bcd60e51b8152600401610c13906154bf565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6010546001600160a01b031681565b6014546000828152600e6020526040812060018101546008820154600b909201549293610fc4939092610e7992610e70929091610e6a91829043611fb0565b670429d069189e000081565b611eb161381d565b6001600160a01b0316611ec2611fa1565b6001600160a01b031614611ee85760405162461bcd60e51b8152600401610c13906154bf565b601555565b60606000611efa83611d7d565b905080611f17575050604080516000815260208101909152610b51565b60008167ffffffffffffffff81118015611f3057600080fd5b50604051908082528060200260200182016040528015611f5a578160200160208202803683370190505b50905060005b82811015611f9157611f728582610f9f565b828281518110611f7e57fe5b6020908102919091010152600101611f60565b509150610b519050565b50919050565b600a546001600160a01b031690565b6000610fc18284613bca565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b61202561381d565b6001600160a01b0316612036611fa1565b6001600160a01b03161461205c5760405162461bcd60e51b8152600401610c13906154bf565b601655565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d145780601f10611ce957610100808354040283529160200191611d14565b60155481565b6120ca61381d565b6001600160a01b03166120db611fa1565b6001600160a01b0316146121015760405162461bcd60e51b8152600401610c13906154bf565b61210a81613bf2565b50565b60188054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b61217661381d565b6001600160a01b0316826001600160a01b031614156121a75760405162461bcd60e51b8152600401610c1390615007565b80600560006121b461381d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556121f861381d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122309190614c88565b60405180910390a35050565b683635c9adc5dea00000810260015b82811015611f9b57683635c9adc5dea000008102919091019060010161224b565b6122763382613906565b61227f57600080fd5b6000818152600e60205260409020600a0154421161229c57600080fd5b6122a94262015180613aa5565b6000828152600e602052604090819020600a81019290925560099091018054680d8d726b7177a80000019055517f295d55086c6d393038a87c8c8dae07b9d3c630d89f0f0147f031a68b23ca2f00906114589033908490614c04565b61231661231061381d565b83613906565b6123325760405162461bcd60e51b8152600401610c1390615677565b61233e84848484613c05565b50505050565b600080808080612352610cd5565b8611156123715760405162461bcd60e51b8152600401610c139061558c565b6000868152600e6020526040902060018101546002909101546123b79161239f91600491610e6a919061389a565b6000888152600e602052604090206004015490613aa5565b6000878152600e6020526040902060018101546002909101546123fd916123e591600491610e6a919061389a565b6000898152600e602052604090206005015490613aa5565b6000888152600e6020526040902060018101546002909101546124439161242b91600491610e6a919061389a565b60008a8152600e602052604090206006015490613aa5565b6000988952600e602052604090982060078101546008909101549299919897509550909350915050565b600d54610100900460ff166124945760405162461bcd60e51b8152600401610c1390614ddb565b6000811180156124a5575060058111155b6124c15760405162461bcd60e51b8152600401610c1390614e53565b6103e86124d6826124d0610cd5565b90613aa5565b11156124f45760405162461bcd60e51b8152600401610c13906152cc565b612506670429d069189e00008261389a565b3410156125255760405162461bcd60e51b8152600401610c139061503e565b60005b818110156114b557600061253a610cd5565b60010190506103e861254a610cd5565b1015612745576001600e600061255e610cd5565b8152602001908152602001600020600101819055506000600e6000612581610cd5565b8152602001908152602001600020600201819055506000600e60006125a4610cd5565b81526020019081526020016000206003018190555042600e60006125c6610cd5565b8152602001908152602001600020600a018190555043600e60006125e8610cd5565b81526020810191909152604001600020600b015561261161260c6080610e6a610cd5565b613c38565b600e600061261d610cd5565b815260208101919091526040016000206004015561264161260c6019610e6a610cd5565b600e600061264d610cd5565b815260208101919091526040016000206005015561267261260c6101a4610e6a610cd5565b600e600061267e610cd5565b81526020810191909152604001600020600601556126a261260c6045610e6a610cd5565b600e60006126ae610cd5565b81526020810191909152604001600020600701556126d261260c600a610e6a610cd5565b600e60006126de610cd5565b8152602081019190915260400160002060080155601454612700906001613aa5565b60145561270d3382613c89565b7f0a6b2a25f2764bb23ba81dc1f3c7e5885291c116a26ba73b46c15ed4948317418160405161273c9190614b6c565b60405180910390a15b50600101612528565b606061275982613810565b6127755760405162461bcd60e51b8152600401610c139061553d565b600061277f611d1c565b9050600061278b61210d565b6000858152600e60205260409020600101549091506003116127da57806127b185613ca3565b6040516020016127c292919061496e565b60405160208183030381529060405292505050610b51565b816127b185613ca3565b600f5481565b60606127f4610cd5565b82106128125760405162461bcd60e51b8152600401610c1390614e1c565b6000828152600e60205260409020600101546002106128ca576000828152600e602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156128be5780601f10612893576101008083540402835291602001916128be565b820191906000526020600020905b8154815290600101906020018083116128a157829003601f168201915b50505050509050610b51565b6000828152600e6020526040902060010154600314156129fc576128ec6144cb565b601c80546000858152600e60205260409020600801548161290957fe5b068154811061291457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129a25780601f10612977576101008083540402835291602001916129a2565b820191906000526020600020905b81548152906001019060200180831161298557829003601f168201915b5050505050816000600181106129b457fe5b602002015260008181602090810291909101516000868152600e835260409081902090516129e2930161499d565b60408051601f198184030181529190529250610b51915050565b6000828152600e6020526040902060010154600510612bf057612a1d6144f2565b601c80546000858152600e602052604090206008015481612a3a57fe5b0681548110612a4557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b820191906000526020600020905b815481529060010190602001808311612ab657829003601f168201915b505050505081600060028110612ae557fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612b1257fe5b0681548110612b1d57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612bab5780601f10612b8057610100808354040283529160200191612bab565b820191906000526020600020905b815481529060010190602001808311612b8e57829003601f168201915b505050505081600160028110612bbd57fe5b6020908102919091019190915281516000858152600e8352604080822085850151915192946129e29493919291016149d0565b6000828152600e6020526040902060010154600710612ec157612c1161450b565b601c80546000858152600e602052604090206008015481612c2e57fe5b0681548110612c3957fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cc75780601f10612c9c57610100808354040283529160200191612cc7565b820191906000526020600020905b815481529060010190602001808311612caa57829003601f168201915b505050505081600060038110612cd957fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612d0657fe5b0681548110612d1157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d9f5780601f10612d7457610100808354040283529160200191612d9f565b820191906000526020600020905b815481529060010190602001808311612d8257829003601f168201915b505050505081600160038110612db157fe5b6020020181905250601e8080549050600e60008681526020019081526020016000206008015481612dde57fe5b0681548110612de957fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612e775780601f10612e4c57610100808354040283529160200191612e77565b820191906000526020600020905b815481529060010190602001808311612e5a57829003601f168201915b505050505081600260038110612e8957fe5b6020908102919091019190915281516000858152600e835260408082208585015182870151925193956129e295949293919201614a24565b612ec9614525565b601c80546000858152600e602052604090206008015481612ee657fe5b0681548110612ef157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612f7f5780601f10612f5457610100808354040283529160200191612f7f565b820191906000526020600020905b815481529060010190602001808311612f6257829003601f168201915b505050505081600060048110612f9157fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612fbe57fe5b0681548110612fc957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b50505050508160016004811061306957fe5b6020020181905250601e8080549050600e6000868152602001908152602001600020600801548161309657fe5b06815481106130a157fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b50505050508160026004811061314157fe5b6020020181905250601b8080549050600e6000868152602001908152602001600020600801548161316e57fe5b068154811061317957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156132075780601f106131dc57610100808354040283529160200191613207565b820191906000526020600020905b8154815290600101906020018083116131ea57829003601f168201915b50505050508160036004811061321957fe5b60209081029190910191909152606082015182516000868152600e845260408082208686015182880151925193966129e29695949293919201614a95565b6060613261610cd5565b821061327f5760405162461bcd60e51b8152600401610c13906151b7565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156133055780601f106132da57610100808354040283529160200191613305565b820191906000526020600020905b8154815290600101906020018083116132e857829003601f168201915b50505050509050919050565b61331961381d565b6001600160a01b031661332a611fa1565b6001600160a01b0316146133505760405162461bcd60e51b8152600401610c13906154bf565b600061335a610cd5565b905060008211801561336e5750600f548211155b61338a5760405162461bcd60e51b8152600401610c1390614f8e565b60005b828110156133a9576133a184828401613c89565b60010161338d565b50600f546133b79083613bca565b600f55505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600d54610100900460ff1681565b61340361381d565b6001600160a01b0316613414611c57565b6001600160a01b03161461343a5760405162461bcd60e51b8152600401610c13906154bf565b6000818152600e6020526040902060030154613457906001613aa5565b6000918252600e602052604090912060030155565b61347461381d565b6001600160a01b0316613485611fa1565b6001600160a01b0316146134ab5760405162461bcd60e51b8152600401610c13906154bf565b6001600160a01b0381166134d15760405162461bcd60e51b8152600401610c1390614eda565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6103e881565b61353b61381d565b6001600160a01b031661354c611c57565b6001600160a01b0316146135725760405162461bcd60e51b8152600401610c13906154bf565b6000918252600e602052604090912060090155565b3361359183611c66565b6001600160a01b0316146135b75760405162461bcd60e51b8152600401610c13906156ff565b6000828152600e60205260409081902090516002916135d591614962565b602060405180830381855afa1580156135f2573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061361591906147a9565b6002826040516136259190614946565b602060405180830381855afa158015613642573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061366591906147a9565b14156136835760405162461bcd60e51b8152600401610c13906155c3565b6000828152600e6020908152604090912082516136a29284019061443f565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a338383604051610f4c93929190614c1d565b6136de61381d565b6001600160a01b03166136ef611fa1565b6001600160a01b0316146137155760405162461bcd60e51b8152600401610c13906154bf565b600d805460ff191660011790556040517f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b09061375390600c90614d0f565b60405180910390a1565b61376561381d565b6001600160a01b0316613776611fa1565b6001600160a01b03161461379c5760405162461bcd60e51b8152600401610c13906154bf565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6137c661381d565b6001600160a01b03166137d7611fa1565b6001600160a01b0316146137fd5760405162461bcd60e51b8152600401610c13906154bf565b80516114b590601890602084019061443f565b6000610fc4600283613d7e565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061385682611c66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610fc482613d8a565b6000826138a957506000610fc4565b828202828482816138b657fe5b0414610fc15760405162461bcd60e51b8152600401610c13906153fb565b60008082116138f55760405162461bcd60e51b8152600401610c1390615180565b8183816138fe57fe5b049392505050565b600061391182613810565b61392d5760405162461bcd60e51b8152600401610c13906150f2565b600061393883611c66565b9050806001600160a01b0316846001600160a01b031614806139735750836001600160a01b031661396884610bec565b6001600160a01b0316145b80613983575061398381856133bf565b949350505050565b826001600160a01b031661399e82611c66565b6001600160a01b0316146139c45760405162461bcd60e51b8152600401610c13906154f4565b6001600160a01b0382166139ea5760405162461bcd60e51b8152600401610c1390614fc3565b6139f5838383610ccb565b613a00600082613821565b6001600160a01b0383166000908152600160205260409020613a229082613d8e565b506001600160a01b0382166000908152600160205260409020613a459082613d9a565b50613a5260028284613da6565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610fc18383613dbc565b600082820183811015610fc15760405162461bcd60e51b8152600401610c1390614f57565b6000613ad582611c66565b9050613ae381600084610ccb565b613aee600083613821565b6000828152600860205260409020546002600019610100600184161502019091160415613b2c576000828152600860205260408120613b2c9161453f565b6001600160a01b0381166000908152600160205260409020613b4e9083613d8e565b50613b5a600283613e01565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080613ba68686613e0d565b9097909650945050505050565b6000613bc0848484613e69565b90505b9392505050565b600082821115613bec5760405162461bcd60e51b8152600401610c1390615075565b50900390565b80516114b590600990602084019061443f565b613c1084848461398b565b613c1c84848484613ec8565b61233e5760405162461bcd60e51b8152600401610c1390614e88565b600080613c45834361389a565b9050600081604051602001613c5a9190614b6c565b6040516020818303038152906040528051906020012060001c90506013548181613c8057fe5b06949350505050565b6114b5828260405180602001604052806000815250613fa7565b606081613cc857506040805180820190915260018152600360fc1b6020820152610b51565b8160005b8115613ce057600101600a82049150613ccc565b60008167ffffffffffffffff81118015613cf957600080fd5b506040519080825280601f01601f191660200182016040528015613d24576020820181803683370190505b50859350905060001982015b8315613d7557600a840660300160f81b82828060019003935081518110613d5357fe5b60200101906001600160f81b031916908160001a905350600a84049350613d30565b50949350505050565b6000610fc18383613fda565b5490565b6000610fc18383613ff2565b6000610fc183836140b8565b6000613bc084846001600160a01b038516614102565b81546000908210613ddf5760405162461bcd60e51b8152600401610c1390614d99565b826000018281548110613dee57fe5b9060005260206000200154905092915050565b6000610fc18383614199565b815460009081908310613e325760405162461bcd60e51b8152600401610c139061534d565b6000846000018481548110613e4357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281613e995760405162461bcd60e51b8152600401610c139190614c93565b50846000016001820381548110613eac57fe5b9060005260206000209060020201600101549150509392505050565b6000613edc846001600160a01b031661426d565b613ee857506001613983565b6000613f70630a85bd0160e11b613efd61381d565b888787604051602401613f139493929190614bc7565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615825603291396001600160a01b0388169190614273565b9050600081806020019051810190613f8891906147dd565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b613fb18383614282565b613fbe6000848484613ec8565b610ccb5760405162461bcd60e51b8152600401610c1390614e88565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156140ae578354600019808301919081019060009087908390811061402557fe5b906000526020600020015490508087600001848154811061404257fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061407257fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610fc4565b6000915050610fc4565b60006140c48383613fda565b6140fa57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fc4565b506000610fc4565b600082815260018401602052604081205480614167575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613bc3565b8285600001600183038154811061417a57fe5b9060005260206000209060020201600101819055506000915050613bc3565b600081815260018301602052604081205480156140ae57835460001980830191908101906000908790839081106141cc57fe5b90600052602060002090600202019050808760000184815481106141ec57fe5b60009182526020808320845460029093020191825560019384015491840191909155835482528983019052604090209084019055865487908061422b57fe5b6000828152602080822060026000199094019384020182815560019081018390559290935588815289820190925260408220919091559450610fc49350505050565b3b151590565b6060613bc08484600085614346565b6001600160a01b0382166142a85760405162461bcd60e51b8152600401610c139061538f565b6142b181613810565b156142ce5760405162461bcd60e51b8152600401610c1390614f20565b6142da60008383610ccb565b6001600160a01b03821660009081526001602052604090206142fc9082613d9a565b5061430960028284613da6565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156143685760405162461bcd60e51b8152600401610c13906150ac565b6143718561426d565b61438d5760405162461bcd60e51b8152600401610c13906156c8565b600080866001600160a01b031685876040516143a99190614946565b60006040518083038185875af1925050503d80600081146143e6576040519150601f19603f3d011682016040523d82523d6000602084013e6143eb565b606091505b50915091506143fb828286614406565b979650505050505050565b60608315614415575081613bc3565b8251156144255782518084602001fd5b8160405162461bcd60e51b8152600401610c139190614c93565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261447557600085556144bb565b82601f1061448e57805160ff19168380011785556144bb565b828001600101855582156144bb579182015b828111156144bb5782518255916020019190600101906144a0565b506144c792915061457f565b5090565b60405180602001604052806001905b60608152602001906001900390816144da5790505090565b60408051808201909152606081526001602082016144da565b6040805160608082019092529081526002602082016144da565b6040805160808101909152606081526003602082016144da565b50805460018160011615610100020316600290046000825580601f10614565575061210a565b601f01602090049060005260206000209081019061210a91905b5b808211156144c75760008155600101614580565b600067ffffffffffffffff808411156145a957fe5b604051601f8501601f1916810160200182811182821017156145c757fe5b6040528481529150818385018610156145df57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b0381168114610b5157600080fd5b600082601f83011261461f578081fd5b610fc183833560208501614594565b60006020828403121561463f578081fd5b610fc1826145f8565b6000806040838503121561465a578081fd5b614663836145f8565b9150614671602084016145f8565b90509250929050565b60008060006060848603121561468e578081fd5b614697846145f8565b92506146a5602085016145f8565b9150604084013590509250925092565b600080600080608085870312156146ca578081fd5b6146d3856145f8565b93506146e1602086016145f8565b925060408501359150606085013567ffffffffffffffff811115614703578182fd5b8501601f81018713614713578182fd5b61472287823560208401614594565b91505092959194509250565b60008060408385031215614740578182fd5b614749836145f8565b9150602083013561475981615800565b809150509250929050565b60008060408385031215614776578182fd5b61477f836145f8565b946020939093013593505050565b60006020828403121561479e578081fd5b8151610fc181615800565b6000602082840312156147ba578081fd5b5051919050565b6000602082840312156147d2578081fd5b8135610fc18161580e565b6000602082840312156147ee578081fd5b8151610fc18161580e565b60006020828403121561480a578081fd5b813567ffffffffffffffff811115614820578182fd5b6139838482850161460f565b60006020828403121561483d578081fd5b5035919050565b60008060408385031215614856578182fd5b82359150602083013567ffffffffffffffff811115614873578182fd5b61487f8582860161460f565b9150509250929050565b6000806040838503121561489b578182fd5b50508035926020909101359150565b600081518084526148c28160208601602086016157d4565b601f01601f19169290920160200192915050565b600081546001808216600081146148f4576001811461490b5761493d565b60ff198316865260028304607f168601935061493d565b600283048560005260208060002060005b838110156149355781548a82015290850190820161491c565b505050860193505b50505092915050565b600082516149588184602087016157d4565b9190910192915050565b6000610fc182846148d6565b600083516149808184602088016157d4565b8351908301906149948183602088016157d4565b01949350505050565b600083516149af8184602088016157d4565b600160fd1b9083019081526149c760018201856148d6565b95945050505050565b600084516149e28184602089016157d4565b600160fd1b9083019081526149fa60018201866148d6565b905061016160f51b81528351614a178160028401602088016157d4565b0160020195945050505050565b60008551614a36818460208a016157d4565b600160fd1b90830181815290614a4f60018301886148d6565b915061016160f51b82528551614a6c816002850160208a016157d4565b60029201918201528351614a878160038401602088016157d4565b016003019695505050505050565b60008651614aa7818460208b016157d4565b602d60f81b9083019081528651614ac5816001840160208b016157d4565b808201915050600160fd1b806001830152614ae360028301886148d6565b915061016160f51b82528551614b00816002850160208a016157d4565b60029201918201528351614b1b8160038401602088016157d4565b01600301979650505050505050565b7f436865636b2074686520746f6b656e20616c6c6f77616e63653a0000000000008152601a8101929092526201016160ed1b603a830152603d820152605d0190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bfa908301846148aa565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b0385168252836020830152606060408301526149c760608301846148aa565b6020808252825182820181905260009190848201906040850190845b81811015614c7c57835183529284019291840191600101614c60565b50909695505050505050565b901515815260200190565b600060208252610fc160208301846148aa565b60006101808252614cbb61018083018f6148aa565b602083019d909d5250604081019a909a5260608a0198909852608089019690965260a088019490945260c087019290925260e086015261010085015261012084015261014083015261016090910152919050565b60006020808301818452828554600180821660008114614d365760018114614d5457614d8c565b60028304607f16855260ff1983166040890152606088019350614d8c565b60028304808652614d648a6157c8565b885b82811015614d825781548b820160400152908401908801614d66565b8a01604001955050505b5091979650505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526021908201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656040820152603760f91b606082015260800190565b6020808252601b908201527f43686f6f7365206120746f6b656e2077697468696e2072616e67650000000000604082015260600190565b6020808252818101527f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d65604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526022908201527f4c6576656c206d757374206265206174206c65617374203320746f20636c61696040820152616d2160f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601b908201527f43484f4f5345204120746f6b656e2057495448494e2052414e47450000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526019908201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f6620746f6b656e7360b01b606082015260800190565b6020808252601d908201527f596f7520646f6e2774206861766520656e6f75676820746f6b656e732e000000604082015260600190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526018908201527f746f6b656e20616c7265616479206d6178206c6576656c210000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f43616e277420626520706574206265796f6e6420313021000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601d908201527f546f6b656e206861736e2774206265656e206d696e7465642079657421000000604082015260600190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526028908201527f4865792c20796f75722077616c6c657420646f65736e2774206f776e207468696040820152677320746f6b656e2160c01b606082015260800190565b6020808252601c908201527f596f7520646f6e2774206861766520656e6f7567682065726332302e00000000604082015260600190565b6020808252600d908201526c4e656564206d6f72652058502160981b604082015260600190565b948552602085019390935260408401919091526060830152608082015260a00190565b60009081526020902090565b60005b838110156157ef5781810151838201526020016157d7565b8381111561233e5750506000910152565b801515811461210a57600080fd5b6001600160e01b03198116811461210a57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220894288b241e664fe44003ab5e4f4100f869ab74f16c9e32a456764ef45aca72864736f6c63430007060033
Deployed Bytecode
0x6080604052600436106103c35760003560e01c80637ff9b596116101f2578063c634d0321161010d578063ef3efe67116100a0578063f84b40dc1161006f578063f84b40dc14610abe578063f86aa6bd14610ade578063fa5c20f914610af3578063fc667b3314610b13576103c3565b8063ef3efe6714610a49578063f2fde38b14610a69578063f47c84c514610a89578063f741251d14610a9e576103c3565b8063d9b137b2116100dc578063d9b137b2146109d4578063ddb9657c146109f4578063e985e9c514610a14578063eb8d244414610a34576103c3565b8063c634d0321461096c578063c87b56dd1461097f578063cbcb31711461099f578063d84fedd3146109b4576103c3565b80639f7ff88911610185578063aca10be311610154578063aca10be3146108db578063b00b52f1146108fb578063b88d4fde1461091b578063c38fdbbf1461093b576103c3565b80639f7ff88914610871578063a12a494b14610886578063a1b43c54146108a6578063a22cb465146108bb576103c3565b80638dbb1e3a116101c15780638dbb1e3a1461080757806395d89b41146108275780639be6ab9d1461083c5780639c3e72bd1461085c576103c3565b80637ff9b59614610790578063843ac051146107a55780638462151c146107c55780638da5cb5b146107f2576103c3565b806342842e0e116102e257806356ddea0a1161027557806370a082311161024457806370a0823114610726578063715018a614610746578063785e9e861461075b5780637a2b753d14610770576103c3565b806356ddea0a146106c75780636352211e146106dc5780636373a6b1146106fc5780636c0360eb14610711576103c3565b80634f6ccce7116102b15780634f6ccce71461065d57806353e1a7a01461067d578063542766ed146106925780635501c671146106b2576103c3565b806342842e0e146105e857806342966c681461060857806344cd4cec1461062857806348c5c00b14610648576103c3565b806323b872dd1161035a5780633c6444f6116103295780633c6444f6146105735780633ccfd60b146105935780633ce21c8e146105a85780633cfcccc1146105c8576103c3565b806323b872dd146104fe57806327c8f8351461051e5780632f745c59146105335780633228a48814610553576103c3565b806309aa3dcf1161039657806309aa3dcf1461046f57806318160ddd1461049157806318f5de38146104a65780631cc3a162146104de576103c3565b806301ffc9a7146103c857806306fdde03146103fe578063081812fc14610420578063095ea7b31461044d575b600080fd5b3480156103d457600080fd5b506103e86103e33660046147c1565b610b33565b6040516103f59190614c88565b60405180910390f35b34801561040a57600080fd5b50610413610b56565b6040516103f59190614c93565b34801561042c57600080fd5b5061044061043b36600461482c565b610bec565b6040516103f59190614b75565b34801561045957600080fd5b5061046d610468366004614764565b610c38565b005b34801561047b57600080fd5b50610484610cd0565b6040516103f59190614b6c565b34801561049d57600080fd5b50610484610cd5565b3480156104b257600080fd5b506104c66104c136600461482c565b610ce6565b6040516103f59c9b9a99989796959493929190614ca6565b3480156104ea57600080fd5b5061046d6104f936600461482c565b610dc9565b34801561050a57600080fd5b5061046d61051936600461467a565b610f58565b34801561052a57600080fd5b50610440610f90565b34801561053f57600080fd5b5061048461054e366004614764565b610f9f565b34801561055f57600080fd5b5061046d61056e36600461482c565b610fca565b34801561057f57600080fd5b5061046d61058e3660046147f9565b611463565b34801561059f57600080fd5b5061046d6114b9565b3480156105b457600080fd5b5061046d6105c3366004614889565b611527565b3480156105d457600080fd5b5061046d6105e336600461482c565b61157b565b3480156105f457600080fd5b5061046d61060336600461467a565b6119d8565b34801561061457600080fd5b5061046d61062336600461482c565b6119f3565b34801561063457600080fd5b5061046d61064336600461462e565b611b03565b34801561065457600080fd5b50610484611b64565b34801561066957600080fd5b5061048461067836600461482c565b611b6a565b34801561068957600080fd5b50610484611b80565b34801561069e57600080fd5b5061046d6106ad3660046147f9565b611b86565b3480156106be57600080fd5b5061046d611bfb565b3480156106d357600080fd5b50610440611c57565b3480156106e857600080fd5b506104406106f736600461482c565b611c66565b34801561070857600080fd5b50610413611c8e565b34801561071d57600080fd5b50610413611d1c565b34801561073257600080fd5b5061048461074136600461462e565b611d7d565b34801561075257600080fd5b5061046d611dc6565b34801561076757600080fd5b50610440611e4f565b34801561077c57600080fd5b5061048461078b36600461482c565b611e5e565b34801561079c57600080fd5b50610484611e9d565b3480156107b157600080fd5b5061046d6107c036600461482c565b611ea9565b3480156107d157600080fd5b506107e56107e036600461462e565b611eed565b6040516103f59190614c44565b3480156107fe57600080fd5b50610440611fa1565b34801561081357600080fd5b50610484610822366004614889565b611fb0565b34801561083357600080fd5b50610413611fbc565b34801561084857600080fd5b5061046d61085736600461482c565b61201d565b34801561086857600080fd5b50610413612061565b34801561087d57600080fd5b506104846120bc565b34801561089257600080fd5b5061046d6108a13660046147f9565b6120c2565b3480156108b257600080fd5b5061041361210d565b3480156108c757600080fd5b5061046d6108d636600461472e565b61216e565b3480156108e757600080fd5b506104846108f636600461482c565b61223c565b34801561090757600080fd5b5061046d61091636600461482c565b61226c565b34801561092757600080fd5b5061046d6109363660046146b5565b612305565b34801561094757600080fd5b5061095b61095636600461482c565b612344565b6040516103f59594939291906157a5565b61046d61097a36600461482c565b61246d565b34801561098b57600080fd5b5061041361099a36600461482c565b61274e565b3480156109ab57600080fd5b506104846127e4565b3480156109c057600080fd5b506104136109cf36600461482c565b6127ea565b3480156109e057600080fd5b506104136109ef36600461482c565b613257565b348015610a0057600080fd5b5061046d610a0f366004614764565b613311565b348015610a2057600080fd5b506103e8610a2f366004614648565b6133bf565b348015610a4057600080fd5b506103e86133ed565b348015610a5557600080fd5b5061046d610a6436600461482c565b6133fb565b348015610a7557600080fd5b5061046d610a8436600461462e565b61346c565b348015610a9557600080fd5b5061048461352d565b348015610aaa57600080fd5b5061046d610ab9366004614889565b613533565b348015610aca57600080fd5b5061046d610ad9366004614844565b613587565b348015610aea57600080fd5b5061046d6136d6565b348015610aff57600080fd5b5061046d610b0e36600461462e565b61375d565b348015610b1f57600080fd5b5061046d610b2e3660046147f9565b6137be565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b820191906000526020600020905b815481529060010190602001808311610bc557829003601f168201915b5050505050905090565b6000610bf782613810565b610c1c5760405162461bcd60e51b8152600401610c139061543c565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c4382611c66565b9050806001600160a01b0316836001600160a01b03161415610c775760405162461bcd60e51b8152600401610c1390615606565b806001600160a01b0316610c8961381d565b6001600160a01b03161480610ca55750610ca581610a2f61381d565b610cc15760405162461bcd60e51b8152600401610c13906151ee565b610ccb8383613821565b505050565b600581565b6000610ce1600261388f565b905090565b600e6020908152600091825260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909291839190830182828015610d7d5780601f10610d5257610100808354040283529160200191610d7d565b820191906000526020600020905b815481529060010190602001808311610d6057829003601f168201915b50505050509080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b33610dd382611c66565b6001600160a01b031614610df95760405162461bcd60e51b8152600401610c13906156ff565b6000818152600e602052604090206001015460031115610e2b5760405162461bcd60e51b8152600401610c139061513e565b6014546000828152600e6020526040812060018101546008820154600b909201549293610e7f939092610e7992610e70929091610e6a91829043611fb0565b9061389a565b6015549061389a565b906138d4565b6000838152600e60205260409081902043600b9091015560105490516340c10f1960e01b81529192506001600160a01b0316906340c10f1990610ec89033908590600401614c04565b602060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a919061478d565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051610f4c929190614c04565b60405180910390a15050565b610f69610f6361381d565b82613906565b610f855760405162461bcd60e51b8152600401610c1390615677565b610ccb83838361398b565b6011546001600160a01b031681565b6001600160a01b0382166000908152600160205260408120610fc19083613a99565b90505b92915050565b6000818152600e602052604090206002015460191015610ffc5760405162461bcd60e51b8152600401610c1390615488565b6000818152600e60205260409020600201546001116113f4576000818152600e60205260409020600201546016546110419190610e6a90674563918244f4000061389a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190611071903390600401614b75565b60206040518083038186803b15801561108957600080fd5b505afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c191906147a9565b10156110df5760405162461bcd60e51b8152600401610c1390615747565b6000818152600e602052604081206002015460165461110b9190610e6a90674563918244f4000061389a565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e906111439033903090600401614b89565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119391906147a9565b601054604051636eb1769f60e11b815291925083831015916001600160a01b039091169063dd62ed3e906111cd9033903090600401614b89565b60206040518083038186803b1580156111e557600080fd5b505afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d91906147a9565b8360405160200161122f929190614b2a565b6040516020818303038152906040529061125c5760405162461bcd60e51b8152600401610c139190614c93565b506010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061129190339030908790600401614ba3565b602060405180830381600087803b1580156112ab57600080fd5b505af11580156112bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e3919061478d565b506010546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611315903090600401614b75565b60206040518083038186803b15801561132d57600080fd5b505afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136591906147a9565b60105460115460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261139d9216908590600401614c04565b602060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ef919061478d565b505050505b6000818152600e6020526040902060020154611411906001613aa5565b6000828152600e60205260409081902060020191909155517f1b434a086dd5f568dcf1cb1c9460656430e95f3bce11b6b7bc20798bd706e49a906114589033908490614c04565b60405180910390a150565b61146b61381d565b6001600160a01b031661147c611fa1565b6001600160a01b0316146114a25760405162461bcd60e51b8152600401610c13906154bf565b80516114b590600b90602084019061443f565b5050565b6114c161381d565b6001600160a01b03166114d2611fa1565b6001600160a01b0316146114f85760405162461bcd60e51b8152600401610c13906154bf565b6040514790339082156108fc029083906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b61152f61381d565b6001600160a01b0316611540611c57565b6001600160a01b0316146115665760405162461bcd60e51b8152600401610c13906154bf565b6000918252600e602052604090912060020155565b3361158582611c66565b6001600160a01b0316146115ab5760405162461bcd60e51b8152600401610c13906156ff565b6000818152600e6020526040902060010154600910156115dd5760405162461bcd60e51b8152600401610c13906153c4565b6000818152600e602052604090206001015460165461160a9190610e6a906802b5e3af16b188000061389a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a082319061163a903390600401614b75565b60206040518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a91906147a9565b10156116a85760405162461bcd60e51b8152600401610c1390615316565b6000818152600e60205260408120600101546116c39061223c565b6000838152600e60205260409020600901549091508111156116f75760405162461bcd60e51b8152600401610c139061577e565b6000828152600e602052604081206001015460165461171f9190610e6a90633b9aca0061389a565b601054604051636eb1769f60e11b81529192506000916001600160a01b039091169063dd62ed3e906117579033903090600401614b89565b60206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a791906147a9565b9050818110156117c95760405162461bcd60e51b8152600401610c139061524b565b6010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117fd90339030908790600401614ba3565b602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184f919061478d565b506000848152600e60205260409020600981018054859003905560019081015461187891613aa5565b6000858152600e60205260408082206001019290925560105491516370a0823160e01b815290916001600160a01b0316906370a08231906118bd903090600401614b75565b60206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906147a9565b60105460115460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926119459216908590600401614c04565b602060405180830381600087803b15801561195f57600080fd5b505af1158015611973573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611997919061478d565b507f63f93e9c49e6ef55ed1cf3b3915e6f71ac510f5d0d265c19d42cb43e789fec5433866040516119c9929190614c04565b60405180910390a15050505050565b610ccb83838360405180602001604052806000815250612305565b336119fd82611c66565b6001600160a01b031614611a235760405162461bcd60e51b8152600401610c13906156ff565b601554600090611a3b90671bc16d674ec8000061389a565b6010546040516340c10f1960e01b81529192506001600160a01b0316906340c10f1990611a6e9033908590600401614c04565b602060405180830381600087803b158015611a8857600080fd5b505af1158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac0919061478d565b507f1fb23666ed94b3e9ced2ad714495c2852c931585b9e60221a1f7914bc578b9123382604051611af2929190614c04565b60405180910390a16114b582613aca565b611b0b61381d565b6001600160a01b0316611b1c611fa1565b6001600160a01b031614611b425760405162461bcd60e51b8152600401610c13906154bf565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60145481565b600080611b78600284613b97565b509392505050565b60165481565b611b8e61381d565b6001600160a01b0316611b9f611fa1565b6001600160a01b031614611bc55760405162461bcd60e51b8152600401610c13906154bf565b600d5460ff1615611be85760405162461bcd60e51b8152600401610c1390615647565b80516114b590600c90602084019061443f565b611c0361381d565b6001600160a01b0316611c14611fa1565b6001600160a01b031614611c3a5760405162461bcd60e51b8152600401610c13906154bf565b600d805461ff001981166101009182900460ff1615909102179055565b601a546001600160a01b031690565b6000610fc4826040518060600160405280602981526020016158576029913960029190613bb3565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d145780601f10611ce957610100808354040283529160200191611d14565b820191906000526020600020905b815481529060010190602001808311611cf757829003601f168201915b505050505081565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b60006001600160a01b038216611da55760405162461bcd60e51b8152600401610c1390615282565b6001600160a01b0382166000908152600160205260409020610fc49061388f565b611dce61381d565b6001600160a01b0316611ddf611fa1565b6001600160a01b031614611e055760405162461bcd60e51b8152600401610c13906154bf565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b6010546001600160a01b031681565b6014546000828152600e6020526040812060018101546008820154600b909201549293610fc4939092610e7992610e70929091610e6a91829043611fb0565b670429d069189e000081565b611eb161381d565b6001600160a01b0316611ec2611fa1565b6001600160a01b031614611ee85760405162461bcd60e51b8152600401610c13906154bf565b601555565b60606000611efa83611d7d565b905080611f17575050604080516000815260208101909152610b51565b60008167ffffffffffffffff81118015611f3057600080fd5b50604051908082528060200260200182016040528015611f5a578160200160208202803683370190505b50905060005b82811015611f9157611f728582610f9f565b828281518110611f7e57fe5b6020908102919091010152600101611f60565b509150610b519050565b50919050565b600a546001600160a01b031690565b6000610fc18284613bca565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b61202561381d565b6001600160a01b0316612036611fa1565b6001600160a01b03161461205c5760405162461bcd60e51b8152600401610c13906154bf565b601655565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d145780601f10611ce957610100808354040283529160200191611d14565b60155481565b6120ca61381d565b6001600160a01b03166120db611fa1565b6001600160a01b0316146121015760405162461bcd60e51b8152600401610c13906154bf565b61210a81613bf2565b50565b60188054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be25780601f10610bb757610100808354040283529160200191610be2565b61217661381d565b6001600160a01b0316826001600160a01b031614156121a75760405162461bcd60e51b8152600401610c1390615007565b80600560006121b461381d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556121f861381d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122309190614c88565b60405180910390a35050565b683635c9adc5dea00000810260015b82811015611f9b57683635c9adc5dea000008102919091019060010161224b565b6122763382613906565b61227f57600080fd5b6000818152600e60205260409020600a0154421161229c57600080fd5b6122a94262015180613aa5565b6000828152600e602052604090819020600a81019290925560099091018054680d8d726b7177a80000019055517f295d55086c6d393038a87c8c8dae07b9d3c630d89f0f0147f031a68b23ca2f00906114589033908490614c04565b61231661231061381d565b83613906565b6123325760405162461bcd60e51b8152600401610c1390615677565b61233e84848484613c05565b50505050565b600080808080612352610cd5565b8611156123715760405162461bcd60e51b8152600401610c139061558c565b6000868152600e6020526040902060018101546002909101546123b79161239f91600491610e6a919061389a565b6000888152600e602052604090206004015490613aa5565b6000878152600e6020526040902060018101546002909101546123fd916123e591600491610e6a919061389a565b6000898152600e602052604090206005015490613aa5565b6000888152600e6020526040902060018101546002909101546124439161242b91600491610e6a919061389a565b60008a8152600e602052604090206006015490613aa5565b6000988952600e602052604090982060078101546008909101549299919897509550909350915050565b600d54610100900460ff166124945760405162461bcd60e51b8152600401610c1390614ddb565b6000811180156124a5575060058111155b6124c15760405162461bcd60e51b8152600401610c1390614e53565b6103e86124d6826124d0610cd5565b90613aa5565b11156124f45760405162461bcd60e51b8152600401610c13906152cc565b612506670429d069189e00008261389a565b3410156125255760405162461bcd60e51b8152600401610c139061503e565b60005b818110156114b557600061253a610cd5565b60010190506103e861254a610cd5565b1015612745576001600e600061255e610cd5565b8152602001908152602001600020600101819055506000600e6000612581610cd5565b8152602001908152602001600020600201819055506000600e60006125a4610cd5565b81526020019081526020016000206003018190555042600e60006125c6610cd5565b8152602001908152602001600020600a018190555043600e60006125e8610cd5565b81526020810191909152604001600020600b015561261161260c6080610e6a610cd5565b613c38565b600e600061261d610cd5565b815260208101919091526040016000206004015561264161260c6019610e6a610cd5565b600e600061264d610cd5565b815260208101919091526040016000206005015561267261260c6101a4610e6a610cd5565b600e600061267e610cd5565b81526020810191909152604001600020600601556126a261260c6045610e6a610cd5565b600e60006126ae610cd5565b81526020810191909152604001600020600701556126d261260c600a610e6a610cd5565b600e60006126de610cd5565b8152602081019190915260400160002060080155601454612700906001613aa5565b60145561270d3382613c89565b7f0a6b2a25f2764bb23ba81dc1f3c7e5885291c116a26ba73b46c15ed4948317418160405161273c9190614b6c565b60405180910390a15b50600101612528565b606061275982613810565b6127755760405162461bcd60e51b8152600401610c139061553d565b600061277f611d1c565b9050600061278b61210d565b6000858152600e60205260409020600101549091506003116127da57806127b185613ca3565b6040516020016127c292919061496e565b60405160208183030381529060405292505050610b51565b816127b185613ca3565b600f5481565b60606127f4610cd5565b82106128125760405162461bcd60e51b8152600401610c1390614e1c565b6000828152600e60205260409020600101546002106128ca576000828152600e602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156128be5780601f10612893576101008083540402835291602001916128be565b820191906000526020600020905b8154815290600101906020018083116128a157829003601f168201915b50505050509050610b51565b6000828152600e6020526040902060010154600314156129fc576128ec6144cb565b601c80546000858152600e60205260409020600801548161290957fe5b068154811061291457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129a25780601f10612977576101008083540402835291602001916129a2565b820191906000526020600020905b81548152906001019060200180831161298557829003601f168201915b5050505050816000600181106129b457fe5b602002015260008181602090810291909101516000868152600e835260409081902090516129e2930161499d565b60408051601f198184030181529190529250610b51915050565b6000828152600e6020526040902060010154600510612bf057612a1d6144f2565b601c80546000858152600e602052604090206008015481612a3a57fe5b0681548110612a4557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b820191906000526020600020905b815481529060010190602001808311612ab657829003601f168201915b505050505081600060028110612ae557fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612b1257fe5b0681548110612b1d57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612bab5780601f10612b8057610100808354040283529160200191612bab565b820191906000526020600020905b815481529060010190602001808311612b8e57829003601f168201915b505050505081600160028110612bbd57fe5b6020908102919091019190915281516000858152600e8352604080822085850151915192946129e29493919291016149d0565b6000828152600e6020526040902060010154600710612ec157612c1161450b565b601c80546000858152600e602052604090206008015481612c2e57fe5b0681548110612c3957fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cc75780601f10612c9c57610100808354040283529160200191612cc7565b820191906000526020600020905b815481529060010190602001808311612caa57829003601f168201915b505050505081600060038110612cd957fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612d0657fe5b0681548110612d1157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d9f5780601f10612d7457610100808354040283529160200191612d9f565b820191906000526020600020905b815481529060010190602001808311612d8257829003601f168201915b505050505081600160038110612db157fe5b6020020181905250601e8080549050600e60008681526020019081526020016000206008015481612dde57fe5b0681548110612de957fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612e775780601f10612e4c57610100808354040283529160200191612e77565b820191906000526020600020905b815481529060010190602001808311612e5a57829003601f168201915b505050505081600260038110612e8957fe5b6020908102919091019190915281516000858152600e835260408082208585015182870151925193956129e295949293919201614a24565b612ec9614525565b601c80546000858152600e602052604090206008015481612ee657fe5b0681548110612ef157fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612f7f5780601f10612f5457610100808354040283529160200191612f7f565b820191906000526020600020905b815481529060010190602001808311612f6257829003601f168201915b505050505081600060048110612f9157fe5b6020020181905250601d8080549050600e60008681526020019081526020016000206008015481612fbe57fe5b0681548110612fc957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b50505050508160016004811061306957fe5b6020020181905250601e8080549050600e6000868152602001908152602001600020600801548161309657fe5b06815481106130a157fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b50505050508160026004811061314157fe5b6020020181905250601b8080549050600e6000868152602001908152602001600020600801548161316e57fe5b068154811061317957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156132075780601f106131dc57610100808354040283529160200191613207565b820191906000526020600020905b8154815290600101906020018083116131ea57829003601f168201915b50505050508160036004811061321957fe5b60209081029190910191909152606082015182516000868152600e845260408082208686015182880151925193966129e29695949293919201614a95565b6060613261610cd5565b821061327f5760405162461bcd60e51b8152600401610c13906151b7565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156133055780601f106132da57610100808354040283529160200191613305565b820191906000526020600020905b8154815290600101906020018083116132e857829003601f168201915b50505050509050919050565b61331961381d565b6001600160a01b031661332a611fa1565b6001600160a01b0316146133505760405162461bcd60e51b8152600401610c13906154bf565b600061335a610cd5565b905060008211801561336e5750600f548211155b61338a5760405162461bcd60e51b8152600401610c1390614f8e565b60005b828110156133a9576133a184828401613c89565b60010161338d565b50600f546133b79083613bca565b600f55505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600d54610100900460ff1681565b61340361381d565b6001600160a01b0316613414611c57565b6001600160a01b03161461343a5760405162461bcd60e51b8152600401610c13906154bf565b6000818152600e6020526040902060030154613457906001613aa5565b6000918252600e602052604090912060030155565b61347461381d565b6001600160a01b0316613485611fa1565b6001600160a01b0316146134ab5760405162461bcd60e51b8152600401610c13906154bf565b6001600160a01b0381166134d15760405162461bcd60e51b8152600401610c1390614eda565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6103e881565b61353b61381d565b6001600160a01b031661354c611c57565b6001600160a01b0316146135725760405162461bcd60e51b8152600401610c13906154bf565b6000918252600e602052604090912060090155565b3361359183611c66565b6001600160a01b0316146135b75760405162461bcd60e51b8152600401610c13906156ff565b6000828152600e60205260409081902090516002916135d591614962565b602060405180830381855afa1580156135f2573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061361591906147a9565b6002826040516136259190614946565b602060405180830381855afa158015613642573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061366591906147a9565b14156136835760405162461bcd60e51b8152600401610c13906155c3565b6000828152600e6020908152604090912082516136a29284019061443f565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a338383604051610f4c93929190614c1d565b6136de61381d565b6001600160a01b03166136ef611fa1565b6001600160a01b0316146137155760405162461bcd60e51b8152600401610c13906154bf565b600d805460ff191660011790556040517f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b09061375390600c90614d0f565b60405180910390a1565b61376561381d565b6001600160a01b0316613776611fa1565b6001600160a01b03161461379c5760405162461bcd60e51b8152600401610c13906154bf565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6137c661381d565b6001600160a01b03166137d7611fa1565b6001600160a01b0316146137fd5760405162461bcd60e51b8152600401610c13906154bf565b80516114b590601890602084019061443f565b6000610fc4600283613d7e565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061385682611c66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610fc482613d8a565b6000826138a957506000610fc4565b828202828482816138b657fe5b0414610fc15760405162461bcd60e51b8152600401610c13906153fb565b60008082116138f55760405162461bcd60e51b8152600401610c1390615180565b8183816138fe57fe5b049392505050565b600061391182613810565b61392d5760405162461bcd60e51b8152600401610c13906150f2565b600061393883611c66565b9050806001600160a01b0316846001600160a01b031614806139735750836001600160a01b031661396884610bec565b6001600160a01b0316145b80613983575061398381856133bf565b949350505050565b826001600160a01b031661399e82611c66565b6001600160a01b0316146139c45760405162461bcd60e51b8152600401610c13906154f4565b6001600160a01b0382166139ea5760405162461bcd60e51b8152600401610c1390614fc3565b6139f5838383610ccb565b613a00600082613821565b6001600160a01b0383166000908152600160205260409020613a229082613d8e565b506001600160a01b0382166000908152600160205260409020613a459082613d9a565b50613a5260028284613da6565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610fc18383613dbc565b600082820183811015610fc15760405162461bcd60e51b8152600401610c1390614f57565b6000613ad582611c66565b9050613ae381600084610ccb565b613aee600083613821565b6000828152600860205260409020546002600019610100600184161502019091160415613b2c576000828152600860205260408120613b2c9161453f565b6001600160a01b0381166000908152600160205260409020613b4e9083613d8e565b50613b5a600283613e01565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080613ba68686613e0d565b9097909650945050505050565b6000613bc0848484613e69565b90505b9392505050565b600082821115613bec5760405162461bcd60e51b8152600401610c1390615075565b50900390565b80516114b590600990602084019061443f565b613c1084848461398b565b613c1c84848484613ec8565b61233e5760405162461bcd60e51b8152600401610c1390614e88565b600080613c45834361389a565b9050600081604051602001613c5a9190614b6c565b6040516020818303038152906040528051906020012060001c90506013548181613c8057fe5b06949350505050565b6114b5828260405180602001604052806000815250613fa7565b606081613cc857506040805180820190915260018152600360fc1b6020820152610b51565b8160005b8115613ce057600101600a82049150613ccc565b60008167ffffffffffffffff81118015613cf957600080fd5b506040519080825280601f01601f191660200182016040528015613d24576020820181803683370190505b50859350905060001982015b8315613d7557600a840660300160f81b82828060019003935081518110613d5357fe5b60200101906001600160f81b031916908160001a905350600a84049350613d30565b50949350505050565b6000610fc18383613fda565b5490565b6000610fc18383613ff2565b6000610fc183836140b8565b6000613bc084846001600160a01b038516614102565b81546000908210613ddf5760405162461bcd60e51b8152600401610c1390614d99565b826000018281548110613dee57fe5b9060005260206000200154905092915050565b6000610fc18383614199565b815460009081908310613e325760405162461bcd60e51b8152600401610c139061534d565b6000846000018481548110613e4357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281613e995760405162461bcd60e51b8152600401610c139190614c93565b50846000016001820381548110613eac57fe5b9060005260206000209060020201600101549150509392505050565b6000613edc846001600160a01b031661426d565b613ee857506001613983565b6000613f70630a85bd0160e11b613efd61381d565b888787604051602401613f139493929190614bc7565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615825603291396001600160a01b0388169190614273565b9050600081806020019051810190613f8891906147dd565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b613fb18383614282565b613fbe6000848484613ec8565b610ccb5760405162461bcd60e51b8152600401610c1390614e88565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156140ae578354600019808301919081019060009087908390811061402557fe5b906000526020600020015490508087600001848154811061404257fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061407257fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610fc4565b6000915050610fc4565b60006140c48383613fda565b6140fa57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fc4565b506000610fc4565b600082815260018401602052604081205480614167575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613bc3565b8285600001600183038154811061417a57fe5b9060005260206000209060020201600101819055506000915050613bc3565b600081815260018301602052604081205480156140ae57835460001980830191908101906000908790839081106141cc57fe5b90600052602060002090600202019050808760000184815481106141ec57fe5b60009182526020808320845460029093020191825560019384015491840191909155835482528983019052604090209084019055865487908061422b57fe5b6000828152602080822060026000199094019384020182815560019081018390559290935588815289820190925260408220919091559450610fc49350505050565b3b151590565b6060613bc08484600085614346565b6001600160a01b0382166142a85760405162461bcd60e51b8152600401610c139061538f565b6142b181613810565b156142ce5760405162461bcd60e51b8152600401610c1390614f20565b6142da60008383610ccb565b6001600160a01b03821660009081526001602052604090206142fc9082613d9a565b5061430960028284613da6565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156143685760405162461bcd60e51b8152600401610c13906150ac565b6143718561426d565b61438d5760405162461bcd60e51b8152600401610c13906156c8565b600080866001600160a01b031685876040516143a99190614946565b60006040518083038185875af1925050503d80600081146143e6576040519150601f19603f3d011682016040523d82523d6000602084013e6143eb565b606091505b50915091506143fb828286614406565b979650505050505050565b60608315614415575081613bc3565b8251156144255782518084602001fd5b8160405162461bcd60e51b8152600401610c139190614c93565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261447557600085556144bb565b82601f1061448e57805160ff19168380011785556144bb565b828001600101855582156144bb579182015b828111156144bb5782518255916020019190600101906144a0565b506144c792915061457f565b5090565b60405180602001604052806001905b60608152602001906001900390816144da5790505090565b60408051808201909152606081526001602082016144da565b6040805160608082019092529081526002602082016144da565b6040805160808101909152606081526003602082016144da565b50805460018160011615610100020316600290046000825580601f10614565575061210a565b601f01602090049060005260206000209081019061210a91905b5b808211156144c75760008155600101614580565b600067ffffffffffffffff808411156145a957fe5b604051601f8501601f1916810160200182811182821017156145c757fe5b6040528481529150818385018610156145df57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b0381168114610b5157600080fd5b600082601f83011261461f578081fd5b610fc183833560208501614594565b60006020828403121561463f578081fd5b610fc1826145f8565b6000806040838503121561465a578081fd5b614663836145f8565b9150614671602084016145f8565b90509250929050565b60008060006060848603121561468e578081fd5b614697846145f8565b92506146a5602085016145f8565b9150604084013590509250925092565b600080600080608085870312156146ca578081fd5b6146d3856145f8565b93506146e1602086016145f8565b925060408501359150606085013567ffffffffffffffff811115614703578182fd5b8501601f81018713614713578182fd5b61472287823560208401614594565b91505092959194509250565b60008060408385031215614740578182fd5b614749836145f8565b9150602083013561475981615800565b809150509250929050565b60008060408385031215614776578182fd5b61477f836145f8565b946020939093013593505050565b60006020828403121561479e578081fd5b8151610fc181615800565b6000602082840312156147ba578081fd5b5051919050565b6000602082840312156147d2578081fd5b8135610fc18161580e565b6000602082840312156147ee578081fd5b8151610fc18161580e565b60006020828403121561480a578081fd5b813567ffffffffffffffff811115614820578182fd5b6139838482850161460f565b60006020828403121561483d578081fd5b5035919050565b60008060408385031215614856578182fd5b82359150602083013567ffffffffffffffff811115614873578182fd5b61487f8582860161460f565b9150509250929050565b6000806040838503121561489b578182fd5b50508035926020909101359150565b600081518084526148c28160208601602086016157d4565b601f01601f19169290920160200192915050565b600081546001808216600081146148f4576001811461490b5761493d565b60ff198316865260028304607f168601935061493d565b600283048560005260208060002060005b838110156149355781548a82015290850190820161491c565b505050860193505b50505092915050565b600082516149588184602087016157d4565b9190910192915050565b6000610fc182846148d6565b600083516149808184602088016157d4565b8351908301906149948183602088016157d4565b01949350505050565b600083516149af8184602088016157d4565b600160fd1b9083019081526149c760018201856148d6565b95945050505050565b600084516149e28184602089016157d4565b600160fd1b9083019081526149fa60018201866148d6565b905061016160f51b81528351614a178160028401602088016157d4565b0160020195945050505050565b60008551614a36818460208a016157d4565b600160fd1b90830181815290614a4f60018301886148d6565b915061016160f51b82528551614a6c816002850160208a016157d4565b60029201918201528351614a878160038401602088016157d4565b016003019695505050505050565b60008651614aa7818460208b016157d4565b602d60f81b9083019081528651614ac5816001840160208b016157d4565b808201915050600160fd1b806001830152614ae360028301886148d6565b915061016160f51b82528551614b00816002850160208a016157d4565b60029201918201528351614b1b8160038401602088016157d4565b01600301979650505050505050565b7f436865636b2074686520746f6b656e20616c6c6f77616e63653a0000000000008152601a8101929092526201016160ed1b603a830152603d820152605d0190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bfa908301846148aa565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b0385168252836020830152606060408301526149c760608301846148aa565b6020808252825182820181905260009190848201906040850190845b81811015614c7c57835183529284019291840191600101614c60565b50909695505050505050565b901515815260200190565b600060208252610fc160208301846148aa565b60006101808252614cbb61018083018f6148aa565b602083019d909d5250604081019a909a5260608a0198909852608089019690965260a088019490945260c087019290925260e086015261010085015261012084015261014083015261016090910152919050565b60006020808301818452828554600180821660008114614d365760018114614d5457614d8c565b60028304607f16855260ff1983166040890152606088019350614d8c565b60028304808652614d648a6157c8565b885b82811015614d825781548b820160400152908401908801614d66565b8a01604001955050505b5091979650505050505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526021908201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656040820152603760f91b606082015260800190565b6020808252601b908201527f43686f6f7365206120746f6b656e2077697468696e2072616e67650000000000604082015260600190565b6020808252818101527f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d65604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526022908201527f4c6576656c206d757374206265206174206c65617374203320746f20636c61696040820152616d2160f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601b908201527f43484f4f5345204120746f6b656e2057495448494e2052414e47450000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526019908201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f6620746f6b656e7360b01b606082015260800190565b6020808252601d908201527f596f7520646f6e2774206861766520656e6f75676820746f6b656e732e000000604082015260600190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526018908201527f746f6b656e20616c7265616479206d6178206c6576656c210000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f43616e277420626520706574206265796f6e6420313021000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601d908201527f546f6b656e206861736e2774206265656e206d696e7465642079657421000000604082015260600190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526028908201527f4865792c20796f75722077616c6c657420646f65736e2774206f776e207468696040820152677320746f6b656e2160c01b606082015260800190565b6020808252601c908201527f596f7520646f6e2774206861766520656e6f7567682065726332302e00000000604082015260600190565b6020808252600d908201526c4e656564206d6f72652058502160981b604082015260600190565b948552602085019390935260408401919091526060830152608082015260a00190565b60009081526020902090565b60005b838110156157ef5781810151838201526020016157d7565b8381111561233e5750506000910152565b801515811461210a57600080fd5b6001600160e01b03198116811461210a57600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220894288b241e664fe44003ab5e4f4100f869ab74f16c9e32a456764ef45aca72864736f6c63430007060033
Deployed Bytecode Sourcemap
69741:17300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10236:150;;;;;;;;;;-1:-1:-1;10236:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51521:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54325:221::-;;;;;;;;;;-1:-1:-1;54325:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53855:404::-;;;;;;;;;;-1:-1:-1;53855:404:0;;;;;:::i;:::-;;:::i;:::-;;70187:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53333:211::-;;;;;;;;;;;;;:::i;70550:47::-;;;;;;;;;;-1:-1:-1;70550:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;74478:534::-;;;;;;;;;;-1:-1:-1;74478:534:0;;;;;:::i;:::-;;:::i;55215:305::-;;;;;;;;;;-1:-1:-1;55215:305:0;;;;;:::i;:::-;;:::i;71155:71::-;;;;;;;;;;;;;:::i;53095:162::-;;;;;;;;;;-1:-1:-1;53095:162:0;;;;;:::i;:::-;;:::i;77225:902::-;;;;;;;;;;-1:-1:-1;77225:902:0;;;;;:::i;:::-;;:::i;72606:126::-;;;;;;;;;;-1:-1:-1;72606:126:0;;;;;:::i;:::-;;:::i;71940:131::-;;;;;;;;;;;;;:::i;74045:::-;;;;;;;;;;-1:-1:-1;74045:131:0;;;;;:::i;:::-;;:::i;76180:1039::-;;;;;;;;;;-1:-1:-1;76180:1039:0;;;;;:::i;:::-;;:::i;55591:151::-;;;;;;;;;;-1:-1:-1;55591:151:0;;;;;:::i;:::-;;:::i;75293:278::-;;;;;;;;;;-1:-1:-1;75293:278:0;;;;;:::i;:::-;;:::i;73910:123::-;;;;;;;;;;-1:-1:-1;73910:123:0;;;;;:::i;:::-;;:::i;71311:31::-;;;;;;;;;;;;;:::i;53621:172::-;;;;;;;;;;-1:-1:-1;53621:172:0;;;;;:::i;:::-;;:::i;71384:22::-;;;;;;;;;;;;;:::i;79540:180::-;;;;;;;;;;-1:-1:-1;79540:180:0;;;;;:::i;:::-;;:::i;73690:95::-;;;;;;;;;;;;;:::i;73797:101::-;;;;;;;;;;;;;:::i;51277:177::-;;;;;;;;;;-1:-1:-1;51277:177:0;;;;;:::i;:::-;;:::i;69861:29::-;;;;;;;;;;;;;:::i;52914:97::-;;;;;;;;;;;;;:::i;50994:221::-;;;;;;;;;;-1:-1:-1;50994:221:0;;;;;:::i;:::-;;:::i;66250:148::-;;;;;;;;;;;;;:::i;71079:72::-;;;;;;;;;;;;;:::i;75040:247::-;;;;;;;;;;-1:-1:-1;75040:247:0;;;;;:::i;:::-;;:::i;70111:55::-;;;;;;;;;;;;;:::i;78222:109::-;;;;;;;;;;-1:-1:-1;78222:109:0;;;;;:::i;:::-;;:::i;78538:540::-;;;;;;;;;;-1:-1:-1;78538:540:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65599:87::-;;;;;;;;;;;;;:::i;78405:121::-;;;;;;;;;;-1:-1:-1;78405:121:0;;;;;:::i;:::-;;:::i;51690:104::-;;;;;;;;;;;;;:::i;78133:83::-;;;;;;;;;;-1:-1:-1;78133:83:0;;;;;:::i;:::-;;:::i;69958:31::-;;;;;;;;;;;;;:::i;71349:::-;;;;;;;;;;;;;:::i;72740:108::-;;;;;;;;;;-1:-1:-1;72740:108:0;;;;;:::i;:::-;;:::i;72988:99::-;;;;;;;;;;;;;:::i;54618:295::-;;;;;;;;;;-1:-1:-1;54618:295:0;;;;;:::i;:::-;;:::i;75577:252::-;;;;;;;;;;-1:-1:-1;75577:252:0;;;;;:::i;:::-;;:::i;75835:339::-;;;;;;;;;;-1:-1:-1;75835:339:0;;;;;:::i;:::-;;:::i;55813:285::-;;;;;;;;;;-1:-1:-1;55813:285:0;;;;;:::i;:::-;;:::i;81401:642::-;;;;;;;;;;-1:-1:-1;81401:642:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;79738:1407::-;;;;;;:::i;:::-;;:::i;73099:581::-;;;;;;;;;;-1:-1:-1;73099:581:0;;;;;:::i;:::-;;:::i;70662:28::-;;;;;;;;;;;;;:::i;82478:1982::-;;;;;;;;;;-1:-1:-1;82478:1982:0;;;;;:::i;:::-;;:::i;79129:175::-;;;;;;;;;;-1:-1:-1;79129:175:0;;;;;:::i;:::-;;:::i;72194:402::-;;;;;;;;;;-1:-1:-1;72194:402:0;;;;;:::i;:::-;;:::i;54984:164::-;;;;;;;;;;-1:-1:-1;54984:164:0;;;;;:::i;:::-;;:::i;70287:32::-;;;;;;;;;;;;;:::i;74182:155::-;;;;;;;;;;-1:-1:-1;74182:155:0;;;;;:::i;:::-;;:::i;66553:244::-;;;;;;;;;;-1:-1:-1;66553:244:0;;;;;:::i;:::-;;:::i;70237:41::-;;;;;;;;;;;;;:::i;74346:123::-;;;;;;;;;;-1:-1:-1;74346:123:0;;;;;:::i;:::-;;:::i;82055:411::-;;;;;;;;;;-1:-1:-1;82055:411:0;;;;;:::i;:::-;;:::i;79370:131::-;;;;;;;;;;;;;:::i;72080:102::-;;;;;;;;;;-1:-1:-1;72080:102:0;;;;;:::i;:::-;;:::i;72860:116::-;;;;;;;;;;-1:-1:-1;72860:116:0;;;;;:::i;:::-;;:::i;10236:150::-;-1:-1:-1;;;;;;10345:33:0;;10321:4;10345:33;;;;;;;;;;;;;10236:150;;;;:::o;51521:100::-;51608:5;51601:12;;;;;;;;-1:-1:-1;;51601:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51575:13;;51601:12;;51608:5;;51601:12;;51608:5;51601:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51521:100;:::o;54325:221::-;54401:7;54429:16;54437:7;54429;:16::i;:::-;54421:73;;;;-1:-1:-1;;;54421:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;54514:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54514:24:0;;54325:221::o;53855:404::-;53936:13;53952:23;53967:7;53952:14;:23::i;:::-;53936:39;;54000:5;-1:-1:-1;;;;;53994:11:0;:2;-1:-1:-1;;;;;53994:11:0;;;53986:57;;;;-1:-1:-1;;;53986:57:0;;;;;;;:::i;:::-;54080:5;-1:-1:-1;;;;;54064:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;54064:21:0;;:69;;;;54089:44;54113:5;54120:12;:10;:12::i;54089:44::-;54056:161;;;;-1:-1:-1;;;54056:161:0;;;;;;;:::i;:::-;54230:21;54239:2;54243:7;54230:8;:21::i;:::-;53855:404;;;:::o;70187:41::-;70227:1;70187:41;:::o;53333:211::-;53394:7;53515:21;:12;:19;:21::i;:::-;53508:28;;53333:211;:::o;70550:47::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70550:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74478:534::-;74554:10;74534:16;74542:7;74534;:16::i;:::-;-1:-1:-1;;;;;74534:30:0;;74526:83;;;;-1:-1:-1;;;74526:83:0;;;;;;;:::i;:::-;74625:18;;;;:9;:18;;;;;:24;;;74653:1;-1:-1:-1;74625:29:0;74617:76;;;;-1:-1:-1;;;74617:76:0;;;;;;;:::i;:::-;74861:15;;74701:11;74830:18;;;:9;:18;;;;;:24;;;;74801:23;;;;74746:34;;;;;74701:11;;74715:162;;74861:15;;74715:141;;74731:124;;74830:24;;74731:94;;;;74782:12;74732:13;:63::i;:::-;74731:69;;:94::i;:124::-;74715:11;;;:15;:141::i;:::-;:145;;:162::i;:::-;74882:18;;;;:9;:18;;;;;;;74919:12;74882:34;;;;:49;74936:5;;:30;;-1:-1:-1;;;74936:30:0;;74701:176;;-1:-1:-1;;;;;;74936:5:0;;:10;;:30;;74947:10;;74701:176;;74936:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74976:31;74988:10;75000:6;74976:31;;;;;;;:::i;:::-;;;;;;;;74478:534;;:::o;55215:305::-;55376:41;55395:12;:10;:12::i;:::-;55409:7;55376:18;:41::i;:::-;55368:103;;;;-1:-1:-1;;;55368:103:0;;;;;;;:::i;:::-;55484:28;55494:4;55500:2;55504:7;55484:9;:28::i;71155:71::-;;;-1:-1:-1;;;;;71155:71:0;;:::o;53095:162::-;-1:-1:-1;;;;;53219:20:0;;53192:7;53219:20;;;:13;:20;;;;;:30;;53243:5;53219:23;:30::i;:::-;53212:37;;53095:162;;;;;:::o;77225:902::-;77280:18;;;;:9;:18;;;;;:23;;;77307:2;-1:-1:-1;77280:29:0;77272:65;;;;-1:-1:-1;;;77272:65:0;;;;;;;:::i;:::-;77348:18;;;;:9;:18;;;;;:23;;;77375:1;-1:-1:-1;77345:678:0;;77473:18;;;;:9;:18;;;;;:23;;;77437:6;;:60;;77473:23;77437:31;;77448:19;77437:10;:31::i;:60::-;77397:5;;:36;;-1:-1:-1;;;77397:36:0;;-1:-1:-1;;;;;77397:5:0;;;;:15;;:36;;77421:10;;77397:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:100;;77389:141;;;;-1:-1:-1;;;77389:141:0;;;;;;;:::i;:::-;77539:13;77591:18;;;:9;:18;;;;;:23;;;77555:6;;:60;;77591:23;77555:31;;77566:19;77555:10;:31::i;:60::-;77644:5;;:42;;-1:-1:-1;;;77644:42:0;;77539:76;;-1:-1:-1;77624:17:0;;-1:-1:-1;;;;;77644:5:0;;;;:15;;:42;;77660:10;;77680:4;;77644:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77785:5;;:42;;-1:-1:-1;;;77785:42:0;;77624:62;;-1:-1:-1;77709:21:0;;;;;-1:-1:-1;;;;;77785:5:0;;;;:15;;:42;;77801:10;;77821:4;;77785:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77834:8;77739:104;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77701:144;;;;;-1:-1:-1;;;77701:144:0;;;;;;;;:::i;:::-;-1:-1:-1;77854:5:0;;:55;;-1:-1:-1;;;77854:55:0;;-1:-1:-1;;;;;77854:5:0;;;;:18;;:55;;77873:10;;77893:4;;77900:8;;77854:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77936:5:0;;:30;;-1:-1:-1;;;77936:30:0;;77918:15;;-1:-1:-1;;;;;77936:5:0;;:15;;:30;;77960:4;;77936:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77975:5;;77990:11;;77975:39;;-1:-1:-1;;;77975:39:0;;77918:48;;-1:-1:-1;;;;;;77975:5:0;;;;:14;;:39;;77990:11;;77918:48;;77975:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77345:678;;;;78053:18;;;;:9;:18;;;;;:23;;;:30;;78081:1;78053:27;:30::i;:::-;78027:18;;;;:9;:18;;;;;;;:23;;:56;;;;78093:29;;;;;78102:10;;78037:7;;78093:29;:::i;:::-;;;;;;;;77225:902;:::o;72606:126::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72697:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;72606:126:::0;:::o;71940:131::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72035:28:::1;::::0;72003:21:::1;::::0;72035:10:::1;::::0;:28;::::1;;;::::0;72003:21;;71988:12:::1;72035:28:::0;71988:12;72035:28;72003:21;72035:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;74045:131:::0;71802:12;:10;:12::i;:::-;-1:-1:-1;;;;;71784:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71784:30:0;;71776:75;;;;-1:-1:-1;;;71776:75:0;;;;;;;:::i;:::-;74132:21:::1;::::0;;;:9:::1;:21;::::0;;;;;:26:::1;;:36:::0;74045:131::o;76180:1039::-;76256:10;76236:16;76244:7;76236;:16::i;:::-;-1:-1:-1;;;;;76236:30:0;;76228:83;;;;-1:-1:-1;;;76228:83:0;;;;;;;:::i;:::-;76324:18;;;;:9;:18;;;;;:24;;;76352:1;-1:-1:-1;76324:29:0;76316:66;;;;-1:-1:-1;;;76316:66:0;;;;;;;:::i;:::-;76472:18;;;;:9;:18;;;;;:24;;;76435:6;;:62;;76472:24;76435:32;;76446:20;76435:10;:32::i;:62::-;76395:5;;:36;;-1:-1:-1;;;76395:36:0;;-1:-1:-1;;;;;76395:5:0;;;;:15;;:36;;76419:10;;76395:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:102;;76387:144;;;;-1:-1:-1;;;76387:144:0;;;;;;;:::i;:::-;76536:17;76568:18;;;:9;:18;;;;;:24;;;76556:37;;:11;:37::i;:::-;76612:18;;;;:9;:18;;;;;:21;;;76536:57;;-1:-1:-1;76612:37:0;-1:-1:-1;76612:37:0;76604:63;;;;-1:-1:-1;;;76604:63:0;;;;;;;:::i;:::-;76672:15;76717:18;;;:9;:18;;;;;:24;;;76690:6;;:52;;76717:24;76690:22;;76701:10;76690;:22::i;:52::-;76767:5;;:42;;-1:-1:-1;;;76767:42:0;;76672:70;;-1:-1:-1;76747:17:0;;-1:-1:-1;;;;;76767:5:0;;;;:15;;:42;;76783:10;;76803:4;;76767:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76747:62;;76841:10;76828:9;:23;;76820:61;;;;-1:-1:-1;;;76820:61:0;;;;;;;:::i;:::-;76886:5;;:57;;-1:-1:-1;;;76886:57:0;;-1:-1:-1;;;;;76886:5:0;;;;:18;;:57;;76905:10;;76925:4;;76932:10;;76886:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76948:18:0;;;;:9;:18;;;;;:21;;;:37;;;;;;;-1:-1:-1;77017:24:0;;;;:31;;:28;:31::i;:::-;76990:18;;;;:9;:18;;;;;;:24;;:58;;;;77097:5;;:30;;-1:-1:-1;;;77097:30:0;;76990:18;;-1:-1:-1;;;;;77097:5:0;;:15;;:30;;77121:4;;77097:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77132:5;;77147:11;;77132:39;;-1:-1:-1;;;77132:39:0;;77079:48;;-1:-1:-1;;;;;;77132:5:0;;;;:14;;:39;;77147:11;;77079:48;;77132:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77181:33;77194:10;77206:7;77181:33;;;;;;;:::i;:::-;;;;;;;;76180:1039;;;;;:::o;55591:151::-;55695:39;55712:4;55718:2;55722:7;55695:39;;;;;;;;;;;;:16;:39::i;75293:278::-;75361:10;75341:16;75349:7;75341;:16::i;:::-;-1:-1:-1;;;;;75341:30:0;;75333:83;;;;-1:-1:-1;;;75333:83:0;;;;;;;:::i;:::-;75435:11;;75421;;75435:36;;75451:19;75435:15;:36::i;:::-;75476:5;;:30;;-1:-1:-1;;;75476:30:0;;75421:50;;-1:-1:-1;;;;;;75476:5:0;;:10;;:30;;75487:10;;75421:50;;75476:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75516:31;75528:10;75540:6;75516:31;;;;;;;:::i;:::-;;;;;;;;75552:14;75558:7;75552:5;:14::i;73910:123::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;73994:13:::1;:31:::0;;-1:-1:-1;;;;;;73994:31:0::1;-1:-1:-1::0;;;;;73994:31:0;;;::::1;::::0;;;::::1;::::0;;73910:123::o;71311:31::-;;;;:::o;53621:172::-;53696:7;;53738:22;:12;53754:5;53738:15;:22::i;:::-;-1:-1:-1;53716:44:0;53621:172;-1:-1:-1;;;53621:172:0:o;71384:22::-;;;;:::o;79540:180::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;79629:13:::1;::::0;::::1;;:22;79621:57;;;;-1:-1:-1::0;;;79621:57:0::1;;;;;;;:::i;:::-;79689:23:::0;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;73690:95::-:0;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;73765:12:::1;::::0;;-1:-1:-1;;73749:28:0;::::1;73765:12;::::0;;;::::1;;;73764:13;73749:28:::0;;::::1;;::::0;;73690:95::o;73797:101::-;73877:13;;-1:-1:-1;;;;;73877:13:0;73797:101;:::o;51277:177::-;51349:7;51376:70;51393:7;51376:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;69861:29::-;;;;;;;;;;;;;;;-1:-1:-1;;69861:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52914:97::-;52995:8;52988:15;;;;;;;;-1:-1:-1;;52988:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52962:13;;52988:15;;52995:8;;52988:15;;52995:8;52988:15;;;;;;;;;;;;;;;;;;;;;;;;50994:221;51066:7;-1:-1:-1;;;;;51094:19:0;;51086:74;;;;-1:-1:-1;;;51086:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51178:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;66250:148::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;66341:6:::1;::::0;66320:40:::1;::::0;66357:1:::1;::::0;-1:-1:-1;;;;;66341:6:0::1;::::0;66320:40:::1;::::0;66357:1;;66320:40:::1;66371:6;:19:::0;;-1:-1:-1;;;;;;66371:19:0::1;::::0;;66250:148::o;71079:72::-;;;-1:-1:-1;;;;;71079:72:0;;:::o;75040:247::-;75266:15;;75099:4;75235:18;;;:9;:18;;;;;:24;;;;75206:23;;;;75151:34;;;;;75099:4;;75120:162;;75266:15;;75120:141;;75136:124;;75235:24;;75136:94;;;;75187:12;75137:13;:63::i;70111:55::-;70148:18;70111:55;:::o;78222:109::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;78298:11:::1;:28:::0;78222:109::o;78538:540::-;78599:16;78629:18;78650:17;78660:6;78650:9;:17::i;:::-;78629:38;-1:-1:-1;78682:15:0;78678:393;;-1:-1:-1;;78759:16:0;;;78773:1;78759:16;;;;;;;;78752:23;;78678:393;78808:23;78848:10;78834:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78834:25:0;;78808:51;;78874:13;78902:130;78926:10;78918:5;:18;78902:130;;;78982:34;79002:6;79010:5;78982:19;:34::i;:::-;78966:6;78973:5;78966:13;;;;;;;;;;;;;;;;;:50;78938:7;;78902:130;;;-1:-1:-1;79053:6:0;-1:-1:-1;79046:13:0;;-1:-1:-1;79046:13:0;78678:393;78538:540;;;;:::o;65599:87::-;65672:6;;-1:-1:-1;;;;;65672:6:0;65599:87;:::o;78405:121::-;78477:7;78504:14;:3;78512:5;78504:7;:14::i;51690:104::-;51779:7;51772:14;;;;;;;;-1:-1:-1;;51772:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51746:13;;51772:14;;51779:7;;51772:14;;51779:7;51772:14;;;;;;;;;;;;;;;;;;;;;;;;78133:83;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;78196:6:::1;:15:::0;78133:83::o;69958:31::-;;;;;;;;;;;;;;;-1:-1:-1;;69958:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71349;;;;:::o;72740:108::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72820:20:::1;72832:7;72820:11;:20::i;:::-;72740:108:::0;:::o;72988:99::-;73070:9;73063:16;;;;;;;;-1:-1:-1;;73063:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73037:13;;73063:16;;73070:9;;73063:16;;73070:9;73063:16;;;;;;;;;;;;;;;;;;;;;;;;54618:295;54733:12;:10;:12::i;:::-;-1:-1:-1;;;;;54721:24:0;:8;-1:-1:-1;;;;;54721:24:0;;;54713:62;;;;-1:-1:-1;;;54713:62:0;;;;;;;:::i;:::-;54833:8;54788:18;:32;54807:12;:10;:12::i;:::-;-1:-1:-1;;;;;54788:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;54788:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;54788:53:0;;;;;;;;;;;54872:12;:10;:12::i;:::-;-1:-1:-1;;;;;54857:48:0;;54896:8;54857:48;;;;;;:::i;:::-;;;;;;;;54618:295;;:::o;75577:252::-;75706:7;75691:22;;75738:1;75724:98;75745:12;75741:1;:16;75724:98;;;75803:7;75799:11;;75779:31;;;;;75759:3;;75724:98;;75835:339;75899:42;75918:10;75930;75899:18;:42::i;:::-;75891:51;;;;;;75979:21;;;;:9;:21;;;;;:25;;;75961:15;:43;75953:52;;;;;;76044:24;:15;71470:6;76044:19;:24::i;:::-;76016:21;;;;:9;:21;;;;;;;:25;;;:52;;;;76079:24;;;;:38;;71437:6;76079:38;;;76127:39;;;;;76143:10;;76026;;76127:39;:::i;55813:285::-;55945:41;55964:12;:10;:12::i;:::-;55978:7;55945:18;:41::i;:::-;55937:103;;;;-1:-1:-1;;;55937:103:0;;;;;;;:::i;:::-;56051:39;56065:4;56071:2;56075:7;56084:5;56051:13;:39::i;:::-;55813:285;;;;:::o;81401:642::-;81468:4;;;;;81609:13;:11;:13::i;:::-;81596:9;:26;;81588:68;;;;-1:-1:-1;;;81588:68:0;;;;;;;:::i;:::-;81739:20;;;;:9;:20;;;;;:26;;;;81708:25;;;;;81675:99;;81707:66;;81771:1;;81707:59;;81708:25;81707:31;:59::i;:66::-;81675:20;;;;:9;:20;;;;;:27;;;;:31;:99::i;:::-;81841:20;;;;:9;:20;;;;;:26;;;;81811:25;;;;;81776:101;;81811:64;;81873:1;;81811:57;;:25;:29;:57::i;:64::-;81776:20;;;;:9;:20;;;;;:29;;;;:33;:101::i;:::-;81943:20;;;;:9;:20;;;;;:26;;;;81913:25;;;;;81879:100;;81913:64;;81975:1;;81913:57;;:25;:29;:57::i;:64::-;81879:20;;;;:9;:20;;;;;:28;;;;:32;:100::i;:::-;81981:20;;;;:9;:20;;;;;;:26;;;;82009:25;;;;;81667:368;;;;;-1:-1:-1;81981:26:0;-1:-1:-1;82009:25:0;;-1:-1:-1;81401:642:0;-1:-1:-1;;81401:642:0:o;79738:1407::-;79812:12;;;;;;;79804:58;;;;-1:-1:-1;;;79804:58:0;;;;;;;:::i;:::-;79898:1;79881:14;:18;:56;;;;;70227:1;79903:14;:34;;79881:56;79873:101;;;;-1:-1:-1;;;79873:101:0;;;;;;;:::i;:::-;70274:4;79993:33;80011:14;79993:13;:11;:13::i;:::-;:17;;:33::i;:::-;:47;;79985:102;;;;-1:-1:-1;;;79985:102:0;;;;;;;:::i;:::-;80119:30;70148:18;80134:14;80119;:30::i;:::-;80106:9;:43;;80098:87;;;;-1:-1:-1;;;80098:87:0;;;;;;;:::i;:::-;80210:6;80206:930;80226:14;80222:1;:18;80206:930;;;80262:14;80279:13;:11;:13::i;:::-;80294:1;80279:16;80262:33;;70274:4;80314:13;:11;:13::i;:::-;:26;80310:815;;;80382:1;80349:9;:24;80359:13;:11;:13::i;:::-;80349:24;;;;;;;;;;;:30;;:34;;;;80422:1;80390:9;:24;80400:13;:11;:13::i;:::-;80390:24;;;;;;;;;;;:29;;:33;;;;80468:1;80430:9;:24;80440:13;:11;:13::i;:::-;80430:24;;;;;;;;;;;:35;;:39;;;;80507:15;80476:9;:24;80486:13;:11;:13::i;:::-;80476:24;;;;;;;;;;;:28;;:46;;;;80572:12;80529:9;:24;80539:13;:11;:13::i;:::-;80529:24;;;;;;;;;;;-1:-1:-1;80529:24:0;:40;;:55;80625:38;80640:22;80658:3;80640:13;:11;:13::i;:22::-;80625:14;:38::i;:::-;80591:9;:24;80601:13;:11;:13::i;:::-;80591:24;;;;;;;;;;;-1:-1:-1;80591:24:0;:31;;:72;80706:37;80721:21;80739:2;80721:13;:11;:13::i;80706:37::-;80670:9;:24;80680:13;:11;:13::i;:::-;80670:24;;;;;;;;;;;-1:-1:-1;80670:24:0;:33;;:73;80785:38;80800:22;80818:3;80800:13;:11;:13::i;80785:38::-;80750:9;:24;80760:13;:11;:13::i;:::-;80750:24;;;;;;;;;;;-1:-1:-1;80750:24:0;:32;;:73;80863:37;80878:21;80896:2;80878:13;:11;:13::i;80863:37::-;80830:9;:24;80840:13;:11;:13::i;:::-;80830:24;;;;;;;;;;;-1:-1:-1;80830:24:0;:30;;:70;80939:37;80954:21;80972:2;80954:13;:11;:13::i;80939:37::-;80907:9;:24;80917:13;:11;:13::i;:::-;80907:24;;;;;;;;;;;-1:-1:-1;80907:24:0;:29;;:69;81013:15;;:22;;81033:1;81013:19;:22::i;:::-;80995:15;:40;81042:32;81052:10;81064:9;81042;:32::i;:::-;81086:23;81099:9;81086:23;;;;;;:::i;:::-;;;;;;;;80310:815;-1:-1:-1;80242:3:0;;80206:930;;73099:581;73172:13;73206:16;73214:7;73206;:16::i;:::-;73198:76;;;;-1:-1:-1;;;73198:76:0;;;;;;;:::i;:::-;73287:18;73308:9;:7;:9::i;:::-;73287:30;;73328:19;73350:10;:8;:10::i;:::-;73468:18;;;;:9;:18;;;;;:24;;;73328:32;;-1:-1:-1;73496:1:0;-1:-1:-1;73464:209:0;;73544:5;73551:18;:7;:16;:18::i;:::-;73527:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73513:58;;;;;;73464:209;73635:4;73641:18;:7;:16;:18::i;70662:28::-;;;;:::o;82478:1982::-;82537:13;82583;:11;:13::i;:::-;82572:8;:24;82563:66;;;;-1:-1:-1;;;82563:66:0;;;;;;;:::i;:::-;82643:19;;;;:9;:19;;;;;:25;;;82672:1;-1:-1:-1;82640:92:0;;82696:19;;;;:9;:19;;;;;;;;;82689:31;;;;;;-1:-1:-1;;82689:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82696:19;;82689:31;;82696:19;82689:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82640:92;82745:19;;;;:9;:19;;;;;:25;;;82774:1;82745:30;82742:299;;;82791:21;;:::i;:::-;82837:13;82878:20;;82851:19;;;;:9;:19;;;;;:24;;;82878:20;82851:47;;;;;82837:62;;;;;;;;;;;;;;;;;;82827:72;;;;;;;-1:-1:-1;;82827:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82837:62;82827:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;82832:1;82827:7;;;;;;;;;;:72;82914:20;82961:4;82914:20;82961:7;;;;;;;;;82975:19;;;;:9;:19;;;;;;;82944:56;;;;;;:::i;:::-;;;;-1:-1:-1;;82944:56:0;;;;;;;;;;-1:-1:-1;83016:13:0;;-1:-1:-1;;83016:13:0;82742:299;83048:19;;;;:9;:19;;;;;:25;;;83077:1;-1:-1:-1;83045:392:0;;83094:21;;:::i;:::-;83140:13;83181:20;;83154:19;;;;:9;:19;;;;;:24;;;83181:20;83154:47;;;;;83140:62;;;;;;;;;;;;;;;;;;83130:72;;;;;;;-1:-1:-1;;83130:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83140:62;83130:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83135:1;83130:7;;;;;;;;;;:72;;;;83227:8;83263;:15;;;;83236:9;:19;83246:8;83236:19;;;;;;;;;;;:24;;;:42;;;;;;83227:52;;;;;;;;;;;;;;;;;;83217:62;;;;;;;-1:-1:-1;;83217:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83227:52;83217:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83222:1;83217:7;;;;;;;;;;;;;;;:62;;;;83341:7;;83294:20;83355:19;;;:9;:19;;;;;;83388:7;;;;83324:72;;83294:20;;83324:72;;83341:7;83355:19;;83388:7;83324:72;;:::i;83045:392::-;83444:19;;;;:9;:19;;;;;:25;;;83473:1;-1:-1:-1;83441:1012:0;;83490:21;;:::i;:::-;83536:13;83577:20;;83550:19;;;;:9;:19;;;;;:24;;;83577:20;83550:47;;;;;83536:62;;;;;;;;;;;;;;;;;;83526:72;;;;;;;-1:-1:-1;;83526:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83536:62;83526:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83531:1;83526:7;;;;;;;;;;:72;;;;83623:8;83659;:15;;;;83632:9;:19;83642:8;83632:19;;;;;;;;;;;:24;;;:42;;;;;;83623:52;;;;;;;;;;;;;;;;;;83613:62;;;;;;;-1:-1:-1;;83613:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83623:52;83613:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83618:1;83613:7;;;;;;;;;;:62;;;;83691:8;83727;:15;;;;83700:9;:19;83710:8;83700:19;;;;;;;;;;;:24;;;:42;;;;;;83691:52;;;;;;;;;;;;;;;;;;83681:62;;;;;;;-1:-1:-1;;83681:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83691:52;83681:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83686:1;83681:7;;;;;;;;;;;;;;;:62;;;;83805:7;;83758:20;83819:19;;;:9;:19;;;;;;83852:7;;;;83866;;;;83788:86;;83758:20;;83788:86;;83805:7;83819:19;;83852:7;;83788:86;;:::i;83441:1012::-;83939:21;;:::i;:::-;83985:13;84026:20;;83999:19;;;;:9;:19;;;;;:24;;;84026:20;83999:47;;;;;83985:62;;;;;;;;;;;;;;;;;;83975:72;;;;;;;-1:-1:-1;;83975:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83985:62;83975:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;83980:1;83975:7;;;;;;;;;;:72;;;;84072:8;84108;:15;;;;84081:9;:19;84091:8;84081:19;;;;;;;;;;;:24;;;:42;;;;;;84072:52;;;;;;;;;;;;;;;;;;84062:62;;;;;;;-1:-1:-1;;84062:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84072:52;84062:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;84067:1;84062:7;;;;;;;;;;:62;;;;84140:8;84176;:15;;;;84149:9;:19;84159:8;84149:19;;;;;;;;;;;:24;;;:42;;;;;;84140:52;;;;;;;;;;;;;;;;;;84130:62;;;;;;;-1:-1:-1;;84130:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84140:52;84130:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;84135:1;84130:7;;;;;;;;;;:62;;;;84208:11;84247;:18;;;;84220:9;:19;84230:8;84220:19;;;;;;;;;;;:24;;;:45;;;;;;84208:58;;;;;;;;;;;;;;;;;;84198:68;;;;;;;-1:-1:-1;;84198:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84208:58;84198:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;84203:1;84198:7;;;;;;;;;;;;;;;:68;;;;84328:7;;;;84342;;84281:20;84356:19;;;:9;:19;;;;;;84389:7;;;;84403;;;;84311:101;;84281:20;;84311:101;;84328:7;84342;84356:19;;84389:7;;84311:101;;:::i;79129:175::-;79181:13;79221;:11;:13::i;:::-;79215:3;:19;79207:59;;;;-1:-1:-1;;;79207:59:0;;;;;;;:::i;:::-;79284:12;79277:19;;;;;;;;;;;;;-1:-1:-1;;79277:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;79284:12;79277:19;;79284:12;79277:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79129:175;;;:::o;72194:402::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72290:11:::1;72304:13;:11;:13::i;:::-;72290:27;;72353:1;72336:14;:18;:52;;;;;72376:12;;72358:14;:30;;72336:52;72328:97;;;;-1:-1:-1::0;;;72328:97:0::1;;;;;;;:::i;:::-;72441:6;72436:95;72457:14;72453:1;:18;72436:95;;;72493:26;72503:3;72517:1;72508:6;:10;72493:9;:26::i;:::-;72473:3;;72436:95;;;-1:-1:-1::0;72556:12:0::1;::::0;:32:::1;::::0;72573:14;72556:16:::1;:32::i;:::-;72541:12;:47:::0;-1:-1:-1;;;72194:402:0:o;54984:164::-;-1:-1:-1;;;;;55105:25:0;;;55081:4;55105:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;54984:164::o;70287:32::-;;;;;;;;;:::o;74182:155::-;71802:12;:10;:12::i;:::-;-1:-1:-1;;;;;71784:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71784:30:0;;71776:75;;;;-1:-1:-1;;;71776:75:0;;;;;;;:::i;:::-;74290:21:::1;::::0;;;:9:::1;:21;::::0;;;;:32:::1;;::::0;:39:::1;::::0;74327:1:::1;74290:36;:39::i;:::-;74255:21;::::0;;;:9:::1;:21;::::0;;;;;:32:::1;;:74:::0;74182:155::o;66553:244::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66642:22:0;::::1;66634:73;;;;-1:-1:-1::0;;;66634:73:0::1;;;;;;;:::i;:::-;66744:6;::::0;66723:38:::1;::::0;-1:-1:-1;;;;;66723:38:0;;::::1;::::0;66744:6:::1;::::0;66723:38:::1;::::0;66744:6:::1;::::0;66723:38:::1;66772:6;:17:::0;;-1:-1:-1;;;;;;66772:17:0::1;-1:-1:-1::0;;;;;66772:17:0;;;::::1;::::0;;;::::1;::::0;;66553:244::o;70237:41::-;70274:4;70237:41;:::o;74346:123::-;71802:12;:10;:12::i;:::-;-1:-1:-1;;;;;71784:30:0;:14;:12;:14::i;:::-;-1:-1:-1;;;;;71784:30:0;;71776:75;;;;-1:-1:-1;;;71776:75:0;;;;;;;:::i;:::-;74429:21:::1;::::0;;;:9:::1;:21;::::0;;;;;:24:::1;;:32:::0;74346:123::o;82055:411::-;82163:10;82142:17;82150:8;82142:7;:17::i;:::-;-1:-1:-1;;;;;82142:31:0;;82134:84;;;;-1:-1:-1;;;82134:84:0;;;;;;;:::i;:::-;82274:19;;;;:9;:19;;;;;;;82261:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82237:20;82250:5;82237:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;82229:111;;;;-1:-1:-1;;;82229:111:0;;;;;;;:::i;:::-;82351:19;;;;:9;:19;;;;;;;;:32;;;;;;;;:::i;:::-;;82409:39;82420:10;82432:8;82442:5;82409:39;;;;;;;;:::i;79370:131::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;79427:13:::1;:21:::0;;-1:-1:-1;;79427:21:0::1;79444:4;79427:21;::::0;;79464:29:::1;::::0;::::1;::::0;::::1;::::0;79480:12:::1;::::0;79464:29:::1;:::i;:::-;;;;;;;;79370:131::o:0;72080:102::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72150:5:::1;:24:::0;;-1:-1:-1;;;;;;72150:24:0::1;-1:-1:-1::0;;;;;72150:24:0;;;::::1;::::0;;;::::1;::::0;;72080:102::o;72860:116::-;65830:12;:10;:12::i;:::-;-1:-1:-1;;;;;65819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65819:23:0;;65811:68;;;;-1:-1:-1;;;65811:68:0;;;;;;;:::i;:::-;72945:23;;::::1;::::0;:9:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;57565:127::-:0;57630:4;57654:30;:12;57676:7;57654:21;:30::i;668:106::-;756:10;668:106;:::o;63583:192::-;63658:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;63658:29:0;-1:-1:-1;;;;;63658:29:0;;;;;;;;:24;;63712:23;63658:24;63712:14;:23::i;:::-;-1:-1:-1;;;;;63703:46:0;;;;;;;;;;;63583:192;;:::o;44279:123::-;44348:7;44375:19;44383:3;44375:7;:19::i;14677:220::-;14735:7;14759:6;14755:20;;-1:-1:-1;14774:1:0;14767:8;;14755:20;14798:5;;;14802:1;14798;:5;:1;14822:5;;;;;:10;14814:56;;;;-1:-1:-1;;;14814:56:0;;;;;;;:::i;15375:153::-;15433:7;15465:1;15461;:5;15453:44;;;;-1:-1:-1;;;15453:44:0;;;;;;;:::i;:::-;15519:1;15515;:5;;;;;;;15375:153;-1:-1:-1;;;15375:153:0:o;57859:355::-;57952:4;57977:16;57985:7;57977;:16::i;:::-;57969:73;;;;-1:-1:-1;;;57969:73:0;;;;;;;:::i;:::-;58053:13;58069:23;58084:7;58069:14;:23::i;:::-;58053:39;;58122:5;-1:-1:-1;;;;;58111:16:0;:7;-1:-1:-1;;;;;58111:16:0;;:51;;;;58155:7;-1:-1:-1;;;;;58131:31:0;:20;58143:7;58131:11;:20::i;:::-;-1:-1:-1;;;;;58131:31:0;;58111:51;:94;;;;58166:39;58190:5;58197:7;58166:23;:39::i;:::-;58103:103;57859:355;-1:-1:-1;;;;57859:355:0:o;60995:599::-;61120:4;-1:-1:-1;;;;;61093:31:0;:23;61108:7;61093:14;:23::i;:::-;-1:-1:-1;;;;;61093:31:0;;61085:85;;;;-1:-1:-1;;;61085:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61207:16:0;;61199:65;;;;-1:-1:-1;;;61199:65:0;;;;;;;:::i;:::-;61277:39;61298:4;61304:2;61308:7;61277:20;:39::i;:::-;61381:29;61398:1;61402:7;61381:8;:29::i;:::-;-1:-1:-1;;;;;61423:19:0;;;;;;:13;:19;;;;;:35;;61450:7;61423:26;:35::i;:::-;-1:-1:-1;;;;;;61469:17:0;;;;;;:13;:17;;;;;:30;;61491:7;61469:21;:30::i;:::-;-1:-1:-1;61512:29:0;:12;61529:7;61538:2;61512:16;:29::i;:::-;;61578:7;61574:2;-1:-1:-1;;;;;61559:27:0;61568:4;-1:-1:-1;;;;;61559:27:0;;;;;;;;;;;60995:599;;;:::o;36070:137::-;36141:7;36176:22;36180:3;36192:5;36176:3;:22::i;13798:179::-;13856:7;13888:5;;;13912:6;;;;13904:46;;;;-1:-1:-1;;;13904:46:0;;;;;;;:::i;60113:545::-;60173:13;60189:23;60204:7;60189:14;:23::i;:::-;60173:39;;60243:48;60264:5;60279:1;60283:7;60243:20;:48::i;:::-;60332:29;60349:1;60353:7;60332:8;:29::i;:::-;60420:19;;;;:10;:19;;;;;60414:33;;-1:-1:-1;;60414:33:0;;;;;;;;;;;:38;60410:97;;60476:19;;;;:10;:19;;;;;60469:26;;;:::i;:::-;-1:-1:-1;;;;;60519:20:0;;;;;;:13;:20;;;;;:36;;60547:7;60519:27;:36::i;:::-;-1:-1:-1;60568:28:0;:12;60588:7;60568:19;:28::i;:::-;-1:-1:-1;60614:36:0;;60642:7;;60638:1;;-1:-1:-1;;;;;60614:36:0;;;;;60638:1;;60614:36;60113:545;;:::o;44741:236::-;44821:7;;;;44881:22;44885:3;44897:5;44881:3;:22::i;:::-;44850:53;;;;-1:-1:-1;44741:236:0;-1:-1:-1;;;;;44741:236:0:o;46027:213::-;46134:7;46185:44;46190:3;46210;46216:12;46185:4;:44::i;:::-;46177:53;-1:-1:-1;46027:213:0;;;;;;:::o;14260:158::-;14318:7;14351:1;14346;:6;;14338:49;;;;-1:-1:-1;;;14338:49:0;;;;;;;:::i;:::-;-1:-1:-1;14405:5:0;;;14260:158::o;62195:100::-;62268:19;;;;:8;;:19;;;;;:::i;56980:272::-;57094:28;57104:4;57110:2;57114:7;57094:9;:28::i;:::-;57141:48;57164:4;57170:2;57174:7;57183:5;57141:22;:48::i;:::-;57133:111;;;;-1:-1:-1;;;57133:111:0;;;;;;;:::i;81158:231::-;81220:4;;81252:27;:9;81266:12;81252:13;:27::i;:::-;81236:43;;81290:9;81334:8;81317:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;81307:37;;;;;;81302:43;;81290:55;;81370:11;;81363:4;:18;;;;;;;81158:231;-1:-1:-1;;;;81158:231:0:o;58557:110::-;58633:26;58643:2;58647:7;58633:26;;;;;;;;;;;;:9;:26::i;46491:746::-;46547:13;46768:10;46764:53;;-1:-1:-1;46795:10:0;;;;;;;;;;;;-1:-1:-1;;;46795:10:0;;;;;;46764:53;46842:5;46827:12;46883:78;46890:9;;46883:78;;46916:8;;46947:2;46939:10;;;;46883:78;;;46971:19;47003:6;46993:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46993:17:0;-1:-1:-1;47065:5:0;;-1:-1:-1;46971:39:0;-1:-1:-1;;;47037:10:0;;47081:117;47088:9;;47081:117;;47157:2;47150:4;:9;47145:2;:14;47132:29;;47114:6;47121:7;;;;;;;47114:15;;;;;;;;;;;:47;-1:-1:-1;;;;;47114:47:0;;;;;;;;-1:-1:-1;47184:2:0;47176:10;;;;47081:117;;;-1:-1:-1;47222:6:0;46491:746;-1:-1:-1;;;;46491:746:0:o;44040:151::-;44124:4;44148:35;44158:3;44178;44148:9;:35::i;40858:110::-;40941:19;;40858:110::o;35157:137::-;35227:4;35251:35;35259:3;35279:5;35251:7;:35::i;34850:131::-;34917:4;34941:32;34946:3;34966:5;34941:4;:32::i;43463:185::-;43552:4;43576:64;43581:3;43601;-1:-1:-1;;;;;43615:23:0;;43576:4;:64::i;31108:204::-;31203:18;;31175:7;;31203:26;-1:-1:-1;31195:73:0;;;;-1:-1:-1;;;31195:73:0;;;;;;;:::i;:::-;31286:3;:11;;31298:5;31286:18;;;;;;;;;;;;;;;;31279:25;;31108:204;;;;:::o;43814:142::-;43891:4;43915:33;43923:3;43943;43915:7;:33::i;41323:279::-;41427:19;;41390:7;;;;41427:27;-1:-1:-1;41419:74:0;;;;-1:-1:-1;;;41419:74:0;;;;;;;:::i;:::-;41506:22;41531:3;:12;;41544:5;41531:19;;;;;;;;;;;;;;;;;;41506:44;;41569:5;:10;;;41581:5;:12;;;41561:33;;;;;41323:279;;;;;:::o;42820:319::-;42914:7;42953:17;;;:12;;;:17;;;;;;43004:12;42989:13;42981:36;;;;-1:-1:-1;;;42981:36:0;;;;;;;;:::i;:::-;;43071:3;:12;;43095:1;43084:8;:12;43071:26;;;;;;;;;;;;;;;;;;:33;;;43064:40;;;42820:319;;;;;:::o;62860:604::-;62981:4;63008:15;:2;-1:-1:-1;;;;;63008:13:0;;:15::i;:::-;63003:60;;-1:-1:-1;63047:4:0;63040:11;;63003:60;63073:23;63099:252;-1:-1:-1;;;63212:12:0;:10;:12::i;:::-;63239:4;63258:7;63280:5;63115:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;63115:181:0;;;;;;;-1:-1:-1;;;;;63115:181:0;;;;;;;;;;;63099:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63099:15:0;;;:252;:15;:252::i;:::-;63073:278;;63362:13;63389:10;63378:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;63429:26:0;-1:-1:-1;;;63429:26:0;;-1:-1:-1;;;62860:604:0;;;;;;:::o;58894:250::-;58990:18;58996:2;59000:7;58990:5;:18::i;:::-;59027:54;59058:1;59062:2;59066:7;59075:5;59027:22;:54::i;:::-;59019:117;;;;-1:-1:-1;;;59019:117:0;;;;;;;:::i;40638:125::-;40709:4;40733:17;;;:12;;;;;:17;;;;;;:22;;;40638:125::o;28810:1544::-;28876:4;29015:19;;;:12;;;:19;;;;;;29051:15;;29047:1300;;29486:18;;-1:-1:-1;;29437:14:0;;;;29486:22;;;;29413:21;;29486:3;;:22;;29773;;;;;;;;;;;;;;29753:42;;29919:9;29890:3;:11;;29902:13;29890:26;;;;;;;;;;;;;;;;;;;:38;;;;29996:23;;;30038:1;29996:12;;;:23;;;;;;30022:17;;;29996:43;;30148:17;;29996:3;;30148:17;;;;;;;;;;;;;;;;;;;;;;30243:3;:12;;:19;30256:5;30243:19;;;;;;;;;;;30236:26;;;30286:4;30279:11;;;;;;;;29047:1300;30330:5;30323:12;;;;;28220:414;28283:4;28305:21;28315:3;28320:5;28305:9;:21::i;:::-;28300:327;;-1:-1:-1;28343:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;28526:18;;28504:19;;;:12;;;:19;;;;;;:40;;;;28559:11;;28300:327;-1:-1:-1;28610:5:0;28603:12;;38138:692;38214:4;38349:17;;;:12;;;:17;;;;;;38383:13;38379:444;;-1:-1:-1;;38468:38:0;;;;;;;;;;;;;;;;;;38450:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;38665:19;;38645:17;;;:12;;;:17;;;;;;;:39;38699:11;;38379:444;38779:5;38743:3;:12;;38767:1;38756:8;:12;38743:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38806:5;38799:12;;;;;39005:1549;39069:4;39204:17;;;:12;;;:17;;;;;;39238:13;;39234:1313;;39670:19;;-1:-1:-1;;39623:12:0;;;;39670:23;;;;39599:21;;39670:3;;:23;;39967;;;;;;;;;;;;;;;;39938:52;;40115:9;40085:3;:12;;40098:13;40085:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;40205:14;;40192:28;;:12;;;:28;;;;;40223:17;;;40192:48;;40349:18;;40192:3;;40349:18;;;;;;;;;;;;;;-1:-1:-1;;40349:18:0;;;;;;;;;;;;;;;;;;;;;40445:17;;;:12;;;:17;;;;;;40438:24;;;;40349:18;-1:-1:-1;40479:11:0;;-1:-1:-1;;;;40479:11:0;19239:422;19606:20;19645:8;;;19239:422::o;22157:195::-;22260:12;22292:52;22314:6;22322:4;22328:1;22331:12;22292:21;:52::i;59480:404::-;-1:-1:-1;;;;;59560:16:0;;59552:61;;;;-1:-1:-1;;;59552:61:0;;;;;;;:::i;:::-;59633:16;59641:7;59633;:16::i;:::-;59632:17;59624:58;;;;-1:-1:-1;;;59624:58:0;;;;;;;:::i;:::-;59695:45;59724:1;59728:2;59732:7;59695:20;:45::i;:::-;-1:-1:-1;;;;;59753:17:0;;;;;;:13;:17;;;;;:30;;59775:7;59753:21;:30::i;:::-;-1:-1:-1;59796:29:0;:12;59813:7;59822:2;59796:16;:29::i;:::-;-1:-1:-1;59843:33:0;;59868:7;;-1:-1:-1;;;;;59843:33:0;;;59860:1;;59843:33;;59860:1;;59843:33;59480:404;;:::o;23209:530::-;23336:12;23394:5;23369:21;:30;;23361:81;;;;-1:-1:-1;;;23361:81:0;;;;;;;:::i;:::-;23461:18;23472:6;23461:10;:18::i;:::-;23453:60;;;;-1:-1:-1;;;23453:60:0;;;;;;;:::i;:::-;23587:12;23601:23;23628:6;-1:-1:-1;;;;;23628:11:0;23648:5;23656:4;23628:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23586:75;;;;23679:52;23697:7;23706:10;23718:12;23679:17;:52::i;:::-;23672:59;23209:530;-1:-1:-1;;;;;;;23209:530:0:o;25749:742::-;25864:12;25893:7;25889:595;;;-1:-1:-1;25924:10:0;25917:17;;25889:595;26038:17;;:21;26034:439;;26301:10;26295:17;26362:15;26349:10;26345:2;26341:19;26334:44;26249:148;26444:12;26437:20;;-1:-1:-1;;;26437:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:589:1;;110:18;151:2;143:6;140:14;137:2;;;157:9;137:2;197;191:9;270:2;247:17;;-1:-1:-1;;243:31:1;231:44;;277:4;227:55;297:18;;;317:22;;;294:46;291:2;;;343:9;291:2;370;363:22;418;;;403:6;-1:-1:-1;403:6:1;455:16;;;452:25;-1:-1:-1;449:2:1;;;490:1;487;480:12;449:2;540:6;535:3;528:4;520:6;516:17;503:44;595:1;588:4;579:6;571;567:19;563:30;556:41;;;90:513;;;;;:::o;608:175::-;678:20;;-1:-1:-1;;;;;727:31:1;;717:42;;707:2;;773:1;770;763:12;788:233;;886:3;879:4;871:6;867:17;863:27;853:2;;908:5;901;894:20;853:2;934:81;1011:3;1002:6;989:20;982:4;974:6;970:17;934:81;:::i;1026:198::-;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;1229:274::-;;;1358:2;1346:9;1337:7;1333:23;1329:32;1326:2;;;1379:6;1371;1364:22;1326:2;1407:31;1428:9;1407:31;:::i;:::-;1397:41;;1457:40;1493:2;1482:9;1478:18;1457:40;:::i;:::-;1447:50;;1316:187;;;;;:::o;1508:342::-;;;;1654:2;1642:9;1633:7;1629:23;1625:32;1622:2;;;1675:6;1667;1660:22;1622:2;1703:31;1724:9;1703:31;:::i;:::-;1693:41;;1753:40;1789:2;1778:9;1774:18;1753:40;:::i;:::-;1743:50;;1840:2;1829:9;1825:18;1812:32;1802:42;;1612:238;;;;;:::o;1855:702::-;;;;;2027:3;2015:9;2006:7;2002:23;1998:33;1995:2;;;2049:6;2041;2034:22;1995:2;2077:31;2098:9;2077:31;:::i;:::-;2067:41;;2127:40;2163:2;2152:9;2148:18;2127:40;:::i;:::-;2117:50;;2214:2;2203:9;2199:18;2186:32;2176:42;;2269:2;2258:9;2254:18;2241:32;2296:18;2288:6;2285:30;2282:2;;;2333:6;2325;2318:22;2282:2;2361:22;;2414:4;2406:13;;2402:27;-1:-1:-1;2392:2:1;;2448:6;2440;2433:22;2392:2;2476:75;2543:7;2538:2;2525:16;2520:2;2516;2512:11;2476:75;:::i;:::-;2466:85;;;1985:572;;;;;;;:::o;2562:329::-;;;2688:2;2676:9;2667:7;2663:23;2659:32;2656:2;;;2709:6;2701;2694:22;2656:2;2737:31;2758:9;2737:31;:::i;:::-;2727:41;;2818:2;2807:9;2803:18;2790:32;2831:30;2855:5;2831:30;:::i;:::-;2880:5;2870:15;;;2646:245;;;;;:::o;2896:266::-;;;3025:2;3013:9;3004:7;3000:23;2996:32;2993:2;;;3046:6;3038;3031:22;2993:2;3074:31;3095:9;3074:31;:::i;:::-;3064:41;3152:2;3137:18;;;;3124:32;;-1:-1:-1;;;2983:179:1:o;3167:257::-;;3287:2;3275:9;3266:7;3262:23;3258:32;3255:2;;;3308:6;3300;3293:22;3255:2;3345:9;3339:16;3364:30;3388:5;3364:30;:::i;3429:194::-;;3552:2;3540:9;3531:7;3527:23;3523:32;3520:2;;;3573:6;3565;3558:22;3520:2;-1:-1:-1;3601:16:1;;3510:113;-1:-1:-1;3510:113:1:o;3628:257::-;;3739:2;3727:9;3718:7;3714:23;3710:32;3707:2;;;3760:6;3752;3745:22;3707:2;3804:9;3791:23;3823:32;3849:5;3823:32;:::i;3890:261::-;;4012:2;4000:9;3991:7;3987:23;3983:32;3980:2;;;4033:6;4025;4018:22;3980:2;4070:9;4064:16;4089:32;4115:5;4089:32;:::i;4156:344::-;;4278:2;4266:9;4257:7;4253:23;4249:32;4246:2;;;4299:6;4291;4284:22;4246:2;4344:9;4331:23;4377:18;4369:6;4366:30;4363:2;;;4414:6;4406;4399:22;4363:2;4442:52;4486:7;4477:6;4466:9;4462:22;4442:52;:::i;4505:190::-;;4617:2;4605:9;4596:7;4592:23;4588:32;4585:2;;;4638:6;4630;4623:22;4585:2;-1:-1:-1;4666:23:1;;4575:120;-1:-1:-1;4575:120:1:o;4899:412::-;;;5038:2;5026:9;5017:7;5013:23;5009:32;5006:2;;;5059:6;5051;5044:22;5006:2;5100:9;5087:23;5077:33;;5161:2;5150:9;5146:18;5133:32;5188:18;5180:6;5177:30;5174:2;;;5225:6;5217;5210:22;5174:2;5253:52;5297:7;5288:6;5277:9;5273:22;5253:52;:::i;:::-;5243:62;;;4996:315;;;;;:::o;5316:258::-;;;5445:2;5433:9;5424:7;5420:23;5416:32;5413:2;;;5466:6;5458;5451:22;5413:2;-1:-1:-1;;5494:23:1;;;5564:2;5549:18;;;5536:32;;-1:-1:-1;5403:171:1:o;5579:259::-;;5660:5;5654:12;5687:6;5682:3;5675:19;5703:63;5759:6;5752:4;5747:3;5743:14;5736:4;5729:5;5725:16;5703:63;:::i;:::-;5820:2;5799:15;-1:-1:-1;;5795:29:1;5786:39;;;;5827:4;5782:50;;5630:208;-1:-1:-1;;5630:208:1:o;5843:705::-;;5939:5;5933:12;5964:1;5996:2;5985:9;5981:18;6013:1;6008:126;;;;6148:1;6143:399;;;;5974:568;;6008:126;-1:-1:-1;;6041:24:1;;6029:37;;6114:1;6099:17;;6118:4;6095:28;6086:38;;;-1:-1:-1;6008:126:1;;6143:399;6193:1;6182:9;6178:17;6218:5;6215:1;6208:16;6247:4;6292:2;6289:1;6279:16;6317:1;6331:165;6345:6;6342:1;6339:13;6331:165;;;6423:14;;6410:11;;;6403:35;6466:16;;;;6360:10;;6331:165;;;-1:-1:-1;;;6516:16:1;;;-1:-1:-1;5974:568:1;;;;5906:642;;;;:::o;6553:274::-;;6720:6;6714:13;6736:53;6782:6;6777:3;6770:4;6762:6;6758:17;6736:53;:::i;:::-;6805:16;;;;;6690:137;-1:-1:-1;;6690:137:1:o;6832:204::-;;6987:43;7026:3;7018:6;6987:43;:::i;7041:470::-;;7258:6;7252:13;7274:53;7320:6;7315:3;7308:4;7300:6;7296:17;7274:53;:::i;:::-;7390:13;;7349:16;;;;7412:57;7390:13;7349:16;7446:4;7434:17;;7412:57;:::i;:::-;7485:20;;7228:283;-1:-1:-1;;;;7228:283:1:o;7516:524::-;;7831:6;7825:13;7847:53;7893:6;7888:3;7881:4;7873:6;7869:17;7847:53;:::i;:::-;-1:-1:-1;;;7922:16:1;;;7947:18;;;7981:53;8031:1;8020:13;;8012:6;7981:53;:::i;:::-;7974:60;7801:239;-1:-1:-1;;;;;7801:239:1:o;8045:851::-;;8509:6;8503:13;8525:53;8571:6;8566:3;8559:4;8551:6;8547:17;8525:53;:::i;:::-;-1:-1:-1;;;8600:16:1;;;8625:18;;;8662:53;8712:1;8701:13;;8693:6;8662:53;:::i;:::-;8652:63;;-1:-1:-1;;;8731:2:1;8724:16;8771:6;8765:13;8787:62;8840:8;8836:1;8832:2;8828:10;8821:4;8813:6;8809:17;8787:62;:::i;:::-;8869:17;8888:1;8865:25;;8479:417;-1:-1:-1;;;;;8479:417:1:o;8901:1197::-;;9514:6;9508:13;9530:53;9576:6;9571:3;9564:4;9556:6;9552:17;9530:53;:::i;:::-;-1:-1:-1;;;9605:16:1;;;9652:17;;;9605:16;9688:53;9738:1;9727:13;;9719:6;9688:53;:::i;:::-;9678:63;;-1:-1:-1;;;9757:2:1;9750:16;9797:6;9791:13;9813:62;9866:8;9862:1;9858:2;9854:10;9847:4;9839:6;9835:17;9813:62;:::i;:::-;9935:1;9894:17;;9927:10;;;9920:22;9967:13;;9989:62;9967:13;10038:1;10030:10;;10023:4;10011:17;;9989:62;:::i;:::-;10071:17;10090:1;10067:25;;9484:614;-1:-1:-1;;;;;;9484:614:1:o;10103:1526::-;;10865:6;10859:13;10881:53;10927:6;10922:3;10915:4;10907:6;10903:17;10881:53;:::i;:::-;-1:-1:-1;;;10956:16:1;;;10981:18;;;11024:13;;11046:65;11024:13;11098:1;11087:13;;11080:4;11068:17;;11046:65;:::i;:::-;11141:8;11134:5;11130:20;11120:30;;;-1:-1:-1;;;11200:2:1;11196:1;11192:2;11188:10;11181:22;11222:50;11269:1;11265:2;11261:10;11253:6;11222:50;:::i;:::-;11212:60;;-1:-1:-1;;;11288:2:1;11281:16;11328:6;11322:13;11344:62;11397:8;11393:1;11389:2;11385:10;11378:4;11370:6;11366:17;11344:62;:::i;:::-;11466:1;11425:17;;11458:10;;;11451:22;11498:13;;11520:62;11498:13;11569:1;11561:10;;11554:4;11542:17;;11520:62;:::i;:::-;11602:17;11621:1;11598:25;;10835:794;-1:-1:-1;;;;;;;10835:794:1:o;11634:544::-;12005:28;11993:41;;12059:2;12050:12;;12043:28;;;;-1:-1:-1;;;12096:2:1;12087:12;;12080:27;12132:2;12123:12;;12116:28;12169:2;12160:12;;11983:195::o;12183:182::-;12312:19;;;12356:2;12347:12;;12302:63::o;12370:203::-;-1:-1:-1;;;;;12534:32:1;;;;12516:51;;12504:2;12489:18;;12471:102::o;12578:312::-;-1:-1:-1;;;;;12816:15:1;;;12798:34;;12868:15;;12863:2;12848:18;;12841:43;12748:2;12733:18;;12715:175::o;12895:383::-;-1:-1:-1;;;;;13161:15:1;;;13143:34;;13213:15;;;;13208:2;13193:18;;13186:43;13260:2;13245:18;;13238:34;;;;13093:2;13078:18;;13060:218::o;13283:506::-;-1:-1:-1;;;;;13568:15:1;;;13550:34;;13620:15;;13615:2;13600:18;;13593:43;13667:2;13652:18;;13645:34;;;13715:3;13710:2;13695:18;;13688:31;;;13283:506;;13736:47;;13763:19;;13755:6;13736:47;:::i;:::-;13728:55;13502:287;-1:-1:-1;;;;;;13502:287:1:o;13794:282::-;-1:-1:-1;;;;;13994:32:1;;;;13976:51;;14058:2;14043:18;;14036:34;13964:2;13949:18;;13931:145::o;14081:397::-;;14323:1;14319;14314:3;14310:11;14306:19;14298:6;14294:32;14283:9;14276:51;14363:6;14358:2;14347:9;14343:18;14336:34;14406:2;14401;14390:9;14386:18;14379:30;14426:46;14468:2;14457:9;14453:18;14445:6;14426:46;:::i;14762:635::-;14933:2;14985:21;;;15055:13;;14958:18;;;15077:22;;;14762:635;;14933:2;15156:15;;;;15130:2;15115:18;;;14762:635;15202:169;15216:6;15213:1;15210:13;15202:169;;;15277:13;;15265:26;;15346:15;;;;15311:12;;;;15238:1;15231:9;15202:169;;;-1:-1:-1;15388:3:1;;14913:484;-1:-1:-1;;;;;;14913:484:1:o;15402:187::-;15567:14;;15560:22;15542:41;;15530:2;15515:18;;15497:92::o;15817:221::-;;15966:2;15955:9;15948:21;15986:46;16028:2;16017:9;16013:18;16005:6;15986:46;:::i;16043:1016::-;;16502:3;16491:9;16484:22;16523:47;16565:3;16554:9;16550:19;16542:6;16523:47;:::i;:::-;16601:2;16586:18;;16579:34;;;;-1:-1:-1;16644:2:1;16629:18;;16622:34;;;;16687:2;16672:18;;16665:34;;;;16730:3;16715:19;;16708:35;;;;16774:3;16759:19;;16752:35;;;;16818:3;16803:19;;16796:35;;;;16862:3;16847:19;;16840:35;16906:3;16891:19;;16884:35;16950:3;16935:19;;16928:35;16994:3;16979:19;;16972:36;17039:3;17024:19;;;17017:36;16515:55;16474:585;-1:-1:-1;16474:585:1:o;17064:982::-;;17202:2;17242;17231:9;17227:18;17272:2;17261:9;17254:21;17295:4;17331:6;17325:13;17357:1;17389:2;17378:9;17374:18;17406:1;17401:178;;;;17593:1;17588:432;;;;17367:653;;17401:178;17456:1;17441:17;;17460:4;17437:28;17422:44;;-1:-1:-1;;17506:24:1;;17501:2;17486:18;;17479:52;17566:2;17551:18;;;-1:-1:-1;17401:178:1;;17588:432;17638:1;17627:9;17623:17;17668:6;17660;17653:22;17703:42;17738:6;17703:42;:::i;:::-;17767:4;17784:180;17798:6;17795:1;17792:13;17784:180;;;17891:14;;17867:17;;;17886:2;17863:26;17856:50;17934:16;;;;17813:10;;17784:180;;;17988:17;;18007:2;17984:26;;-1:-1:-1;;;17367:653:1;-1:-1:-1;18037:3:1;;17182:864;-1:-1:-1;;;;;;;17182:864:1:o;18051:398::-;18253:2;18235:21;;;18292:2;18272:18;;;18265:30;18331:34;18326:2;18311:18;;18304:62;-1:-1:-1;;;18397:2:1;18382:18;;18375:32;18439:3;18424:19;;18225:224::o;18454:397::-;18656:2;18638:21;;;18695:2;18675:18;;;18668:30;18734:34;18729:2;18714:18;;18707:62;-1:-1:-1;;;18800:2:1;18785:18;;18778:31;18841:3;18826:19;;18628:223::o;18856:351::-;19058:2;19040:21;;;19097:2;19077:18;;;19070:30;19136:29;19131:2;19116:18;;19109:57;19198:2;19183:18;;19030:177::o;19212:356::-;19414:2;19396:21;;;19433:18;;;19426:30;19492:34;19487:2;19472:18;;19465:62;19559:2;19544:18;;19386:182::o;19573:414::-;19775:2;19757:21;;;19814:2;19794:18;;;19787:30;19853:34;19848:2;19833:18;;19826:62;-1:-1:-1;;;19919:2:1;19904:18;;19897:48;19977:3;19962:19;;19747:240::o;19992:402::-;20194:2;20176:21;;;20233:2;20213:18;;;20206:30;20272:34;20267:2;20252:18;;20245:62;-1:-1:-1;;;20338:2:1;20323:18;;20316:36;20384:3;20369:19;;20166:228::o;20399:352::-;20601:2;20583:21;;;20640:2;20620:18;;;20613:30;20679;20674:2;20659:18;;20652:58;20742:2;20727:18;;20573:178::o;20756:351::-;20958:2;20940:21;;;20997:2;20977:18;;;20970:30;21036:29;21031:2;21016:18;;21009:57;21098:2;21083:18;;20930:177::o;21522:356::-;21724:2;21706:21;;;21743:18;;;21736:30;21802:34;21797:2;21782:18;;21775:62;21869:2;21854:18;;21696:182::o;21883:400::-;22085:2;22067:21;;;22124:2;22104:18;;;22097:30;22163:34;22158:2;22143:18;;22136:62;-1:-1:-1;;;22229:2:1;22214:18;;22207:34;22273:3;22258:19;;22057:226::o;22288:349::-;22490:2;22472:21;;;22529:2;22509:18;;;22502:30;22568:27;22563:2;22548:18;;22541:55;22628:2;22613:18;;22462:175::o;22642:355::-;22844:2;22826:21;;;22883:2;22863:18;;;22856:30;22922:33;22917:2;22902:18;;22895:61;22988:2;22973:18;;22816:181::o;23002:354::-;23204:2;23186:21;;;23243:2;23223:18;;;23216:30;23282:32;23277:2;23262:18;;23255:60;23347:2;23332:18;;23176:180::o;23361:402::-;23563:2;23545:21;;;23602:2;23582:18;;;23575:30;23641:34;23636:2;23621:18;;23614:62;-1:-1:-1;;;23707:2:1;23692:18;;23685:36;23753:3;23738:19;;23535:228::o;23768:408::-;23970:2;23952:21;;;24009:2;23989:18;;;23982:30;24048:34;24043:2;24028:18;;24021:62;-1:-1:-1;;;24114:2:1;24099:18;;24092:42;24166:3;24151:19;;23942:234::o;24181:398::-;24383:2;24365:21;;;24422:2;24402:18;;;24395:30;24461:34;24456:2;24441:18;;24434:62;-1:-1:-1;;;24527:2:1;24512:18;;24505:32;24569:3;24554:19;;24355:224::o;24584:350::-;24786:2;24768:21;;;24825:2;24805:18;;;24798:30;24864:28;24859:2;24844:18;;24837:56;24925:2;24910:18;;24758:176::o;24939:351::-;25141:2;25123:21;;;25180:2;25160:18;;;25153:30;25219:29;25214:2;25199:18;;25192:57;25281:2;25266:18;;25113:177::o;25295:420::-;25497:2;25479:21;;;25536:2;25516:18;;;25509:30;25575:34;25570:2;25555:18;;25548:62;25646:26;25641:2;25626:18;;25619:54;25705:3;25690:19;;25469:246::o;25720:349::-;25922:2;25904:21;;;25961:2;25941:18;;;25934:30;26000:27;25995:2;25980:18;;25973:55;26060:2;26045:18;;25894:175::o;26074:406::-;26276:2;26258:21;;;26315:2;26295:18;;;26288:30;26354:34;26349:2;26334:18;;26327:62;-1:-1:-1;;;26420:2:1;26405:18;;26398:40;26470:3;26455:19;;26248:232::o;26485:406::-;26687:2;26669:21;;;26726:2;26706:18;;;26699:30;26765:34;26760:2;26745:18;;26738:62;-1:-1:-1;;;26831:2:1;26816:18;;26809:40;26881:3;26866:19;;26659:232::o;26896:353::-;27098:2;27080:21;;;27137:2;27117:18;;;27110:30;27176:31;27171:2;27156:18;;27149:59;27240:2;27225:18;;27070:179::o;27254:398::-;27456:2;27438:21;;;27495:2;27475:18;;;27468:30;27534:34;27529:2;27514:18;;27507:62;-1:-1:-1;;;27600:2:1;27585:18;;27578:32;27642:3;27627:19;;27428:224::o;27657:356::-;27859:2;27841:21;;;27878:18;;;27871:30;27937:34;27932:2;27917:18;;27910:62;28004:2;27989:18;;27831:182::o;28018:348::-;28220:2;28202:21;;;28259:2;28239:18;;;28232:30;28298:26;28293:2;28278:18;;28271:54;28357:2;28342:18;;28192:174::o;28371:397::-;28573:2;28555:21;;;28612:2;28592:18;;;28585:30;28651:34;28646:2;28631:18;;28624:62;-1:-1:-1;;;28717:2:1;28702:18;;28695:31;28758:3;28743:19;;28545:223::o;28773:408::-;28975:2;28957:21;;;29014:2;28994:18;;;28987:30;29053:34;29048:2;29033:18;;29026:62;-1:-1:-1;;;29119:2:1;29104:18;;29097:42;29171:3;29156:19;;28947:234::o;29186:347::-;29388:2;29370:21;;;29427:2;29407:18;;;29400:30;29466:25;29461:2;29446:18;;29439:53;29524:2;29509:18;;29360:173::o;29538:356::-;29740:2;29722:21;;;29759:18;;;29752:30;29818:34;29813:2;29798:18;;29791:62;29885:2;29870:18;;29712:182::o;29899:405::-;30101:2;30083:21;;;30140:2;30120:18;;;30113:30;30179:34;30174:2;30159:18;;30152:62;-1:-1:-1;;;30245:2:1;30230:18;;30223:39;30294:3;30279:19;;30073:231::o;30309:411::-;30511:2;30493:21;;;30550:2;30530:18;;;30523:30;30589:34;30584:2;30569:18;;30562:62;-1:-1:-1;;;30655:2:1;30640:18;;30633:45;30710:3;30695:19;;30483:237::o;30725:353::-;30927:2;30909:21;;;30966:2;30946:18;;;30939:30;31005:31;31000:2;30985:18;;30978:59;31069:2;31054:18;;30899:179::o;31083:399::-;31285:2;31267:21;;;31324:2;31304:18;;;31297:30;31363:34;31358:2;31343:18;;31336:62;-1:-1:-1;;;31429:2:1;31414:18;;31407:33;31472:3;31457:19;;31257:225::o;31487:397::-;31689:2;31671:21;;;31728:2;31708:18;;;31701:30;31767:34;31762:2;31747:18;;31740:62;-1:-1:-1;;;31833:2:1;31818:18;;31811:31;31874:3;31859:19;;31661:223::o;31889:346::-;32091:2;32073:21;;;32130:2;32110:18;;;32103:30;-1:-1:-1;;;32164:2:1;32149:18;;32142:52;32226:2;32211:18;;32063:172::o;32240:413::-;32442:2;32424:21;;;32481:2;32461:18;;;32454:30;32520:34;32515:2;32500:18;;32493:62;-1:-1:-1;;;32586:2:1;32571:18;;32564:47;32643:3;32628:19;;32414:239::o;32658:353::-;32860:2;32842:21;;;32899:2;32879:18;;;32872:30;32938:31;32933:2;32918:18;;32911:59;33002:2;32987:18;;32832:179::o;33016:404::-;33218:2;33200:21;;;33257:2;33237:18;;;33230:30;33296:34;33291:2;33276:18;;33269:62;-1:-1:-1;;;33362:2:1;33347:18;;33340:38;33410:3;33395:19;;33190:230::o;33425:352::-;33627:2;33609:21;;;33666:2;33646:18;;;33639:30;33705;33700:2;33685:18;;33678:58;33768:2;33753:18;;33599:178::o;33782:337::-;33984:2;33966:21;;;34023:2;34003:18;;;33996:30;-1:-1:-1;;;34057:2:1;34042:18;;34035:43;34110:2;34095:18;;33956:163::o;34306:463::-;34565:25;;;34621:2;34606:18;;34599:34;;;;34664:2;34649:18;;34642:34;;;;34707:2;34692:18;;34685:34;34750:3;34735:19;;34728:35;34552:3;34537:19;;34519:250::o;34774:132::-;;34845:17;;;34895:4;34879:21;;;34835:71::o;34911:258::-;34983:1;34993:113;35007:6;35004:1;35001:13;34993:113;;;35083:11;;;35077:18;35064:11;;;35057:39;35029:2;35022:10;34993:113;;;35124:6;35121:1;35118:13;35115:2;;;-1:-1:-1;;35159:1:1;35141:16;;35134:27;34964:205::o;35174:120::-;35262:5;35255:13;35248:21;35241:5;35238:32;35228:2;;35284:1;35281;35274:12;35299:133;-1:-1:-1;;;;;;35375:32:1;;35365:43;;35355:2;;35422:1;35419;35412:12
Swarm Source
ipfs://894288b241e664fe44003ab5e4f4100f869ab74f16c9e32a456764ef45aca728
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.