Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 16 from a total of 16 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint Nft Against... | 13916540 | 1520 days ago | IN | 0 ETH | 0.01779588 | ||||
| Mint Nft Against... | 13851006 | 1530 days ago | IN | 0 ETH | 0.00428681 | ||||
| Mint Nft Against... | 13846587 | 1531 days ago | IN | 0 ETH | 0.01433719 | ||||
| Mint Nft Against... | 13832238 | 1533 days ago | IN | 0 ETH | 0.00224737 | ||||
| Mint Nft Against... | 12770235 | 1699 days ago | IN | 0 ETH | 0.00444875 | ||||
| Mint Nft Against... | 12698819 | 1710 days ago | IN | 0 ETH | 0.00519947 | ||||
| Mint Nft Against... | 12686135 | 1712 days ago | IN | 0 ETH | 0.00678961 | ||||
| Mint Nft Against... | 12651222 | 1718 days ago | IN | 0 ETH | 0.00333627 | ||||
| Mint Nft Against... | 12651176 | 1718 days ago | IN | 0 ETH | 0.00063086 | ||||
| Mint Nft Against... | 12651154 | 1718 days ago | IN | 0 ETH | 0.00058233 | ||||
| Mint Nft Against... | 12651139 | 1718 days ago | IN | 0 ETH | 0.00058233 | ||||
| Mint Nft Against... | 12651105 | 1718 days ago | IN | 0 ETH | 0.00336422 | ||||
| Mint Nft Against... | 12649912 | 1718 days ago | IN | 0 ETH | 0.00278023 | ||||
| Mint Nft Against... | 12638814 | 1720 days ago | IN | 0 ETH | 0.00312235 | ||||
| Mint Nft Against... | 12611551 | 1724 days ago | IN | 0 ETH | 0.00422832 | ||||
| Transfer Ownersh... | 12605196 | 1725 days ago | IN | 0 ETH | 0.00027269 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FpNFT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-06-10
*/
// SPDX-License-Identifier: MIT
pragma solidity = 0.7.6;
pragma abicoder v2;
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;
}
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @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);
function burnFrom(
address account,
uint256 amount
) external;
/**
* @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
);
}
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);
}
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;
}
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 () {
// 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;
}
}
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);
}
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);
}
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);
}
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;
}
}
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);
}
}
}
}
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));
}
}
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))));
}
}
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);
}
}
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;
mapping(uint256 => bool) public forSale;
address payable public ownerContract;
struct AuctionItem {
uint256 id;
uint256 tokenId;
uint256 askingPrice;
bool isValid;
string divider;
}
AuctionItem[] public itemsForSale;
uint256 public totalItems;
// 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;
event ListedForSale( uint256 indexed tokenId , uint256 salePrice);
event UnListedForSale( uint256 indexed tokenId);
event Sold(address indexed to, uint256 indexed tokenId , uint256 indexed salePrice);
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor (string memory name_, string memory symbol_ , address payable _ownerContract) {
_name = name_;
_symbol = symbol_;
ownerContract = _ownerContract;
totalItems = 0;
// 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));
}
// If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
return string(abi.encodePacked(base, tokenId.toString()));
}
/**
* @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);
forSale[tokenId] = false;
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);
forSale[tokenId] = false;
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
}
function setForSale(uint256 _tokenId , uint256 salePrice) external returns(uint256) {
address _owner = ownerOf(_tokenId);
require(salePrice > 0 , 'Sale Price Cant be zero');
require(forSale[_tokenId] == false , 'Token already for Sale');
require(_exists(_tokenId));
require(_owner == msg.sender);
_approve(address(this) , _tokenId);
forSale[_tokenId] = true;
uint256 newItemId = itemsForSale.length;
itemsForSale.push(
AuctionItem(
newItemId,
_tokenId,
salePrice,
true,
"$"
)
);
totalItems++;
emit ListedForSale(_tokenId , salePrice);
emit Approval(_owner, address(this), _tokenId);
return newItemId;
}
function removeFromSale(uint256 indexId) external {
AuctionItem memory item = itemsForSale[indexId];
address _owner = ownerOf(item.tokenId);
require(_exists(item.tokenId));
require(_owner == msg.sender);
require(forSale[item.tokenId] == true , 'Token not for Sale');
forSale[item.tokenId] = false;
itemsForSale[indexId].isValid = false;
emit UnListedForSale(item.tokenId);
}
function buy(uint256 indexId) external payable {
AuctionItem memory item = itemsForSale[indexId];
address buyer = msg.sender;
uint payedPrice = msg.value;
require(_exists(item.tokenId));
require(getApproved(item.tokenId) == address(this));
// require payedPrice >= salePrice
require(forSale[item.tokenId] == true, "Not for Sale");
require(itemsForSale[indexId].isValid == true, "Not for Sale");
require(payedPrice >= itemsForSale[indexId].askingPrice, "Not enough amount to buy");
uint256 fee = (payedPrice.mul(4000000000000000000)).div(100000000000000000000);
uint256 actualPrice = payedPrice.sub(fee);
// pay the seller
address payable _owner = payable(ownerOf(item.tokenId));
_owner.transfer(actualPrice);
ownerContract.transfer(fee);
transferFrom(ownerOf(item.tokenId), buyer, item.tokenId);
forSale[item.tokenId] = false;
itemsForSale[indexId].isValid = false;
emit Sold(buyer , item.tokenId , payedPrice);
}
//return Array of structure
function allItems() public view returns (AuctionItem[] memory){
AuctionItem[] memory items = new AuctionItem[](1);
for (uint i = 0; i < totalItems; i++) {
AuctionItem storage item = itemsForSale[i];
items[i] = item;
}
return items;
}
/**
* @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 { }
}
contract FpNFT is ERC721 {
address private signatureContract;
IERC20 FP3D;
IERC20 USDC;
constructor(address _FP3D , address _USDC , address signer) ERC721("Flat Pyramid 3D", "FP3D", msg.sender) {
FP3D = IERC20(_FP3D);
USDC = IERC20(_USDC);
signatureContract = signer;
}
function transferOwnership(address payable newOwner) public {
require(_msgSender() == ownerContract , 'Only Owner');
ownerContract = newOwner;
}
function changeSigner(address signer) public {
require(_msgSender() == ownerContract , 'Only Owner');
signatureContract = signer;
}
function mintNFT(address player, string memory tokenURI , uint256 tokenId)
public
returns (uint256)
{
require(_msgSender() == ownerContract , 'Only Owner');
_mint(player, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
function mintNFT(address player, string memory tokenURI, uint256 tokenId , uint8 v, bytes32 r, bytes32 s)
public
payable
returns (uint256)
{
require(signatureContract == ecrecover(getSignedHash(keccak256(abi.encodePacked(this , tokenId))), v, r, s), "owner should sign tokenId");
ownerContract.transfer(msg.value);
_mint(player, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
function mintNftAgainstUSDC(address player, string memory tokenURI, uint256 amount , uint256 tokenId, uint8 v, bytes32 r, bytes32 s)
public
returns (uint256)
{
require(signatureContract == ecrecover(getSignedHash(keccak256(abi.encodePacked(this , tokenId))), v, r, s), "owner should sign tokenId");
require(USDC.allowance(_msgSender(),address(this)) >= amount , "amount exceeds allowance");
USDC.transferFrom(_msgSender(),ownerContract,amount);
_mint(player, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
function mintNftAgainstFP3D(address player, string memory tokenURI, uint256 amount, uint256 tokenId, uint8 v, bytes32 r, bytes32 s)
public
returns (uint256)
{
require(signatureContract == ecrecover(getSignedHash(keccak256(abi.encodePacked(this, tokenId))), v, r, s), "owner should sign tokenId");
require(FP3D.allowance(_msgSender(),address(this)) >= amount , "amount exceeds allowance");
FP3D.transferFrom(_msgSender(),ownerContract,amount);
_mint(player, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
function getSignedHash(bytes32 _messageHash) private pure returns(bytes32){
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_FP3D","type":"address"},{"internalType":"address","name":"_USDC","type":"address"},{"internalType":"address","name":"signer","type":"address"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"ListedForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"Sold","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"UnListedForSale","type":"event"},{"inputs":[],"name":"allItems","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"askingPrice","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"string","name":"divider","type":"string"}],"internalType":"struct ERC721.AuctionItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"changeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"forSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"","type":"uint256"}],"name":"itemsForSale","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"askingPrice","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"string","name":"divider","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintNftAgainstFP3D","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintNftAgainstUSDC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerContract","outputs":[{"internalType":"address payable","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":"indexId","type":"uint256"}],"name":"removeFromSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"setForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalItems","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 payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162005c8f38038062005c8f8339818101604052810190620000379190620003f3565b6040518060400160405280600f81526020017f466c617420507972616d696420334400000000000000000000000000000000008152506040518060400160405280600481526020017f465033440000000000000000000000000000000000000000000000000000000081525033620000bc6301ffc9a760e01b6200024e60201b60201c565b82600a9080519060200190620000d492919062000326565b5081600b9080519060200190620000ed92919062000326565b5080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006009819055506200014f6380ac58cd60e01b6200024e60201b60201c565b62000167635b5e139f60e01b6200024e60201b60201c565b6200017f63780e9d6360e01b6200024e60201b60201c565b50505082600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200050c565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b1906200048b565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200035e5760008555620003aa565b82601f106200037957805160ff1916838001178555620003aa565b82800160010185558215620003aa579182015b82811115620003a95782518255916020019190600101906200038c565b5b509050620003b99190620003bd565b5090565b5b80821115620003d8576000816000905550600101620003be565b5090565b600081519050620003ed81620004f2565b92915050565b6000806000606084860312156200040957600080fd5b60006200041986828701620003dc565b93505060206200042c86828701620003dc565b92505060406200043f86828701620003dc565b9150509250925092565b600062000458601c83620004ad565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004a68162000449565b9050919050565b600082825260208201905092915050565b6000620004cb82620004d2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620004fd81620004be565b81146200050957600080fd5b50565b615773806200051c6000396000f3fe6080604052600436106101d85760003560e01c806342842e0e116101025780639890b32211610095578063c87b56dd11610064578063c87b56dd14610739578063d96a094a14610776578063e985e9c514610792578063f2fde38b146107cf576101d8565b80639890b3221461068e578063a22cb465146106be578063aad2b723146106e7578063b88d4fde14610710576101d8565b80636c0360eb116100d15780636c0360eb146105d057806370a08231146105fb5780637f74ac151461063857806395d89b4114610663576101d8565b806342842e0e146105025780634f6ccce71461052b5780636352211e14610568578063648446ff146105a5576101d8565b8063146aa99b1161017a5780632799276d116101495780632799276d146104205780632831f2f41461044b5780632f745c591461048857806341355219146104c5576101d8565b8063146aa99b1461035257806317fcfe221461038f57806318160ddd146103cc57806323b872dd146103f7576101d8565b806308598df0116101b657806308598df014610282578063092d0afc146102bf578063095ea7b3146103005780631361a3b614610329576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613fed565b6107f8565b6040516102119190614ef0565b60405180910390f35b34801561022657600080fd5b5061022f61085f565b60405161023c9190614f50565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061403f565b610901565b6040516102799190614dec565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613dca565b610986565b6040516102b69190615312565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061403f565b610a3d565b6040516102f795949392919061532d565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613f88565b610b28565b005b34801561033557600080fd5b50610350600480360381019061034b919061403f565b610c40565b005b34801561035e57600080fd5b5061037960048036038101906103749190613e31565b610eac565b6040516103869190615312565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190614091565b6111af565b6040516103c39190615312565b60405180910390f35b3480156103d857600080fd5b506103e1611488565b6040516103ee9190615312565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613cc4565b611499565b005b34801561042c57600080fd5b506104356114f9565b6040516104429190615312565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d919061403f565b6114ff565b60405161047f9190614ef0565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613f88565b61151f565b6040516104bc9190615312565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e31565b61157a565b6040516104f99190615312565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613cc4565b61187d565b005b34801561053757600080fd5b50610552600480360381019061054d919061403f565b61189d565b60405161055f9190615312565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a919061403f565b6118c0565b60405161059c9190614dec565b60405180910390f35b3480156105b157600080fd5b506105ba6118f7565b6040516105c79190614ece565b60405180910390f35b3480156105dc57600080fd5b506105e5611a90565b6040516105f29190614f50565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613c36565b611b32565b60405161062f9190615312565b60405180910390f35b34801561064457600080fd5b5061064d611bf1565b60405161065a9190614e07565b60405180910390f35b34801561066f57600080fd5b50610678611c17565b6040516106859190614f50565b60405180910390f35b6106a860048036038101906106a39190613ee7565b611cb9565b6040516106b59190615312565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613d8e565b611e53565b005b3480156106f357600080fd5b5061070e60048036038101906107099190613c36565b611fd4565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d13565b6120af565b005b34801561074557600080fd5b50610760600480360381019061075b919061403f565b612111565b60405161076d9190614f50565b60405180910390f35b610790600480360381019061078b919061403f565b612294565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613c88565b612721565b6040516107c69190614ef0565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613c5f565b6127b5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c82612890565b61094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906151b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166109c96128ad565b73ffffffffffffffffffffffffffffffffffffffff1614610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a16906152d2565b60405180910390fd5b610a2984836128b5565b610a338284612a43565b8190509392505050565b60088181548110610a4d57600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030160009054906101000a900460ff1690806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905085565b6000610b33826118c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90615252565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc36128ad565b73ffffffffffffffffffffffffffffffffffffffff161480610bf25750610bf181610bec6128ad565b612721565b5b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906150d2565b60405180910390fd5b610c3b8383612ab7565b505050565b600060088281548110610c4f57fe5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b50505050508152505090506000610d5482602001516118c0565b9050610d638260200151612890565b610d6c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610da457600080fd5b60011515600660008460200151815260200190815260200160002060009054906101000a900460ff16151514610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e06906152f2565b60405180910390fd5b6000600660008460200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600060088481548110610e4e57fe5b906000526020600020906005020160030160006101000a81548160ff02191690831515021790555081602001517f4c3ffba4b525c8220ecee936210dacf083bd843a767a9d362ef88ea9a13e537e60405160405180910390a2505050565b60006001610ee13087604051602001610ec6929190614d76565b60405160208183030381529060405280519060200120612b70565b85858560405160008152602001604052604051610f019493929190614f0b565b6020604051602081039080840390855afa158015610f23573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb3906150b2565b60405180910390fd5b85601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6110036128ad565b306040518363ffffffff1660e01b8152600401611021929190614e22565b60206040518083038186803b15801561103957600080fd5b505afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190614068565b10156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990614fd2565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6110f86128ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16896040518463ffffffff1660e01b815260040161113a93929190614e4b565b602060405180830381600087803b15801561115457600080fd5b505af1158015611168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118c9190613fc4565b5061119788866128b5565b6111a18588612a43565b849050979650505050505050565b6000806111bb846118c0565b905060008311611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790615232565b60405180910390fd5b600015156006600086815260200190815260200160002060009054906101000a900460ff16151514611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90615172565b60405180910390fd5b61127084612890565b61127957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112b157600080fd5b6112bb3085612ab7565b60016006600086815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600880549050905060086040518060a001604052808381526020018781526020018681526020016001151581526020016040518060400160405280600181526020017f2400000000000000000000000000000000000000000000000000000000000000815250815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555060808201518160040190805190602001906113d59291906139b8565b505050600960008154809291906001019190505550847f27aebf2e0e5cf25f00bd3797d26b69f66ac7ccb85a55702906e672e9cb7d1c258560405161141a9190615312565b60405180910390a2843073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4809250505092915050565b60006114946002612ba0565b905090565b6114aa6114a46128ad565b82612bb5565b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090615272565b60405180910390fd5b6114f4838383612c93565b505050565b60095481565b60066020528060005260406000206000915054906101000a900460ff1681565b600061157282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ed690919063ffffffff16565b905092915050565b600060016115af3087604051602001611594929190614d76565b60405160208183030381529060405280519060200120612b70565b858585604051600081526020016040526040516115cf9493929190614f0b565b6020604051602081039080840390855afa1580156115f1573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906150b2565b60405180910390fd5b85600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6116d16128ad565b306040518363ffffffff1660e01b81526004016116ef929190614e22565b60206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190614068565b1015611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614fd2565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6117c66128ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16896040518463ffffffff1660e01b815260040161180893929190614e4b565b602060405180830381600087803b15801561182257600080fd5b505af1158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190613fc4565b5061186588866128b5565b61186f8588612a43565b849050979650505050505050565b611898838383604051806020016040528060008152506120af565b505050565b6000806118b4836002612ef090919063ffffffff16565b50905080915050919050565b60006118f082604051806060016040528060298152602001615715602991396002612f1c9092919063ffffffff16565b9050919050565b60606000600167ffffffffffffffff8111801561191357600080fd5b5060405190808252806020026020018201604052801561194d57816020015b61193a613a46565b8152602001906001900390816119325790505b50905060005b600954811015611a885760006008828154811061196c57fe5b90600052602060002090600502019050806040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a5a5780601f10611a2f57610100808354040283529160200191611a5a565b820191906000526020600020905b815481529060010190602001808311611a3d57829003601f168201915b505050505081525050838381518110611a6f57fe5b6020026020010181905250508080600101915050611953565b508091505090565b6060600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b285780601f10611afd57610100808354040283529160200191611b28565b820191906000526020600020905b815481529060010190602001808311611b0b57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a906150f2565b60405180910390fd5b611bea600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f3b565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611caf5780601f10611c8457610100808354040283529160200191611caf565b820191906000526020600020905b815481529060010190602001808311611c9257829003601f168201915b5050505050905090565b60006001611cee3087604051602001611cd3929190614d76565b60405160208183030381529060405280519060200120612b70565b85858560405160008152602001604052604051611d0e9493929190614f0b565b6020604051602081039080840390855afa158015611d30573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc0906150b2565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611e31573d6000803e3d6000fd5b50611e3c87866128b5565b611e468587612a43565b8490509695505050505050565b611e5b6128ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090615012565b60405180910390fd5b8060056000611ed66128ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f836128ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc89190614ef0565b60405180910390a35050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120156128ad565b73ffffffffffffffffffffffffffffffffffffffff161461206b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612062906152d2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120c06120ba6128ad565b83612bb5565b6120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690615272565b60405180910390fd5b61210b84848484612f50565b50505050565b606061211c82612890565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290615212565b60405180910390fd5b6000600c60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122045780601f106121d957610100808354040283529160200191612204565b820191906000526020600020905b8154815290600101906020018083116121e757829003601f168201915b505050505090506000612215611a90565b905060008151141561222b57819250505061228f565b600082511115612260578082604051602001612248929190614da2565b6040516020818303038152906040529250505061228f565b8061226a85612fac565b60405160200161227b929190614da2565b604051602081830303815290604052925050505b919050565b6000600882815481106122a357fe5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561238e5780601f106123635761010080835404028352916020019161238e565b820191906000526020600020905b81548152906001019060200180831161237157829003601f168201915b5050505050815250509050600033905060003490506123b08360200151612890565b6123b957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166123dd8460200151610901565b73ffffffffffffffffffffffffffffffffffffffff16146123fd57600080fd5b60011515600660008560200151815260200190815260200160002060009054906101000a900460ff16151514612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245f906152b2565b60405180910390fd5b600115156008858154811061247957fe5b906000526020600020906005020160030160009054906101000a900460ff161515146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d1906152b2565b60405180910390fd5b600884815481106124e757fe5b90600052602060002090600502016002015481101561253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253290615132565b60405180910390fd5b600061257368056bc75e2d63100000612565673782dace9d900000856130f390919063ffffffff16565b61316390919063ffffffff16565b9050600061258a82846131b990919063ffffffff16565b9050600061259b86602001516118c0565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156125e3573d6000803e3d6000fd5b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561264c573d6000803e3d6000fd5b5061266861265d87602001516118c0565b868860200151611499565b6000600660008860200151815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600888815481106126a757fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055508386602001518673ffffffffffffffffffffffffffffffffffffffff167fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d60405160405180910390a450505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127f66128ad565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612843906152d2565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006128a682600261320990919063ffffffff16565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90615152565b60405180910390fd5b61292e81612890565b1561296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296590614fb2565b60405180910390fd5b61297a60008383613223565b6129cb81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061322890919063ffffffff16565b506129e2818360026132429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a4c82612890565b612a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a82906151d2565b60405180910390fd5b80600c60008481526020019081526020016000209080519060200190612ab29291906139b8565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b2a836118c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081604051602001612b839190614dc6565b604051602081830303815290604052805190602001209050919050565b6000612bae82600001613277565b9050919050565b6000612bc082612890565b612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690615072565b60405180910390fd5b6000612c0a836118c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7957508373ffffffffffffffffffffffffffffffffffffffff16612c6184610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c8a5750612c898185612721565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb3826118c0565b73ffffffffffffffffffffffffffffffffffffffff1614612d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d00906151f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614ff2565b60405180910390fd5b612d84838383613223565b612d8f600082612ab7565b612de081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061328890919063ffffffff16565b50612e3281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061322890919063ffffffff16565b50612e49818360026132429092919063ffffffff16565b5060006006600083815260200190815260200160002060006101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612ee583600001836132a2565b60001c905092915050565b600080600080612f03866000018661330f565b915091508160001c8160001c9350935050509250929050565b6000612f2f846000018460001b84613392565b60001c90509392505050565b6000612f4982600001613423565b9050919050565b612f5b848484612c93565b612f6784848484613434565b612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90614f92565b60405180910390fd5b50505050565b60606000821415612ff4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130ee565b600082905060005b6000821461301e578080600101915050600a828161301657fe5b049150612ffc565b60008167ffffffffffffffff8111801561303757600080fd5b506040519080825280601f01601f19166020018201604052801561306a5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146130e657600a848161308b57fe5b0660300160f81b828280600190039350815181106130a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130de57fe5b049350613079565b819450505050505b919050565b600080831415613106576000905061315d565b600082840290508284828161311757fe5b0414613158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314f90615192565b60405180910390fd5b809150505b92915050565b60008082116131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319e90615092565b60405180910390fd5b8183816131b057fe5b04905092915050565b6000828211156131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590615032565b60405180910390fd5b818303905092915050565b600061321b836000018360001b613598565b905092915050565b505050565b600061323a836000018360001b6135bb565b905092915050565b600061326e846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61362b565b90509392505050565b600081600001805490509050919050565b600061329a836000018360001b613707565b905092915050565b6000818360000180549050116132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e490614f72565b60405180910390fd5b8260000182815481106132fc57fe5b9060005260206000200154905092915050565b6000808284600001805490501161335b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335290615112565b60405180910390fd5b600084600001848154811061336c57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906133f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133eb9190614f50565b60405180910390fd5b5084600001600182038154811061340757fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006134558473ffffffffffffffffffffffffffffffffffffffff166137ef565b6134625760019050613590565b600061352963150b7a0260e01b6134776128ad565b88878760405160240161348d9493929190614e82565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016156e3603291398773ffffffffffffffffffffffffffffffffffffffff166138029092919063ffffffff16565b90506000818060200190518101906135419190614016565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006135c7838361381a565b613620578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613625565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156136d257846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613700565b828560000160018303815481106136e557fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020549050600081146137e3576000600182039050600060018660000180549050039050600086600001828154811061375257fe5b906000526020600020015490508087600001848154811061376f57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806137a757fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137e9565b60009150505b92915050565b600080823b905060008111915050919050565b6060613811848460008561383d565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387990615052565b60405180910390fd5b61388b856137ef565b6138ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c190615292565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138f39190614d5f565b60006040518083038185875af1925050503d8060008114613930576040519150601f19603f3d011682016040523d82523d6000602084013e613935565b606091505b5091509150613945828286613951565b92505050949350505050565b60608315613961578290506139b1565b6000835111156139745782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a89190614f50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826139ee5760008555613a35565b82601f10613a0757805160ff1916838001178555613a35565b82800160010185558215613a35579182015b82811115613a34578251825591602001919060010190613a19565b5b509050613a429190613a77565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600015158152602001606081525090565b5b80821115613a90576000816000905550600101613a78565b5090565b6000613aa7613aa2846153b8565b615387565b905082815260208101848484011115613abf57600080fd5b613aca8482856155a7565b509392505050565b6000613ae5613ae0846153e8565b615387565b905082815260208101848484011115613afd57600080fd5b613b088482856155a7565b509392505050565b600081359050613b1f81615641565b92915050565b600081359050613b3481615658565b92915050565b600081359050613b498161566f565b92915050565b600081519050613b5e8161566f565b92915050565b600081359050613b7381615686565b92915050565b600081359050613b888161569d565b92915050565b600081519050613b9d8161569d565b92915050565b600082601f830112613bb457600080fd5b8135613bc4848260208601613a94565b91505092915050565b600082601f830112613bde57600080fd5b8135613bee848260208601613ad2565b91505092915050565b600081359050613c06816156b4565b92915050565b600081519050613c1b816156b4565b92915050565b600081359050613c30816156cb565b92915050565b600060208284031215613c4857600080fd5b6000613c5684828501613b10565b91505092915050565b600060208284031215613c7157600080fd5b6000613c7f84828501613b25565b91505092915050565b60008060408385031215613c9b57600080fd5b6000613ca985828601613b10565b9250506020613cba85828601613b10565b9150509250929050565b600080600060608486031215613cd957600080fd5b6000613ce786828701613b10565b9350506020613cf886828701613b10565b9250506040613d0986828701613bf7565b9150509250925092565b60008060008060808587031215613d2957600080fd5b6000613d3787828801613b10565b9450506020613d4887828801613b10565b9350506040613d5987828801613bf7565b925050606085013567ffffffffffffffff811115613d7657600080fd5b613d8287828801613ba3565b91505092959194509250565b60008060408385031215613da157600080fd5b6000613daf85828601613b10565b9250506020613dc085828601613b3a565b9150509250929050565b600080600060608486031215613ddf57600080fd5b6000613ded86828701613b10565b935050602084013567ffffffffffffffff811115613e0a57600080fd5b613e1686828701613bcd565b9250506040613e2786828701613bf7565b9150509250925092565b600080600080600080600060e0888a031215613e4c57600080fd5b6000613e5a8a828b01613b10565b975050602088013567ffffffffffffffff811115613e7757600080fd5b613e838a828b01613bcd565b9650506040613e948a828b01613bf7565b9550506060613ea58a828b01613bf7565b9450506080613eb68a828b01613c21565b93505060a0613ec78a828b01613b64565b92505060c0613ed88a828b01613b64565b91505092959891949750929550565b60008060008060008060c08789031215613f0057600080fd5b6000613f0e89828a01613b10565b965050602087013567ffffffffffffffff811115613f2b57600080fd5b613f3789828a01613bcd565b9550506040613f4889828a01613bf7565b9450506060613f5989828a01613c21565b9350506080613f6a89828a01613b64565b92505060a0613f7b89828a01613b64565b9150509295509295509295565b60008060408385031215613f9b57600080fd5b6000613fa985828601613b10565b9250506020613fba85828601613bf7565b9150509250929050565b600060208284031215613fd657600080fd5b6000613fe484828501613b4f565b91505092915050565b600060208284031215613fff57600080fd5b600061400d84828501613b79565b91505092915050565b60006020828403121561402857600080fd5b600061403684828501613b8e565b91505092915050565b60006020828403121561405157600080fd5b600061405f84828501613bf7565b91505092915050565b60006020828403121561407a57600080fd5b600061408884828501613c0c565b91505092915050565b600080604083850312156140a457600080fd5b60006140b285828601613bf7565b92505060206140c385828601613bf7565b9150509250929050565b60006140d98383614ca5565b905092915050565b6140ea8161554d565b82525050565b6140f9816154c2565b82525050565b614108816154b0565b82525050565b600061411982615428565b6141238185615456565b93508360208202850161413585615418565b8060005b85811015614171578484038952815161415285826140cd565b945061415d83615449565b925060208a01995050600181019050614139565b50829750879550505050505092915050565b61418c816154d4565b82525050565b61419b816154d4565b82525050565b6141aa816154e0565b82525050565b6141c16141bc826154e0565b6155fb565b82525050565b60006141d282615433565b6141dc8185615467565b93506141ec8185602086016155b6565b6141f581615623565b840191505092915050565b600061420b82615433565b6142158185615478565b93506142258185602086016155b6565b80840191505092915050565b61424261423d8261555f565b6155e9565b82525050565b60006142538261543e565b61425d8185615483565b935061426d8185602086016155b6565b61427681615623565b840191505092915050565b600061428c8261543e565b6142968185615494565b93506142a68185602086016155b6565b6142af81615623565b840191505092915050565b60006142c58261543e565b6142cf81856154a5565b93506142df8185602086016155b6565b80840191505092915050565b60006142f8602283615494565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435e601c836154a5565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b600061439e603283615494565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614404601c83615494565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614444601883615494565b91507f616d6f756e74206578636565647320616c6c6f77616e636500000000000000006000830152602082019050919050565b6000614484602483615494565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ea601983615494565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452a601e83615494565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456a602683615494565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d0602c83615494565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614636601a83615494565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000614676601983615494565b91507f6f776e65722073686f756c64207369676e20746f6b656e4964000000000000006000830152602082019050919050565b60006146b6603883615494565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061471c602a83615494565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614782602283615494565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e8601883615494565b91507f4e6f7420656e6f75676820616d6f756e7420746f2062757900000000000000006000830152602082019050919050565b6000614828602083615494565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614868601683615494565b91507f546f6b656e20616c726561647920666f722053616c65000000000000000000006000830152602082019050919050565b60006148a8602183615494565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061490e602c83615494565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614974602c83615494565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149da602983615494565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a40602f83615494565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614aa6601783615494565b91507f53616c652050726963652043616e74206265207a65726f0000000000000000006000830152602082019050919050565b6000614ae6602183615494565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b4c603183615494565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614bb2601d83615494565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bf2600c83615494565b91507f4e6f7420666f722053616c6500000000000000000000000000000000000000006000830152602082019050919050565b6000614c32600a83615494565b91507f4f6e6c79204f776e6572000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c72601283615494565b91507f546f6b656e206e6f7420666f722053616c6500000000000000000000000000006000830152602082019050919050565b600060a083016000830151614cbd6000860182614d1b565b506020830151614cd06020860182614d1b565b506040830151614ce36040860182614d1b565b506060830151614cf66060860182614183565b5060808301518482036080860152614d0e8282614248565b9150508091505092915050565b614d2481615536565b82525050565b614d3381615536565b82525050565b614d4a614d4582615536565b615617565b82525050565b614d5981615540565b82525050565b6000614d6b8284614200565b915081905092915050565b6000614d828285614231565b601482019150614d928284614d39565b6020820191508190509392505050565b6000614dae82856142ba565b9150614dba82846142ba565b91508190509392505050565b6000614dd182614351565b9150614ddd82846141b0565b60208201915081905092915050565b6000602082019050614e0160008301846140ff565b92915050565b6000602082019050614e1c60008301846140f0565b92915050565b6000604082019050614e3760008301856140e1565b614e4460208301846140ff565b9392505050565b6000606082019050614e6060008301866140e1565b614e6d60208301856140e1565b614e7a6040830184614d2a565b949350505050565b6000608082019050614e9760008301876140f0565b614ea460208301866140ff565b614eb16040830185614d2a565b8181036060830152614ec381846141c7565b905095945050505050565b60006020820190508181036000830152614ee8818461410e565b905092915050565b6000602082019050614f056000830184614192565b92915050565b6000608082019050614f2060008301876141a1565b614f2d6020830186614d50565b614f3a60408301856141a1565b614f4760608301846141a1565b95945050505050565b60006020820190508181036000830152614f6a8184614281565b905092915050565b60006020820190508181036000830152614f8b816142eb565b9050919050565b60006020820190508181036000830152614fab81614391565b9050919050565b60006020820190508181036000830152614fcb816143f7565b9050919050565b60006020820190508181036000830152614feb81614437565b9050919050565b6000602082019050818103600083015261500b81614477565b9050919050565b6000602082019050818103600083015261502b816144dd565b9050919050565b6000602082019050818103600083015261504b8161451d565b9050919050565b6000602082019050818103600083015261506b8161455d565b9050919050565b6000602082019050818103600083015261508b816145c3565b9050919050565b600060208201905081810360008301526150ab81614629565b9050919050565b600060208201905081810360008301526150cb81614669565b9050919050565b600060208201905081810360008301526150eb816146a9565b9050919050565b6000602082019050818103600083015261510b8161470f565b9050919050565b6000602082019050818103600083015261512b81614775565b9050919050565b6000602082019050818103600083015261514b816147db565b9050919050565b6000602082019050818103600083015261516b8161481b565b9050919050565b6000602082019050818103600083015261518b8161485b565b9050919050565b600060208201905081810360008301526151ab8161489b565b9050919050565b600060208201905081810360008301526151cb81614901565b9050919050565b600060208201905081810360008301526151eb81614967565b9050919050565b6000602082019050818103600083015261520b816149cd565b9050919050565b6000602082019050818103600083015261522b81614a33565b9050919050565b6000602082019050818103600083015261524b81614a99565b9050919050565b6000602082019050818103600083015261526b81614ad9565b9050919050565b6000602082019050818103600083015261528b81614b3f565b9050919050565b600060208201905081810360008301526152ab81614ba5565b9050919050565b600060208201905081810360008301526152cb81614be5565b9050919050565b600060208201905081810360008301526152eb81614c25565b9050919050565b6000602082019050818103600083015261530b81614c65565b9050919050565b60006020820190506153276000830184614d2a565b92915050565b600060a0820190506153426000830188614d2a565b61534f6020830187614d2a565b61535c6040830186614d2a565b6153696060830185614192565b818103608083015261537b8184614281565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff821117156153ae576153ad615621565b5b8060405250919050565b600067ffffffffffffffff8211156153d3576153d2615621565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561540357615402615621565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006154bb82615516565b9050919050565b60006154cd82615516565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061555882615583565b9050919050565b600061556a82615571565b9050919050565b600061557c82615516565b9050919050565b600061558e82615595565b9050919050565b60006155a082615516565b9050919050565b82818337600083830152505050565b60005b838110156155d45780820151818401526020810190506155b9565b838111156155e3576000848401525b50505050565b60006155f482615605565b9050919050565b6000819050919050565b600061561082615634565b9050919050565b6000819050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b61564a816154b0565b811461565557600080fd5b50565b615661816154c2565b811461566c57600080fd5b50565b615678816154d4565b811461568357600080fd5b50565b61568f816154e0565b811461569a57600080fd5b50565b6156a6816154ea565b81146156b157600080fd5b50565b6156bd81615536565b81146156c857600080fd5b50565b6156d481615540565b81146156df57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122021380bc2c122d502c1ccb402847277616a9a53387d2b9012af2c831b50bd6ce464736f6c634300070600330000000000000000000000003daecae376ad4fb15ead85fb69827c26ea01bd0b000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000257650985d0794158b53438e0e6b178c2a389a81
Deployed Bytecode
0x6080604052600436106101d85760003560e01c806342842e0e116101025780639890b32211610095578063c87b56dd11610064578063c87b56dd14610739578063d96a094a14610776578063e985e9c514610792578063f2fde38b146107cf576101d8565b80639890b3221461068e578063a22cb465146106be578063aad2b723146106e7578063b88d4fde14610710576101d8565b80636c0360eb116100d15780636c0360eb146105d057806370a08231146105fb5780637f74ac151461063857806395d89b4114610663576101d8565b806342842e0e146105025780634f6ccce71461052b5780636352211e14610568578063648446ff146105a5576101d8565b8063146aa99b1161017a5780632799276d116101495780632799276d146104205780632831f2f41461044b5780632f745c591461048857806341355219146104c5576101d8565b8063146aa99b1461035257806317fcfe221461038f57806318160ddd146103cc57806323b872dd146103f7576101d8565b806308598df0116101b657806308598df014610282578063092d0afc146102bf578063095ea7b3146103005780631361a3b614610329576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613fed565b6107f8565b6040516102119190614ef0565b60405180910390f35b34801561022657600080fd5b5061022f61085f565b60405161023c9190614f50565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061403f565b610901565b6040516102799190614dec565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613dca565b610986565b6040516102b69190615312565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061403f565b610a3d565b6040516102f795949392919061532d565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190613f88565b610b28565b005b34801561033557600080fd5b50610350600480360381019061034b919061403f565b610c40565b005b34801561035e57600080fd5b5061037960048036038101906103749190613e31565b610eac565b6040516103869190615312565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190614091565b6111af565b6040516103c39190615312565b60405180910390f35b3480156103d857600080fd5b506103e1611488565b6040516103ee9190615312565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613cc4565b611499565b005b34801561042c57600080fd5b506104356114f9565b6040516104429190615312565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d919061403f565b6114ff565b60405161047f9190614ef0565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613f88565b61151f565b6040516104bc9190615312565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e31565b61157a565b6040516104f99190615312565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613cc4565b61187d565b005b34801561053757600080fd5b50610552600480360381019061054d919061403f565b61189d565b60405161055f9190615312565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a919061403f565b6118c0565b60405161059c9190614dec565b60405180910390f35b3480156105b157600080fd5b506105ba6118f7565b6040516105c79190614ece565b60405180910390f35b3480156105dc57600080fd5b506105e5611a90565b6040516105f29190614f50565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613c36565b611b32565b60405161062f9190615312565b60405180910390f35b34801561064457600080fd5b5061064d611bf1565b60405161065a9190614e07565b60405180910390f35b34801561066f57600080fd5b50610678611c17565b6040516106859190614f50565b60405180910390f35b6106a860048036038101906106a39190613ee7565b611cb9565b6040516106b59190615312565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613d8e565b611e53565b005b3480156106f357600080fd5b5061070e60048036038101906107099190613c36565b611fd4565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d13565b6120af565b005b34801561074557600080fd5b50610760600480360381019061075b919061403f565b612111565b60405161076d9190614f50565b60405180910390f35b610790600480360381019061078b919061403f565b612294565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613c88565b612721565b6040516107c69190614ef0565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613c5f565b6127b5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c82612890565b61094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906151b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166109c96128ad565b73ffffffffffffffffffffffffffffffffffffffff1614610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a16906152d2565b60405180910390fd5b610a2984836128b5565b610a338284612a43565b8190509392505050565b60088181548110610a4d57600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030160009054906101000a900460ff1690806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905085565b6000610b33826118c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90615252565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc36128ad565b73ffffffffffffffffffffffffffffffffffffffff161480610bf25750610bf181610bec6128ad565b612721565b5b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906150d2565b60405180910390fd5b610c3b8383612ab7565b505050565b600060088281548110610c4f57fe5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b50505050508152505090506000610d5482602001516118c0565b9050610d638260200151612890565b610d6c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610da457600080fd5b60011515600660008460200151815260200190815260200160002060009054906101000a900460ff16151514610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e06906152f2565b60405180910390fd5b6000600660008460200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600060088481548110610e4e57fe5b906000526020600020906005020160030160006101000a81548160ff02191690831515021790555081602001517f4c3ffba4b525c8220ecee936210dacf083bd843a767a9d362ef88ea9a13e537e60405160405180910390a2505050565b60006001610ee13087604051602001610ec6929190614d76565b60405160208183030381529060405280519060200120612b70565b85858560405160008152602001604052604051610f019493929190614f0b565b6020604051602081039080840390855afa158015610f23573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb3906150b2565b60405180910390fd5b85601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6110036128ad565b306040518363ffffffff1660e01b8152600401611021929190614e22565b60206040518083038186803b15801561103957600080fd5b505afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190614068565b10156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990614fd2565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6110f86128ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16896040518463ffffffff1660e01b815260040161113a93929190614e4b565b602060405180830381600087803b15801561115457600080fd5b505af1158015611168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118c9190613fc4565b5061119788866128b5565b6111a18588612a43565b849050979650505050505050565b6000806111bb846118c0565b905060008311611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790615232565b60405180910390fd5b600015156006600086815260200190815260200160002060009054906101000a900460ff16151514611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90615172565b60405180910390fd5b61127084612890565b61127957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112b157600080fd5b6112bb3085612ab7565b60016006600086815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600880549050905060086040518060a001604052808381526020018781526020018681526020016001151581526020016040518060400160405280600181526020017f2400000000000000000000000000000000000000000000000000000000000000815250815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555060808201518160040190805190602001906113d59291906139b8565b505050600960008154809291906001019190505550847f27aebf2e0e5cf25f00bd3797d26b69f66ac7ccb85a55702906e672e9cb7d1c258560405161141a9190615312565b60405180910390a2843073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4809250505092915050565b60006114946002612ba0565b905090565b6114aa6114a46128ad565b82612bb5565b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090615272565b60405180910390fd5b6114f4838383612c93565b505050565b60095481565b60066020528060005260406000206000915054906101000a900460ff1681565b600061157282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ed690919063ffffffff16565b905092915050565b600060016115af3087604051602001611594929190614d76565b60405160208183030381529060405280519060200120612b70565b858585604051600081526020016040526040516115cf9493929190614f0b565b6020604051602081039080840390855afa1580156115f1573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906150b2565b60405180910390fd5b85600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6116d16128ad565b306040518363ffffffff1660e01b81526004016116ef929190614e22565b60206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190614068565b1015611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614fd2565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6117c66128ad565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16896040518463ffffffff1660e01b815260040161180893929190614e4b565b602060405180830381600087803b15801561182257600080fd5b505af1158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190613fc4565b5061186588866128b5565b61186f8588612a43565b849050979650505050505050565b611898838383604051806020016040528060008152506120af565b505050565b6000806118b4836002612ef090919063ffffffff16565b50905080915050919050565b60006118f082604051806060016040528060298152602001615715602991396002612f1c9092919063ffffffff16565b9050919050565b60606000600167ffffffffffffffff8111801561191357600080fd5b5060405190808252806020026020018201604052801561194d57816020015b61193a613a46565b8152602001906001900390816119325790505b50905060005b600954811015611a885760006008828154811061196c57fe5b90600052602060002090600502019050806040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a5a5780601f10611a2f57610100808354040283529160200191611a5a565b820191906000526020600020905b815481529060010190602001808311611a3d57829003601f168201915b505050505081525050838381518110611a6f57fe5b6020026020010181905250508080600101915050611953565b508091505090565b6060600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b285780601f10611afd57610100808354040283529160200191611b28565b820191906000526020600020905b815481529060010190602001808311611b0b57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a906150f2565b60405180910390fd5b611bea600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f3b565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611caf5780601f10611c8457610100808354040283529160200191611caf565b820191906000526020600020905b815481529060010190602001808311611c9257829003601f168201915b5050505050905090565b60006001611cee3087604051602001611cd3929190614d76565b60405160208183030381529060405280519060200120612b70565b85858560405160008152602001604052604051611d0e9493929190614f0b565b6020604051602081039080840390855afa158015611d30573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc0906150b2565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611e31573d6000803e3d6000fd5b50611e3c87866128b5565b611e468587612a43565b8490509695505050505050565b611e5b6128ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090615012565b60405180910390fd5b8060056000611ed66128ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f836128ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc89190614ef0565b60405180910390a35050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120156128ad565b73ffffffffffffffffffffffffffffffffffffffff161461206b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612062906152d2565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120c06120ba6128ad565b83612bb5565b6120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690615272565b60405180910390fd5b61210b84848484612f50565b50505050565b606061211c82612890565b61215b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215290615212565b60405180910390fd5b6000600c60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122045780601f106121d957610100808354040283529160200191612204565b820191906000526020600020905b8154815290600101906020018083116121e757829003601f168201915b505050505090506000612215611a90565b905060008151141561222b57819250505061228f565b600082511115612260578082604051602001612248929190614da2565b6040516020818303038152906040529250505061228f565b8061226a85612fac565b60405160200161227b929190614da2565b604051602081830303815290604052925050505b919050565b6000600882815481106122a357fe5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16151515158152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561238e5780601f106123635761010080835404028352916020019161238e565b820191906000526020600020905b81548152906001019060200180831161237157829003601f168201915b5050505050815250509050600033905060003490506123b08360200151612890565b6123b957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166123dd8460200151610901565b73ffffffffffffffffffffffffffffffffffffffff16146123fd57600080fd5b60011515600660008560200151815260200190815260200160002060009054906101000a900460ff16151514612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245f906152b2565b60405180910390fd5b600115156008858154811061247957fe5b906000526020600020906005020160030160009054906101000a900460ff161515146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d1906152b2565b60405180910390fd5b600884815481106124e757fe5b90600052602060002090600502016002015481101561253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253290615132565b60405180910390fd5b600061257368056bc75e2d63100000612565673782dace9d900000856130f390919063ffffffff16565b61316390919063ffffffff16565b9050600061258a82846131b990919063ffffffff16565b9050600061259b86602001516118c0565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156125e3573d6000803e3d6000fd5b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561264c573d6000803e3d6000fd5b5061266861265d87602001516118c0565b868860200151611499565b6000600660008860200151815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600888815481106126a757fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055508386602001518673ffffffffffffffffffffffffffffffffffffffff167fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d60405160405180910390a450505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127f66128ad565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612843906152d2565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006128a682600261320990919063ffffffff16565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90615152565b60405180910390fd5b61292e81612890565b1561296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296590614fb2565b60405180910390fd5b61297a60008383613223565b6129cb81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061322890919063ffffffff16565b506129e2818360026132429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a4c82612890565b612a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a82906151d2565b60405180910390fd5b80600c60008481526020019081526020016000209080519060200190612ab29291906139b8565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b2a836118c0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081604051602001612b839190614dc6565b604051602081830303815290604052805190602001209050919050565b6000612bae82600001613277565b9050919050565b6000612bc082612890565b612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690615072565b60405180910390fd5b6000612c0a836118c0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7957508373ffffffffffffffffffffffffffffffffffffffff16612c6184610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c8a5750612c898185612721565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb3826118c0565b73ffffffffffffffffffffffffffffffffffffffff1614612d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d00906151f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614ff2565b60405180910390fd5b612d84838383613223565b612d8f600082612ab7565b612de081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061328890919063ffffffff16565b50612e3281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061322890919063ffffffff16565b50612e49818360026132429092919063ffffffff16565b5060006006600083815260200190815260200160002060006101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612ee583600001836132a2565b60001c905092915050565b600080600080612f03866000018661330f565b915091508160001c8160001c9350935050509250929050565b6000612f2f846000018460001b84613392565b60001c90509392505050565b6000612f4982600001613423565b9050919050565b612f5b848484612c93565b612f6784848484613434565b612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90614f92565b60405180910390fd5b50505050565b60606000821415612ff4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130ee565b600082905060005b6000821461301e578080600101915050600a828161301657fe5b049150612ffc565b60008167ffffffffffffffff8111801561303757600080fd5b506040519080825280601f01601f19166020018201604052801561306a5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146130e657600a848161308b57fe5b0660300160f81b828280600190039350815181106130a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130de57fe5b049350613079565b819450505050505b919050565b600080831415613106576000905061315d565b600082840290508284828161311757fe5b0414613158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314f90615192565b60405180910390fd5b809150505b92915050565b60008082116131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319e90615092565b60405180910390fd5b8183816131b057fe5b04905092915050565b6000828211156131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590615032565b60405180910390fd5b818303905092915050565b600061321b836000018360001b613598565b905092915050565b505050565b600061323a836000018360001b6135bb565b905092915050565b600061326e846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61362b565b90509392505050565b600081600001805490509050919050565b600061329a836000018360001b613707565b905092915050565b6000818360000180549050116132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e490614f72565b60405180910390fd5b8260000182815481106132fc57fe5b9060005260206000200154905092915050565b6000808284600001805490501161335b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335290615112565b60405180910390fd5b600084600001848154811061336c57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906133f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133eb9190614f50565b60405180910390fd5b5084600001600182038154811061340757fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006134558473ffffffffffffffffffffffffffffffffffffffff166137ef565b6134625760019050613590565b600061352963150b7a0260e01b6134776128ad565b88878760405160240161348d9493929190614e82565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016156e3603291398773ffffffffffffffffffffffffffffffffffffffff166138029092919063ffffffff16565b90506000818060200190518101906135419190614016565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006135c7838361381a565b613620578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613625565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156136d257846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613700565b828560000160018303815481106136e557fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020549050600081146137e3576000600182039050600060018660000180549050039050600086600001828154811061375257fe5b906000526020600020015490508087600001848154811061376f57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806137a757fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137e9565b60009150505b92915050565b600080823b905060008111915050919050565b6060613811848460008561383d565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387990615052565b60405180910390fd5b61388b856137ef565b6138ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c190615292565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138f39190614d5f565b60006040518083038185875af1925050503d8060008114613930576040519150601f19603f3d011682016040523d82523d6000602084013e613935565b606091505b5091509150613945828286613951565b92505050949350505050565b60608315613961578290506139b1565b6000835111156139745782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a89190614f50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826139ee5760008555613a35565b82601f10613a0757805160ff1916838001178555613a35565b82800160010185558215613a35579182015b82811115613a34578251825591602001919060010190613a19565b5b509050613a429190613a77565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600015158152602001606081525090565b5b80821115613a90576000816000905550600101613a78565b5090565b6000613aa7613aa2846153b8565b615387565b905082815260208101848484011115613abf57600080fd5b613aca8482856155a7565b509392505050565b6000613ae5613ae0846153e8565b615387565b905082815260208101848484011115613afd57600080fd5b613b088482856155a7565b509392505050565b600081359050613b1f81615641565b92915050565b600081359050613b3481615658565b92915050565b600081359050613b498161566f565b92915050565b600081519050613b5e8161566f565b92915050565b600081359050613b7381615686565b92915050565b600081359050613b888161569d565b92915050565b600081519050613b9d8161569d565b92915050565b600082601f830112613bb457600080fd5b8135613bc4848260208601613a94565b91505092915050565b600082601f830112613bde57600080fd5b8135613bee848260208601613ad2565b91505092915050565b600081359050613c06816156b4565b92915050565b600081519050613c1b816156b4565b92915050565b600081359050613c30816156cb565b92915050565b600060208284031215613c4857600080fd5b6000613c5684828501613b10565b91505092915050565b600060208284031215613c7157600080fd5b6000613c7f84828501613b25565b91505092915050565b60008060408385031215613c9b57600080fd5b6000613ca985828601613b10565b9250506020613cba85828601613b10565b9150509250929050565b600080600060608486031215613cd957600080fd5b6000613ce786828701613b10565b9350506020613cf886828701613b10565b9250506040613d0986828701613bf7565b9150509250925092565b60008060008060808587031215613d2957600080fd5b6000613d3787828801613b10565b9450506020613d4887828801613b10565b9350506040613d5987828801613bf7565b925050606085013567ffffffffffffffff811115613d7657600080fd5b613d8287828801613ba3565b91505092959194509250565b60008060408385031215613da157600080fd5b6000613daf85828601613b10565b9250506020613dc085828601613b3a565b9150509250929050565b600080600060608486031215613ddf57600080fd5b6000613ded86828701613b10565b935050602084013567ffffffffffffffff811115613e0a57600080fd5b613e1686828701613bcd565b9250506040613e2786828701613bf7565b9150509250925092565b600080600080600080600060e0888a031215613e4c57600080fd5b6000613e5a8a828b01613b10565b975050602088013567ffffffffffffffff811115613e7757600080fd5b613e838a828b01613bcd565b9650506040613e948a828b01613bf7565b9550506060613ea58a828b01613bf7565b9450506080613eb68a828b01613c21565b93505060a0613ec78a828b01613b64565b92505060c0613ed88a828b01613b64565b91505092959891949750929550565b60008060008060008060c08789031215613f0057600080fd5b6000613f0e89828a01613b10565b965050602087013567ffffffffffffffff811115613f2b57600080fd5b613f3789828a01613bcd565b9550506040613f4889828a01613bf7565b9450506060613f5989828a01613c21565b9350506080613f6a89828a01613b64565b92505060a0613f7b89828a01613b64565b9150509295509295509295565b60008060408385031215613f9b57600080fd5b6000613fa985828601613b10565b9250506020613fba85828601613bf7565b9150509250929050565b600060208284031215613fd657600080fd5b6000613fe484828501613b4f565b91505092915050565b600060208284031215613fff57600080fd5b600061400d84828501613b79565b91505092915050565b60006020828403121561402857600080fd5b600061403684828501613b8e565b91505092915050565b60006020828403121561405157600080fd5b600061405f84828501613bf7565b91505092915050565b60006020828403121561407a57600080fd5b600061408884828501613c0c565b91505092915050565b600080604083850312156140a457600080fd5b60006140b285828601613bf7565b92505060206140c385828601613bf7565b9150509250929050565b60006140d98383614ca5565b905092915050565b6140ea8161554d565b82525050565b6140f9816154c2565b82525050565b614108816154b0565b82525050565b600061411982615428565b6141238185615456565b93508360208202850161413585615418565b8060005b85811015614171578484038952815161415285826140cd565b945061415d83615449565b925060208a01995050600181019050614139565b50829750879550505050505092915050565b61418c816154d4565b82525050565b61419b816154d4565b82525050565b6141aa816154e0565b82525050565b6141c16141bc826154e0565b6155fb565b82525050565b60006141d282615433565b6141dc8185615467565b93506141ec8185602086016155b6565b6141f581615623565b840191505092915050565b600061420b82615433565b6142158185615478565b93506142258185602086016155b6565b80840191505092915050565b61424261423d8261555f565b6155e9565b82525050565b60006142538261543e565b61425d8185615483565b935061426d8185602086016155b6565b61427681615623565b840191505092915050565b600061428c8261543e565b6142968185615494565b93506142a68185602086016155b6565b6142af81615623565b840191505092915050565b60006142c58261543e565b6142cf81856154a5565b93506142df8185602086016155b6565b80840191505092915050565b60006142f8602283615494565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435e601c836154a5565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b600061439e603283615494565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614404601c83615494565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614444601883615494565b91507f616d6f756e74206578636565647320616c6c6f77616e636500000000000000006000830152602082019050919050565b6000614484602483615494565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ea601983615494565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452a601e83615494565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456a602683615494565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d0602c83615494565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614636601a83615494565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000614676601983615494565b91507f6f776e65722073686f756c64207369676e20746f6b656e4964000000000000006000830152602082019050919050565b60006146b6603883615494565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061471c602a83615494565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614782602283615494565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e8601883615494565b91507f4e6f7420656e6f75676820616d6f756e7420746f2062757900000000000000006000830152602082019050919050565b6000614828602083615494565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614868601683615494565b91507f546f6b656e20616c726561647920666f722053616c65000000000000000000006000830152602082019050919050565b60006148a8602183615494565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061490e602c83615494565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614974602c83615494565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149da602983615494565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a40602f83615494565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614aa6601783615494565b91507f53616c652050726963652043616e74206265207a65726f0000000000000000006000830152602082019050919050565b6000614ae6602183615494565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b4c603183615494565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614bb2601d83615494565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bf2600c83615494565b91507f4e6f7420666f722053616c6500000000000000000000000000000000000000006000830152602082019050919050565b6000614c32600a83615494565b91507f4f6e6c79204f776e6572000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c72601283615494565b91507f546f6b656e206e6f7420666f722053616c6500000000000000000000000000006000830152602082019050919050565b600060a083016000830151614cbd6000860182614d1b565b506020830151614cd06020860182614d1b565b506040830151614ce36040860182614d1b565b506060830151614cf66060860182614183565b5060808301518482036080860152614d0e8282614248565b9150508091505092915050565b614d2481615536565b82525050565b614d3381615536565b82525050565b614d4a614d4582615536565b615617565b82525050565b614d5981615540565b82525050565b6000614d6b8284614200565b915081905092915050565b6000614d828285614231565b601482019150614d928284614d39565b6020820191508190509392505050565b6000614dae82856142ba565b9150614dba82846142ba565b91508190509392505050565b6000614dd182614351565b9150614ddd82846141b0565b60208201915081905092915050565b6000602082019050614e0160008301846140ff565b92915050565b6000602082019050614e1c60008301846140f0565b92915050565b6000604082019050614e3760008301856140e1565b614e4460208301846140ff565b9392505050565b6000606082019050614e6060008301866140e1565b614e6d60208301856140e1565b614e7a6040830184614d2a565b949350505050565b6000608082019050614e9760008301876140f0565b614ea460208301866140ff565b614eb16040830185614d2a565b8181036060830152614ec381846141c7565b905095945050505050565b60006020820190508181036000830152614ee8818461410e565b905092915050565b6000602082019050614f056000830184614192565b92915050565b6000608082019050614f2060008301876141a1565b614f2d6020830186614d50565b614f3a60408301856141a1565b614f4760608301846141a1565b95945050505050565b60006020820190508181036000830152614f6a8184614281565b905092915050565b60006020820190508181036000830152614f8b816142eb565b9050919050565b60006020820190508181036000830152614fab81614391565b9050919050565b60006020820190508181036000830152614fcb816143f7565b9050919050565b60006020820190508181036000830152614feb81614437565b9050919050565b6000602082019050818103600083015261500b81614477565b9050919050565b6000602082019050818103600083015261502b816144dd565b9050919050565b6000602082019050818103600083015261504b8161451d565b9050919050565b6000602082019050818103600083015261506b8161455d565b9050919050565b6000602082019050818103600083015261508b816145c3565b9050919050565b600060208201905081810360008301526150ab81614629565b9050919050565b600060208201905081810360008301526150cb81614669565b9050919050565b600060208201905081810360008301526150eb816146a9565b9050919050565b6000602082019050818103600083015261510b8161470f565b9050919050565b6000602082019050818103600083015261512b81614775565b9050919050565b6000602082019050818103600083015261514b816147db565b9050919050565b6000602082019050818103600083015261516b8161481b565b9050919050565b6000602082019050818103600083015261518b8161485b565b9050919050565b600060208201905081810360008301526151ab8161489b565b9050919050565b600060208201905081810360008301526151cb81614901565b9050919050565b600060208201905081810360008301526151eb81614967565b9050919050565b6000602082019050818103600083015261520b816149cd565b9050919050565b6000602082019050818103600083015261522b81614a33565b9050919050565b6000602082019050818103600083015261524b81614a99565b9050919050565b6000602082019050818103600083015261526b81614ad9565b9050919050565b6000602082019050818103600083015261528b81614b3f565b9050919050565b600060208201905081810360008301526152ab81614ba5565b9050919050565b600060208201905081810360008301526152cb81614be5565b9050919050565b600060208201905081810360008301526152eb81614c25565b9050919050565b6000602082019050818103600083015261530b81614c65565b9050919050565b60006020820190506153276000830184614d2a565b92915050565b600060a0820190506153426000830188614d2a565b61534f6020830187614d2a565b61535c6040830186614d2a565b6153696060830185614192565b818103608083015261537b8184614281565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff821117156153ae576153ad615621565b5b8060405250919050565b600067ffffffffffffffff8211156153d3576153d2615621565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561540357615402615621565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006154bb82615516565b9050919050565b60006154cd82615516565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061555882615583565b9050919050565b600061556a82615571565b9050919050565b600061557c82615516565b9050919050565b600061558e82615595565b9050919050565b60006155a082615516565b9050919050565b82818337600083830152505050565b60005b838110156155d45780820151818401526020810190506155b9565b838111156155e3576000848401525b50505050565b60006155f482615605565b9050919050565b6000819050919050565b600061561082615634565b9050919050565b6000819050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b61564a816154b0565b811461565557600080fd5b50565b615661816154c2565b811461566c57600080fd5b50565b615678816154d4565b811461568357600080fd5b50565b61568f816154e0565b811461569a57600080fd5b50565b6156a6816154ea565b81146156b157600080fd5b50565b6156bd81615536565b81146156c857600080fd5b50565b6156d481615540565b81146156df57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122021380bc2c122d502c1ccb402847277616a9a53387d2b9012af2c831b50bd6ce464736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003daecae376ad4fb15ead85fb69827c26ea01bd0b000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000257650985d0794158b53438e0e6b178c2a389a81
-----Decoded View---------------
Arg [0] : _FP3D (address): 0x3DAeCAE376Ad4FB15eAd85Fb69827C26EA01Bd0B
Arg [1] : _USDC (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : signer (address): 0x257650985D0794158b53438E0e6b178c2a389A81
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003daecae376ad4fb15ead85fb69827c26ea01bd0b
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 000000000000000000000000257650985d0794158b53438e0e6b178c2a389a81
Deployed Bytecode Sourcemap
65681:2916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9036:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50022:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52808:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66389:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46634:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;52338:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63149:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67178:601;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62333:813;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51816:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53698:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46674:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46369:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51578:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67793:607;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54074:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52104:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49778:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64684:286;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51397:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49495:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46423:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50191:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66698:472;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53101:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66218:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54296:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50366:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63594:1052;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53467:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66033:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9036:150;9121:4;9145:20;:33;9166:11;9145:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9138:40;;9036:150;;;:::o;50022:100::-;50076:13;50109:5;50102:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50022:100;:::o;52808:221::-;52884:7;52912:16;52920:7;52912;:16::i;:::-;52904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52997:15;:24;53013:7;52997:24;;;;;;;;;;;;;;;;;;;;;52990:31;;52808:221;;;:::o;66389:295::-;66498:7;66547:13;;;;;;;;;;;66531:29;;:12;:10;:12::i;:::-;:29;;;66523:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66587:22;66593:6;66601:7;66587:5;:22::i;:::-;66620:31;66633:7;66642:8;66620:12;:31::i;:::-;66669:7;66662:14;;66389:295;;;;;:::o;46634:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52338:404::-;52419:13;52435:23;52450:7;52435:14;:23::i;:::-;52419:39;;52483:5;52477:11;;:2;:11;;;;52469:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52563:5;52547:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;52572:44;52596:5;52603:12;:10;:12::i;:::-;52572:23;:44::i;:::-;52547:69;52539:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;52713:21;52722:2;52726:7;52713:8;:21::i;:::-;52338:404;;;:::o;63149:437::-;63207:23;63233:12;63246:7;63233:21;;;;;;;;;;;;;;;;;;63207:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63261:14;63278:21;63286:4;:12;;;63278:7;:21::i;:::-;63261:38;;63321:21;63329:4;:12;;;63321:7;:21::i;:::-;63313:30;;;;;;63368:10;63358:20;;:6;:20;;;63350:29;;;;;;63421:4;63396:29;;:7;:21;63404:4;:12;;;63396:21;;;;;;;;;;;;;;;;;;;;;:29;;;63388:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63486:5;63462:7;:21;63470:4;:12;;;63462:21;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63530:5;63498:12;63511:7;63498:21;;;;;;;;;;;;;;;;;;:29;;;:37;;;;;;;;;;;;;;;;;;63569:4;:12;;;63553:29;;;;;;;;;;63149:437;;;:::o;67178:601::-;67345:7;67399:78;67409:58;67450:4;67457:7;67433:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67423:43;;;;;;67409:13;:58::i;:::-;67469:1;67472;67475;67399:78;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67378:99;;:17;;;;;;;;;;;:99;;;67370:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;67572:6;67526:4;;;;;;;;;;;:14;;;67541:12;:10;:12::i;:::-;67562:4;67526:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;67518:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;67619:4;;;;;;;;;;;:17;;;67637:12;:10;:12::i;:::-;67650:13;;;;;;;;;;;67664:6;67619:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67682:22;67688:6;67696:7;67682:5;:22::i;:::-;67715:31;67728:7;67737:8;67715:12;:31::i;:::-;67764:7;67757:14;;67178:601;;;;;;;;;:::o;62333:813::-;62408:7;62424:14;62441:17;62449:8;62441:7;:17::i;:::-;62424:34;;62487:1;62475:9;:13;62467:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62553:5;62532:26;;:7;:17;62540:8;62532:17;;;;;;;;;;;;;;;;;;;;;:26;;;62524:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62607:17;62615:8;62607:7;:17::i;:::-;62599:26;;;;;;62650:10;62640:20;;:6;:20;;;62632:29;;;;;;62670:34;62687:4;62695:8;62670;:34::i;:::-;62731:4;62711:7;:17;62719:8;62711:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;62749:17;62769:12;:19;;;;62749:39;;62799:12;62831:154;;;;;;;;62861:9;62831:154;;;;62889:8;62831:154;;;;62916:9;62831:154;;;;62944:4;62831:154;;;;;;;;;;;;;;;;;;;;;;;;;;62799:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;63007:10;;:12;;;;;;;;;;;;;63045:8;63031:35;63056:9;63031:35;;;;;;:::i;:::-;;;;;;;;63110:8;63103:4;63078:41;;63087:6;63078:41;;;;;;;;;;;;63133:9;63126:16;;;;62333:813;;;;:::o;51816:211::-;51877:7;51998:21;:12;:19;:21::i;:::-;51991:28;;51816:211;:::o;53698:305::-;53859:41;53878:12;:10;:12::i;:::-;53892:7;53859:18;:41::i;:::-;53851:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53967:28;53977:4;53983:2;53987:7;53967:9;:28::i;:::-;53698:305;;;:::o;46674:25::-;;;;:::o;46369:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;51578:162::-;51675:7;51702:30;51726:5;51702:13;:20;51716:5;51702:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;51695:37;;51578:162;;;;:::o;67793:607::-;67959:7;68021:77;68031:57;68072:4;68078:7;68055:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68045:42;;;;;;68031:13;:57::i;:::-;68090:1;68093;68096;68021:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68000:98;;:17;;;;;;;;;;;:98;;;67992:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;68193:6;68147:4;;;;;;;;;;;:14;;;68162:12;:10;:12::i;:::-;68183:4;68147:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;68139:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;68240:4;;;;;;;;;;;:17;;;68258:12;:10;:12::i;:::-;68271:13;;;;;;;;;;;68285:6;68240:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68303:22;68309:6;68317:7;68303:5;:22::i;:::-;68336:31;68349:7;68358:8;68336:12;:31::i;:::-;68385:7;68378:14;;67793:607;;;;;;;;;:::o;54074:151::-;54178:39;54195:4;54201:2;54205:7;54178:39;;;;;;;;;;;;:16;:39::i;:::-;54074:151;;;:::o;52104:172::-;52179:7;52200:15;52221:22;52237:5;52221:12;:15;;:22;;;;:::i;:::-;52199:44;;;52261:7;52254:14;;;52104:172;;;:::o;49778:177::-;49850:7;49877:70;49894:7;49877:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;49870:77;;49778:177;;;:::o;64684:286::-;64725:20;64755:26;64802:1;64784:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64755:49;;64818:6;64813:131;64834:10;;64830:1;:14;64813:131;;;64864:24;64891:12;64904:1;64891:15;;;;;;;;;;;;;;;;;;64864:42;;64930:4;64919:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;64925:1;64919:8;;;;;;;;;;;;;:15;;;;64813:131;64846:3;;;;;;;64813:131;;;;64959:5;64952:12;;;64684:286;:::o;51397:97::-;51445:13;51478:8;51471:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51397:97;:::o;49495:221::-;49567:7;49612:1;49595:19;;:5;:19;;;;49587:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49679:29;:13;:20;49693:5;49679:20;;;;;;;;;;;;;;;:27;:29::i;:::-;49672:36;;49495:221;;;:::o;46423:36::-;;;;;;;;;;;;;:::o;50191:104::-;50247:13;50280:7;50273:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50191:104;:::o;66698:472::-;66856:7;66910:78;66920:58;66961:4;66968:7;66944:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66934:43;;;;;;66920:13;:58::i;:::-;66980:1;66983;66986;66910:78;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66889:99;;:17;;;;;;;;;;;:99;;;66881:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;67029:13;;;;;;;;;;;:22;;:33;67052:9;67029:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67073:22;67079:6;67087:7;67073:5;:22::i;:::-;67106:31;67119:7;67128:8;67106:12;:31::i;:::-;67155:7;67148:14;;66698:472;;;;;;;;:::o;53101:295::-;53216:12;:10;:12::i;:::-;53204:24;;:8;:24;;;;53196:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53316:8;53271:18;:32;53290:12;:10;:12::i;:::-;53271:32;;;;;;;;;;;;;;;:42;53304:8;53271:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;53369:8;53340:48;;53355:12;:10;:12::i;:::-;53340:48;;;53379:8;53340:48;;;;;;:::i;:::-;;;;;;;;53101:295;;:::o;66218:156::-;66298:13;;;;;;;;;;;66282:29;;:12;:10;:12::i;:::-;:29;;;66274:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66358:6;66338:17;;:26;;;;;;;;;;;;;;;;;;66218:156;:::o;54296:285::-;54428:41;54447:12;:10;:12::i;:::-;54461:7;54428:18;:41::i;:::-;54420:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54534:39;54548:4;54554:2;54558:7;54567:5;54534:13;:39::i;:::-;54296:285;;;;:::o;50366:792::-;50439:13;50473:16;50481:7;50473;:16::i;:::-;50465:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50554:23;50580:10;:19;50591:7;50580:19;;;;;;;;;;;50554:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50610:18;50631:9;:7;:9::i;:::-;50610:30;;50738:1;50722:4;50716:18;:23;50712:72;;;50763:9;50756:16;;;;;;50712:72;50914:1;50894:9;50888:23;:27;50884:108;;;50963:4;50969:9;50946:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50932:48;;;;;;50884:108;51124:4;51130:18;:7;:16;:18::i;:::-;51107:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51093:57;;;;50366:792;;;;:::o;63594:1052::-;63648:23;63674:12;63687:7;63674:21;;;;;;;;;;;;;;;;;;63648:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63704:13;63720:10;63704:26;;63737:15;63755:9;63737:27;;63781:21;63789:4;:12;;;63781:7;:21::i;:::-;63773:30;;;;;;63855:4;63818:42;;:25;63830:4;:12;;;63818:11;:25::i;:::-;:42;;;63810:51;;;;;;63947:4;63922:29;;:7;:21;63930:4;:12;;;63922:21;;;;;;;;;;;;;;;;;;;;;:29;;;63914:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;64016:4;63983:37;;:12;63996:7;63983:21;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;:37;;;63975:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;64066:12;64079:7;64066:21;;;;;;;;;;;;;;;;;;:33;;;64052:10;:47;;64044:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;64143:11;64157:64;64199:21;64158:35;64173:19;64158:10;:14;;:35;;;;:::i;:::-;64157:41;;:64;;;;:::i;:::-;64143:78;;64228:19;64250;64265:3;64250:10;:14;;:19;;;;:::i;:::-;64228:41;;64299:22;64332:21;64340:4;:12;;;64332:7;:21::i;:::-;64299:55;;64361:6;:15;;:28;64377:11;64361:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64402:13;;;;;;;;;;;:22;;:27;64425:3;64402:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64442:56;64455:21;64463:4;:12;;;64455:7;:21::i;:::-;64478:5;64485:4;:12;;;64442;:56::i;:::-;64536:5;64512:7;:21;64520:4;:12;;;64512:21;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;64580:5;64548:12;64561:7;64548:21;;;;;;;;;;;;;;;;;;:29;;;:37;;;;;;;;;;;;;;;;;;64631:10;64616:4;:12;;;64608:5;64603:39;;;;;;;;;;;;63594:1052;;;;;;;:::o;53467:164::-;53564:4;53588:18;:25;53607:5;53588:25;;;;;;;;;;;;;;;:35;53614:8;53588:35;;;;;;;;;;;;;;;;;;;;;;;;;53581:42;;53467:164;;;;:::o;66033:169::-;66128:13;;;;;;;;;;;66112:29;;:12;:10;:12::i;:::-;:29;;;66104:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66184:8;66168:13;;:24;;;;;;;;;;;;;;;;;;66033:169;:::o;56048:127::-;56113:4;56137:30;56159:7;56137:12;:21;;:30;;;;:::i;:::-;56130:37;;56048:127;;;:::o;115:106::-;168:15;203:10;196:17;;115:106;:::o;57963:404::-;58057:1;58043:16;;:2;:16;;;;58035:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58116:16;58124:7;58116;:16::i;:::-;58115:17;58107:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58178:45;58207:1;58211:2;58215:7;58178:20;:45::i;:::-;58236:30;58258:7;58236:13;:17;58250:2;58236:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;58279:29;58296:7;58305:2;58279:12;:16;;:29;;;;;:::i;:::-;;58351:7;58347:2;58326:33;;58343:1;58326:33;;;;;;;;;;;;57963:404;;:::o;60303:215::-;60403:16;60411:7;60403;:16::i;:::-;60395:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60501:9;60479:10;:19;60490:7;60479:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;60303:215;;:::o;62136:192::-;62238:2;62211:15;:24;62227:7;62211:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62294:7;62290:2;62256:46;;62265:23;62280:7;62265:14;:23::i;:::-;62256:46;;;;;;;;;;;;62136:192;;:::o;68412:177::-;68478:7;68567:12;68514:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;68504:77;;;;;;68497:84;;68412:177;;;:::o;42488:123::-;42557:7;42584:19;42592:3;:10;;42584:7;:19::i;:::-;42577:26;;42488:123;;;:::o;56342:355::-;56435:4;56460:16;56468:7;56460;:16::i;:::-;56452:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56536:13;56552:23;56567:7;56552:14;:23::i;:::-;56536:39;;56605:5;56594:16;;:7;:16;;;:51;;;;56638:7;56614:31;;:20;56626:7;56614:11;:20::i;:::-;:31;;;56594:51;:94;;;;56649:39;56673:5;56680:7;56649:23;:39::i;:::-;56594:94;56586:103;;;56342:355;;;;:::o;59513:634::-;59638:4;59611:31;;:23;59626:7;59611:14;:23::i;:::-;:31;;;59603:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59739:1;59725:16;;:2;:16;;;;59717:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59795:39;59816:4;59822:2;59826:7;59795:20;:39::i;:::-;59899:29;59916:1;59920:7;59899:8;:29::i;:::-;59941:35;59968:7;59941:13;:19;59955:4;59941:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;59987:30;60009:7;59987:13;:17;60001:2;59987:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60030:29;60047:7;60056:2;60030:12;:16;;:29;;;;;:::i;:::-;;60091:5;60072:7;:16;60080:7;60072:16;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;60131:7;60127:2;60112:27;;60121:4;60112:27;;;;;;;;;;;;59513:634;;;:::o;35108:137::-;35179:7;35214:22;35218:3;:10;;35230:5;35214:3;:22::i;:::-;35206:31;;35199:38;;35108:137;;;;:::o;42950:236::-;43030:7;43039;43060:11;43073:13;43090:22;43094:3;:10;;43106:5;43090:3;:22::i;:::-;43059:53;;;;43139:3;43131:12;;43169:5;43161:14;;43123:55;;;;;;42950:236;;;;;:::o;44236:213::-;44343:7;44394:44;44399:3;:10;;44419:3;44411:12;;44425;44394:4;:44::i;:::-;44386:53;;44363:78;;44236:213;;;;;:::o;34650:114::-;34710:7;34737:19;34745:3;:10;;34737:7;:19::i;:::-;34730:26;;34650:114;;;:::o;55463:272::-;55577:28;55587:4;55593:2;55597:7;55577:9;:28::i;:::-;55624:48;55647:4;55653:2;55657:7;55666:5;55624:22;:48::i;:::-;55616:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55463:272;;;;:::o;44569:746::-;44625:13;44855:1;44846:5;:10;44842:53;;;44873:10;;;;;;;;;;;;;;;;;;;;;44842:53;44905:12;44920:5;44905:20;;44936:14;44961:78;44976:1;44968:4;:9;44961:78;;44994:8;;;;;;;45025:2;45017:10;;;;;;;;;44961:78;;;45049:19;45081:6;45071:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45049:39;;45099:13;45124:1;45115:6;:10;45099:26;;45143:5;45136:12;;45159:117;45174:1;45166:4;:9;45159:117;;45235:2;45228:4;:9;;;;;;45223:2;:14;45210:29;;45192:6;45199:7;;;;;;;45192:15;;;;;;;;;;;:47;;;;;;;;;;;45262:2;45254:10;;;;;;;;;45159:117;;;45300:6;45286:21;;;;;;44569:746;;;;:::o;14689:220::-;14747:7;14776:1;14771;:6;14767:20;;;14786:1;14779:8;;;;14767:20;14798:9;14814:1;14810;:5;14798:17;;14843:1;14838;14834;:5;;;;;;:10;14826:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14900:1;14893:8;;;14689:220;;;;;:::o;15387:153::-;15445:7;15477:1;15473;:5;15465:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;15531:1;15527;:5;;;;;;15520:12;;15387:153;;;;:::o;14272:158::-;14330:7;14363:1;14358;:6;;14350:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:1;14417;:5;14410:12;;14272:158;;;;:::o;42249:151::-;42333:4;42357:35;42367:3;:10;;42387:3;42379:12;;42357:9;:35::i;:::-;42350:42;;42249:151;;;;:::o;65581:93::-;;;;:::o;33888:131::-;33955:4;33979:32;33984:3;:10;;34004:5;33996:14;;33979:4;:32::i;:::-;33972:39;;33888:131;;;;:::o;41672:185::-;41761:4;41785:64;41790:3;:10;;41810:3;41802:12;;41840:5;41824:23;;41816:32;;41785:4;:64::i;:::-;41778:71;;41672:185;;;;;:::o;39067:110::-;39123:7;39150:3;:12;;:19;;;;39143:26;;39067:110;;;:::o;34195:137::-;34265:4;34289:35;34297:3;:10;;34317:5;34309:14;;34289:7;:35::i;:::-;34282:42;;34195:137;;;;:::o;30146:204::-;30213:7;30262:5;30241:3;:11;;:18;;;;:26;30233:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30324:3;:11;;30336:5;30324:18;;;;;;;;;;;;;;;;30317:25;;30146:204;;;;:::o;39532:279::-;39599:7;39608;39658:5;39636:3;:12;;:19;;;;:27;39628:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39715:22;39740:3;:12;;39753:5;39740:19;;;;;;;;;;;;;;;;;;39715:44;;39778:5;:10;;;39790:5;:12;;;39770:33;;;;;39532:279;;;;;:::o;41029:319::-;41123:7;41143:16;41162:3;:12;;:17;41175:3;41162:17;;;;;;;;;;;;41143:36;;41210:1;41198:8;:13;;41213:12;41190:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41280:3;:12;;41304:1;41293:8;:12;41280:26;;;;;;;;;;;;;;;;;;:33;;;41273:40;;;41029:319;;;;;:::o;29693:109::-;29749:7;29776:3;:11;;:18;;;;29769:25;;29693:109;;;:::o;61413:604::-;61534:4;61561:15;:2;:13;;;:15::i;:::-;61556:60;;61600:4;61593:11;;;;61556:60;61626:23;61652:252;61705:45;;;61765:12;:10;:12::i;:::-;61792:4;61811:7;61833:5;61668:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61652:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;61626:278;;61915:13;61942:10;61931:32;;;;;;;;;;;;:::i;:::-;61915:48;;45838:10;61992:16;;61982:26;;;:6;:26;;;;61974:35;;;;61413:604;;;;;;;:::o;38847:125::-;38918:4;38963:1;38942:3;:12;;:17;38955:3;38942:17;;;;;;;;;;;;:22;;38935:29;;38847:125;;;;:::o;27258:414::-;27321:4;27343:21;27353:3;27358:5;27343:9;:21::i;:::-;27338:327;;27381:3;:11;;27398:5;27381:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27564:3;:11;;:18;;;;27542:3;:12;;:19;27555:5;27542:19;;;;;;;;;;;:40;;;;27604:4;27597:11;;;;27338:327;27648:5;27641:12;;27258:414;;;;;:::o;36347:692::-;36423:4;36539:16;36558:3;:12;;:17;36571:3;36558:17;;;;;;;;;;;;36539:36;;36604:1;36592:8;:13;36588:444;;;36659:3;:12;;36677:38;;;;;;;;36694:3;36677:38;;;;36707:5;36677:38;;;36659:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36874:3;:12;;:19;;;;36854:3;:12;;:17;36867:3;36854:17;;;;;;;;;;;:39;;;;36915:4;36908:11;;;;;36588:444;36988:5;36952:3;:12;;36976:1;36965:8;:12;36952:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;37015:5;37008:12;;;36347:692;;;;;;:::o;27848:1544::-;27914:4;28032:18;28053:3;:12;;:19;28066:5;28053:19;;;;;;;;;;;;28032:40;;28103:1;28089:10;:15;28085:1300;;28451:21;28488:1;28475:10;:14;28451:38;;28504:17;28545:1;28524:3;:11;;:18;;;;:22;28504:42;;28791:17;28811:3;:11;;28823:9;28811:22;;;;;;;;;;;;;;;;28791:42;;28957:9;28928:3;:11;;28940:13;28928:26;;;;;;;;;;;;;;;:38;;;;29076:1;29060:13;:17;29034:3;:12;;:23;29047:9;29034:23;;;;;;;;;;;:43;;;;29186:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;29281:3;:12;;:19;29294:5;29281:19;;;;;;;;;;;29274:26;;;29324:4;29317:11;;;;;;;;28085:1300;29368:5;29361:12;;;27848:1544;;;;;:::o;19087:422::-;19147:4;19355:12;19466:7;19454:20;19446:28;;19500:1;19493:4;:8;19486:15;;;19087:422;;;:::o;22005:195::-;22108:12;22140:52;22162:6;22170:4;22176:1;22179:12;22140:21;:52::i;:::-;22133:59;;22005:195;;;;;:::o;29478:129::-;29551:4;29598:1;29575:3;:12;;:19;29588:5;29575:19;;;;;;;;;;;;:24;;29568:31;;29478:129;;;;:::o;23057:530::-;23184:12;23242:5;23217:21;:30;;23209:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23309:18;23320:6;23309:10;:18::i;:::-;23301:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23435:12;23449:23;23476:6;:11;;23496:5;23504:4;23476:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23434:75;;;;23527:52;23545:7;23554:10;23566:12;23527:17;:52::i;:::-;23520:59;;;;23057:530;;;;;;:::o;25597:742::-;25712:12;25741:7;25737:595;;;25772:10;25765:17;;;;25737:595;25906:1;25886:10;:17;:21;25882:439;;;26149:10;26143:17;26210:15;26197:10;26193:2;26189:19;26182:44;26097:148;26292:12;26285:20;;;;;;;;;;;:::i;:::-;;;;;;;;25597:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1011:133::-;;1092:6;1079:20;1070:29;;1108:30;1132:5;1108:30;:::i;:::-;1060:84;;;;:::o;1150:137::-;;1235:6;1229:13;1220:22;;1251:30;1275:5;1251:30;:::i;:::-;1210:77;;;;:::o;1293:139::-;;1377:6;1364:20;1355:29;;1393:33;1420:5;1393:33;:::i;:::-;1345:87;;;;:::o;1438:137::-;;1521:6;1508:20;1499:29;;1537:32;1563:5;1537:32;:::i;:::-;1489:86;;;;:::o;1581:141::-;;1668:6;1662:13;1653:22;;1684:32;1710:5;1684:32;:::i;:::-;1643:79;;;;:::o;1741:271::-;;1845:3;1838:4;1830:6;1826:17;1822:27;1812:2;;1863:1;1860;1853:12;1812:2;1903:6;1890:20;1928:78;2002:3;1994:6;1987:4;1979:6;1975:17;1928:78;:::i;:::-;1919:87;;1802:210;;;;;:::o;2032:273::-;;2137:3;2130:4;2122:6;2118:17;2114:27;2104:2;;2155:1;2152;2145:12;2104:2;2195:6;2182:20;2220:79;2295:3;2287:6;2280:4;2272:6;2268:17;2220:79;:::i;:::-;2211:88;;2094:211;;;;;:::o;2311:139::-;;2395:6;2382:20;2373:29;;2411:33;2438:5;2411:33;:::i;:::-;2363:87;;;;:::o;2456:143::-;;2544:6;2538:13;2529:22;;2560:33;2587:5;2560:33;:::i;:::-;2519:80;;;;:::o;2605:135::-;;2687:6;2674:20;2665:29;;2703:31;2728:5;2703:31;:::i;:::-;2655:85;;;;:::o;2746:262::-;;2854:2;2842:9;2833:7;2829:23;2825:32;2822:2;;;2870:1;2867;2860:12;2822:2;2913:1;2938:53;2983:7;2974:6;2963:9;2959:22;2938:53;:::i;:::-;2928:63;;2884:117;2812:196;;;;:::o;3014:278::-;;3130:2;3118:9;3109:7;3105:23;3101:32;3098:2;;;3146:1;3143;3136:12;3098:2;3189:1;3214:61;3267:7;3258:6;3247:9;3243:22;3214:61;:::i;:::-;3204:71;;3160:125;3088:204;;;;:::o;3298:407::-;;;3423:2;3411:9;3402:7;3398:23;3394:32;3391:2;;;3439:1;3436;3429:12;3391:2;3482:1;3507:53;3552:7;3543:6;3532:9;3528:22;3507:53;:::i;:::-;3497:63;;3453:117;3609:2;3635:53;3680:7;3671:6;3660:9;3656:22;3635:53;:::i;:::-;3625:63;;3580:118;3381:324;;;;;:::o;3711:552::-;;;;3853:2;3841:9;3832:7;3828:23;3824:32;3821:2;;;3869:1;3866;3859:12;3821:2;3912:1;3937:53;3982:7;3973:6;3962:9;3958:22;3937:53;:::i;:::-;3927:63;;3883:117;4039:2;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4010:118;4167:2;4193:53;4238:7;4229:6;4218:9;4214:22;4193:53;:::i;:::-;4183:63;;4138:118;3811:452;;;;;:::o;4269:809::-;;;;;4437:3;4425:9;4416:7;4412:23;4408:33;4405:2;;;4454:1;4451;4444:12;4405:2;4497:1;4522:53;4567:7;4558:6;4547:9;4543:22;4522:53;:::i;:::-;4512:63;;4468:117;4624:2;4650:53;4695:7;4686:6;4675:9;4671:22;4650:53;:::i;:::-;4640:63;;4595:118;4752:2;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4723:118;4908:2;4897:9;4893:18;4880:32;4939:18;4931:6;4928:30;4925:2;;;4971:1;4968;4961:12;4925:2;4999:62;5053:7;5044:6;5033:9;5029:22;4999:62;:::i;:::-;4989:72;;4851:220;4395:683;;;;;;;:::o;5084:401::-;;;5206:2;5194:9;5185:7;5181:23;5177:32;5174:2;;;5222:1;5219;5212:12;5174:2;5265:1;5290:53;5335:7;5326:6;5315:9;5311:22;5290:53;:::i;:::-;5280:63;;5236:117;5392:2;5418:50;5460:7;5451:6;5440:9;5436:22;5418:50;:::i;:::-;5408:60;;5363:115;5164:321;;;;;:::o;5491:665::-;;;;5643:2;5631:9;5622:7;5618:23;5614:32;5611:2;;;5659:1;5656;5649:12;5611:2;5702:1;5727:53;5772:7;5763:6;5752:9;5748:22;5727:53;:::i;:::-;5717:63;;5673:117;5857:2;5846:9;5842:18;5829:32;5888:18;5880:6;5877:30;5874:2;;;5920:1;5917;5910:12;5874:2;5948:63;6003:7;5994:6;5983:9;5979:22;5948:63;:::i;:::-;5938:73;;5800:221;6060:2;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6031:118;5601:555;;;;;:::o;6162:1245::-;;;;;;;;6380:3;6368:9;6359:7;6355:23;6351:33;6348:2;;;6397:1;6394;6387:12;6348:2;6440:1;6465:53;6510:7;6501:6;6490:9;6486:22;6465:53;:::i;:::-;6455:63;;6411:117;6595:2;6584:9;6580:18;6567:32;6626:18;6618:6;6615:30;6612:2;;;6658:1;6655;6648:12;6612:2;6686:63;6741:7;6732:6;6721:9;6717:22;6686:63;:::i;:::-;6676:73;;6538:221;6798:2;6824:53;6869:7;6860:6;6849:9;6845:22;6824:53;:::i;:::-;6814:63;;6769:118;6926:2;6952:53;6997:7;6988:6;6977:9;6973:22;6952:53;:::i;:::-;6942:63;;6897:118;7054:3;7081:51;7124:7;7115:6;7104:9;7100:22;7081:51;:::i;:::-;7071:61;;7025:117;7181:3;7208:53;7253:7;7244:6;7233:9;7229:22;7208:53;:::i;:::-;7198:63;;7152:119;7310:3;7337:53;7382:7;7373:6;7362:9;7358:22;7337:53;:::i;:::-;7327:63;;7281:119;6338:1069;;;;;;;;;;:::o;7413:1099::-;;;;;;;7614:3;7602:9;7593:7;7589:23;7585:33;7582:2;;;7631:1;7628;7621:12;7582:2;7674:1;7699:53;7744:7;7735:6;7724:9;7720:22;7699:53;:::i;:::-;7689:63;;7645:117;7829:2;7818:9;7814:18;7801:32;7860:18;7852:6;7849:30;7846:2;;;7892:1;7889;7882:12;7846:2;7920:63;7975:7;7966:6;7955:9;7951:22;7920:63;:::i;:::-;7910:73;;7772:221;8032:2;8058:53;8103:7;8094:6;8083:9;8079:22;8058:53;:::i;:::-;8048:63;;8003:118;8160:2;8186:51;8229:7;8220:6;8209:9;8205:22;8186:51;:::i;:::-;8176:61;;8131:116;8286:3;8313:53;8358:7;8349:6;8338:9;8334:22;8313:53;:::i;:::-;8303:63;;8257:119;8415:3;8442:53;8487:7;8478:6;8467:9;8463:22;8442:53;:::i;:::-;8432:63;;8386:119;7572:940;;;;;;;;:::o;8518:407::-;;;8643:2;8631:9;8622:7;8618:23;8614:32;8611:2;;;8659:1;8656;8649:12;8611:2;8702:1;8727:53;8772:7;8763:6;8752:9;8748:22;8727:53;:::i;:::-;8717:63;;8673:117;8829:2;8855:53;8900:7;8891:6;8880:9;8876:22;8855:53;:::i;:::-;8845:63;;8800:118;8601:324;;;;;:::o;8931:278::-;;9047:2;9035:9;9026:7;9022:23;9018:32;9015:2;;;9063:1;9060;9053:12;9015:2;9106:1;9131:61;9184:7;9175:6;9164:9;9160:22;9131:61;:::i;:::-;9121:71;;9077:125;9005:204;;;;:::o;9215:260::-;;9322:2;9310:9;9301:7;9297:23;9293:32;9290:2;;;9338:1;9335;9328:12;9290:2;9381:1;9406:52;9450:7;9441:6;9430:9;9426:22;9406:52;:::i;:::-;9396:62;;9352:116;9280:195;;;;:::o;9481:282::-;;9599:2;9587:9;9578:7;9574:23;9570:32;9567:2;;;9615:1;9612;9605:12;9567:2;9658:1;9683:63;9738:7;9729:6;9718:9;9714:22;9683:63;:::i;:::-;9673:73;;9629:127;9557:206;;;;:::o;9769:262::-;;9877:2;9865:9;9856:7;9852:23;9848:32;9845:2;;;9893:1;9890;9883:12;9845:2;9936:1;9961:53;10006:7;9997:6;9986:9;9982:22;9961:53;:::i;:::-;9951:63;;9907:117;9835:196;;;;:::o;10037:284::-;;10156:2;10144:9;10135:7;10131:23;10127:32;10124:2;;;10172:1;10169;10162:12;10124:2;10215:1;10240:64;10296:7;10287:6;10276:9;10272:22;10240:64;:::i;:::-;10230:74;;10186:128;10114:207;;;;:::o;10327:407::-;;;10452:2;10440:9;10431:7;10427:23;10423:32;10420:2;;;10468:1;10465;10458:12;10420:2;10511:1;10536:53;10581:7;10572:6;10561:9;10557:22;10536:53;:::i;:::-;10526:63;;10482:117;10638:2;10664:53;10709:7;10700:6;10689:9;10685:22;10664:53;:::i;:::-;10654:63;;10609:118;10410:324;;;;;:::o;10740:272::-;;10902:104;11002:3;10994:6;10902:104;:::i;:::-;10888:118;;10878:134;;;;:::o;11018:147::-;11113:45;11152:5;11113:45;:::i;:::-;11108:3;11101:58;11091:74;;:::o;11171:142::-;11274:32;11300:5;11274:32;:::i;:::-;11269:3;11262:45;11252:61;;:::o;11319:118::-;11406:24;11424:5;11406:24;:::i;:::-;11401:3;11394:37;11384:53;;:::o;11509:1143::-;;11715:83;11792:5;11715:83;:::i;:::-;11814:115;11922:6;11917:3;11814:115;:::i;:::-;11807:122;;11955:3;12000:4;11992:6;11988:17;11983:3;11979:27;12030:85;12109:5;12030:85;:::i;:::-;12138:7;12169:1;12154:453;12179:6;12176:1;12173:13;12154:453;;;12250:9;12244:4;12240:20;12235:3;12228:33;12301:6;12295:13;12329:122;12446:4;12431:13;12329:122;:::i;:::-;12321:130;;12474:89;12556:6;12474:89;:::i;:::-;12464:99;;12592:4;12587:3;12583:14;12576:21;;12214:393;12201:1;12198;12194:9;12189:14;;12154:453;;;12158:14;12623:4;12616:11;;12643:3;12636:10;;11691:961;;;;;;;;;:::o;12658:99::-;12729:21;12744:5;12729:21;:::i;:::-;12724:3;12717:34;12707:50;;:::o;12763:109::-;12844:21;12859:5;12844:21;:::i;:::-;12839:3;12832:34;12822:50;;:::o;12878:118::-;12965:24;12983:5;12965:24;:::i;:::-;12960:3;12953:37;12943:53;;:::o;13002:157::-;13107:45;13127:24;13145:5;13127:24;:::i;:::-;13107:45;:::i;:::-;13102:3;13095:58;13085:74;;:::o;13165:360::-;;13279:38;13311:5;13279:38;:::i;:::-;13333:70;13396:6;13391:3;13333:70;:::i;:::-;13326:77;;13412:52;13457:6;13452:3;13445:4;13438:5;13434:16;13412:52;:::i;:::-;13489:29;13511:6;13489:29;:::i;:::-;13484:3;13480:39;13473:46;;13255:270;;;;;:::o;13531:373::-;;13663:38;13695:5;13663:38;:::i;:::-;13717:88;13798:6;13793:3;13717:88;:::i;:::-;13710:95;;13814:52;13859:6;13854:3;13847:4;13840:5;13836:16;13814:52;:::i;:::-;13891:6;13886:3;13882:16;13875:23;;13639:265;;;;;:::o;13910:198::-;14029:72;14049:51;14094:5;14049:51;:::i;:::-;14029:72;:::i;:::-;14024:3;14017:85;14007:101;;:::o;14114:344::-;;14220:39;14253:5;14220:39;:::i;:::-;14275:61;14329:6;14324:3;14275:61;:::i;:::-;14268:68;;14345:52;14390:6;14385:3;14378:4;14371:5;14367:16;14345:52;:::i;:::-;14422:29;14444:6;14422:29;:::i;:::-;14417:3;14413:39;14406:46;;14196:262;;;;;:::o;14464:364::-;;14580:39;14613:5;14580:39;:::i;:::-;14635:71;14699:6;14694:3;14635:71;:::i;:::-;14628:78;;14715:52;14760:6;14755:3;14748:4;14741:5;14737:16;14715:52;:::i;:::-;14792:29;14814:6;14792:29;:::i;:::-;14787:3;14783:39;14776:46;;14556:272;;;;;:::o;14834:377::-;;14968:39;15001:5;14968:39;:::i;:::-;15023:89;15105:6;15100:3;15023:89;:::i;:::-;15016:96;;15121:52;15166:6;15161:3;15154:4;15147:5;15143:16;15121:52;:::i;:::-;15198:6;15193:3;15189:16;15182:23;;14944:267;;;;;:::o;15217:366::-;;15380:67;15444:2;15439:3;15380:67;:::i;:::-;15373:74;;15477:34;15473:1;15468:3;15464:11;15457:55;15543:4;15538:2;15533:3;15529:12;15522:26;15574:2;15569:3;15565:12;15558:19;;15363:220;;;:::o;15589:398::-;;15770:85;15852:2;15847:3;15770:85;:::i;:::-;15763:92;;15885:66;15881:1;15876:3;15872:11;15865:87;15978:2;15973:3;15969:12;15962:19;;15753:234;;;:::o;15993:382::-;;16156:67;16220:2;16215:3;16156:67;:::i;:::-;16149:74;;16253:34;16249:1;16244:3;16240:11;16233:55;16319:20;16314:2;16309:3;16305:12;16298:42;16366:2;16361:3;16357:12;16350:19;;16139:236;;;:::o;16381:326::-;;16544:67;16608:2;16603:3;16544:67;:::i;:::-;16537:74;;16641:30;16637:1;16632:3;16628:11;16621:51;16698:2;16693:3;16689:12;16682:19;;16527:180;;;:::o;16713:322::-;;16876:67;16940:2;16935:3;16876:67;:::i;:::-;16869:74;;16973:26;16969:1;16964:3;16960:11;16953:47;17026:2;17021:3;17017:12;17010:19;;16859:176;;;:::o;17041:368::-;;17204:67;17268:2;17263:3;17204:67;:::i;:::-;17197:74;;17301:34;17297:1;17292:3;17288:11;17281:55;17367:6;17362:2;17357:3;17353:12;17346:28;17400:2;17395:3;17391:12;17384:19;;17187:222;;;:::o;17415:323::-;;17578:67;17642:2;17637:3;17578:67;:::i;:::-;17571:74;;17675:27;17671:1;17666:3;17662:11;17655:48;17729:2;17724:3;17720:12;17713:19;;17561:177;;;:::o;17744:328::-;;17907:67;17971:2;17966:3;17907:67;:::i;:::-;17900:74;;18004:32;18000:1;17995:3;17991:11;17984:53;18063:2;18058:3;18054:12;18047:19;;17890:182;;;:::o;18078:370::-;;18241:67;18305:2;18300:3;18241:67;:::i;:::-;18234:74;;18338:34;18334:1;18329:3;18325:11;18318:55;18404:8;18399:2;18394:3;18390:12;18383:30;18439:2;18434:3;18430:12;18423:19;;18224:224;;;:::o;18454:376::-;;18617:67;18681:2;18676:3;18617:67;:::i;:::-;18610:74;;18714:34;18710:1;18705:3;18701:11;18694:55;18780:14;18775:2;18770:3;18766:12;18759:36;18821:2;18816:3;18812:12;18805:19;;18600:230;;;:::o;18836:324::-;;18999:67;19063:2;19058:3;18999:67;:::i;:::-;18992:74;;19096:28;19092:1;19087:3;19083:11;19076:49;19151:2;19146:3;19142:12;19135:19;;18982:178;;;:::o;19166:323::-;;19329:67;19393:2;19388:3;19329:67;:::i;:::-;19322:74;;19426:27;19422:1;19417:3;19413:11;19406:48;19480:2;19475:3;19471:12;19464:19;;19312:177;;;:::o;19495:388::-;;19658:67;19722:2;19717:3;19658:67;:::i;:::-;19651:74;;19755:34;19751:1;19746:3;19742:11;19735:55;19821:26;19816:2;19811:3;19807:12;19800:48;19874:2;19869:3;19865:12;19858:19;;19641:242;;;:::o;19889:374::-;;20052:67;20116:2;20111:3;20052:67;:::i;:::-;20045:74;;20149:34;20145:1;20140:3;20136:11;20129:55;20215:12;20210:2;20205:3;20201:12;20194:34;20254:2;20249:3;20245:12;20238:19;;20035:228;;;:::o;20269:366::-;;20432:67;20496:2;20491:3;20432:67;:::i;:::-;20425:74;;20529:34;20525:1;20520:3;20516:11;20509:55;20595:4;20590:2;20585:3;20581:12;20574:26;20626:2;20621:3;20617:12;20610:19;;20415:220;;;:::o;20641:322::-;;20804:67;20868:2;20863:3;20804:67;:::i;:::-;20797:74;;20901:26;20897:1;20892:3;20888:11;20881:47;20954:2;20949:3;20945:12;20938:19;;20787:176;;;:::o;20969:330::-;;21132:67;21196:2;21191:3;21132:67;:::i;:::-;21125:74;;21229:34;21225:1;21220:3;21216:11;21209:55;21290:2;21285:3;21281:12;21274:19;;21115:184;;;:::o;21305:320::-;;21468:67;21532:2;21527:3;21468:67;:::i;:::-;21461:74;;21565:24;21561:1;21556:3;21552:11;21545:45;21616:2;21611:3;21607:12;21600:19;;21451:174;;;:::o;21631:365::-;;21794:67;21858:2;21853:3;21794:67;:::i;:::-;21787:74;;21891:34;21887:1;21882:3;21878:11;21871:55;21957:3;21952:2;21947:3;21943:12;21936:25;21987:2;21982:3;21978:12;21971:19;;21777:219;;;:::o;22002:376::-;;22165:67;22229:2;22224:3;22165:67;:::i;:::-;22158:74;;22262:34;22258:1;22253:3;22249:11;22242:55;22328:14;22323:2;22318:3;22314:12;22307:36;22369:2;22364:3;22360:12;22353:19;;22148:230;;;:::o;22384:376::-;;22547:67;22611:2;22606:3;22547:67;:::i;:::-;22540:74;;22644:34;22640:1;22635:3;22631:11;22624:55;22710:14;22705:2;22700:3;22696:12;22689:36;22751:2;22746:3;22742:12;22735:19;;22530:230;;;:::o;22766:373::-;;22929:67;22993:2;22988:3;22929:67;:::i;:::-;22922:74;;23026:34;23022:1;23017:3;23013:11;23006:55;23092:11;23087:2;23082:3;23078:12;23071:33;23130:2;23125:3;23121:12;23114:19;;22912:227;;;:::o;23145:379::-;;23308:67;23372:2;23367:3;23308:67;:::i;:::-;23301:74;;23405:34;23401:1;23396:3;23392:11;23385:55;23471:17;23466:2;23461:3;23457:12;23450:39;23515:2;23510:3;23506:12;23499:19;;23291:233;;;:::o;23530:321::-;;23693:67;23757:2;23752:3;23693:67;:::i;:::-;23686:74;;23790:25;23786:1;23781:3;23777:11;23770:46;23842:2;23837:3;23833:12;23826:19;;23676:175;;;:::o;23857:365::-;;24020:67;24084:2;24079:3;24020:67;:::i;:::-;24013:74;;24117:34;24113:1;24108:3;24104:11;24097:55;24183:3;24178:2;24173:3;24169:12;24162:25;24213:2;24208:3;24204:12;24197:19;;24003:219;;;:::o;24228:381::-;;24391:67;24455:2;24450:3;24391:67;:::i;:::-;24384:74;;24488:34;24484:1;24479:3;24475:11;24468:55;24554:19;24549:2;24544:3;24540:12;24533:41;24600:2;24595:3;24591:12;24584:19;;24374:235;;;:::o;24615:327::-;;24778:67;24842:2;24837:3;24778:67;:::i;:::-;24771:74;;24875:31;24871:1;24866:3;24862:11;24855:52;24933:2;24928:3;24924:12;24917:19;;24761:181;;;:::o;24948:310::-;;25111:67;25175:2;25170:3;25111:67;:::i;:::-;25104:74;;25208:14;25204:1;25199:3;25195:11;25188:35;25249:2;25244:3;25240:12;25233:19;;25094:164;;;:::o;25264:308::-;;25427:67;25491:2;25486:3;25427:67;:::i;:::-;25420:74;;25524:12;25520:1;25515:3;25511:11;25504:33;25563:2;25558:3;25554:12;25547:19;;25410:162;;;:::o;25578:316::-;;25741:67;25805:2;25800:3;25741:67;:::i;:::-;25734:74;;25838:20;25834:1;25829:3;25825:11;25818:41;25885:2;25880:3;25876:12;25869:19;;25724:170;;;:::o;25962:1134::-;;26115:4;26110:3;26106:14;26200:4;26193:5;26189:16;26183:23;26219:63;26276:4;26271:3;26267:14;26253:12;26219:63;:::i;:::-;26130:162;26377:4;26370:5;26366:16;26360:23;26396:63;26453:4;26448:3;26444:14;26430:12;26396:63;:::i;:::-;26302:167;26558:4;26551:5;26547:16;26541:23;26577:63;26634:4;26629:3;26625:14;26611:12;26577:63;:::i;:::-;26479:171;26735:4;26728:5;26724:16;26718:23;26754:57;26805:4;26800:3;26796:14;26782:12;26754:57;:::i;:::-;26660:161;26906:4;26899:5;26895:16;26889:23;26959:3;26953:4;26949:14;26942:4;26937:3;26933:14;26926:38;26985:73;27053:4;27039:12;26985:73;:::i;:::-;26977:81;;26831:238;27086:4;27079:11;;26084:1012;;;;;:::o;27102:108::-;27179:24;27197:5;27179:24;:::i;:::-;27174:3;27167:37;27157:53;;:::o;27216:118::-;27303:24;27321:5;27303:24;:::i;:::-;27298:3;27291:37;27281:53;;:::o;27340:157::-;27445:45;27465:24;27483:5;27465:24;:::i;:::-;27445:45;:::i;:::-;27440:3;27433:58;27423:74;;:::o;27503:112::-;27586:22;27602:5;27586:22;:::i;:::-;27581:3;27574:35;27564:51;;:::o;27621:271::-;;27773:93;27862:3;27853:6;27773:93;:::i;:::-;27766:100;;27883:3;27876:10;;27755:137;;;;:::o;27898:425::-;;28067:89;28152:3;28143:6;28067:89;:::i;:::-;28181:2;28176:3;28172:12;28165:19;;28194:75;28265:3;28256:6;28194:75;:::i;:::-;28294:2;28289:3;28285:12;28278:19;;28314:3;28307:10;;28056:267;;;;;:::o;28329:435::-;;28531:95;28622:3;28613:6;28531:95;:::i;:::-;28524:102;;28643:95;28734:3;28725:6;28643:95;:::i;:::-;28636:102;;28755:3;28748:10;;28513:251;;;;;:::o;28770:522::-;;29005:148;29149:3;29005:148;:::i;:::-;28998:155;;29163:75;29234:3;29225:6;29163:75;:::i;:::-;29263:2;29258:3;29254:12;29247:19;;29283:3;29276:10;;28987:305;;;;:::o;29298:222::-;;29429:2;29418:9;29414:18;29406:26;;29442:71;29510:1;29499:9;29495:17;29486:6;29442:71;:::i;:::-;29396:124;;;;:::o;29526:254::-;;29673:2;29662:9;29658:18;29650:26;;29686:87;29770:1;29759:9;29755:17;29746:6;29686:87;:::i;:::-;29640:140;;;;:::o;29786:348::-;;29953:2;29942:9;29938:18;29930:26;;29966:79;30042:1;30031:9;30027:17;30018:6;29966:79;:::i;:::-;30055:72;30123:2;30112:9;30108:18;30099:6;30055:72;:::i;:::-;29920:214;;;;;:::o;30140:474::-;;30343:2;30332:9;30328:18;30320:26;;30356:79;30432:1;30421:9;30417:17;30408:6;30356:79;:::i;:::-;30445:80;30521:2;30510:9;30506:18;30497:6;30445:80;:::i;:::-;30535:72;30603:2;30592:9;30588:18;30579:6;30535:72;:::i;:::-;30310:304;;;;;;:::o;30620:672::-;;30869:3;30858:9;30854:19;30846:27;;30883:87;30967:1;30956:9;30952:17;30943:6;30883:87;:::i;:::-;30980:72;31048:2;31037:9;31033:18;31024:6;30980:72;:::i;:::-;31062;31130:2;31119:9;31115:18;31106:6;31062:72;:::i;:::-;31181:9;31175:4;31171:20;31166:2;31155:9;31151:18;31144:48;31209:76;31280:4;31271:6;31209:76;:::i;:::-;31201:84;;30836:456;;;;;;;:::o;31298:489::-;;31537:2;31526:9;31522:18;31514:26;;31586:9;31580:4;31576:20;31572:1;31561:9;31557:17;31550:47;31614:166;31775:4;31766:6;31614:166;:::i;:::-;31606:174;;31504:283;;;;:::o;31793:210::-;;31918:2;31907:9;31903:18;31895:26;;31931:65;31993:1;31982:9;31978:17;31969:6;31931:65;:::i;:::-;31885:118;;;;:::o;32009:545::-;;32220:3;32209:9;32205:19;32197:27;;32234:71;32302:1;32291:9;32287:17;32278:6;32234:71;:::i;:::-;32315:68;32379:2;32368:9;32364:18;32355:6;32315:68;:::i;:::-;32393:72;32461:2;32450:9;32446:18;32437:6;32393:72;:::i;:::-;32475;32543:2;32532:9;32528:18;32519:6;32475:72;:::i;:::-;32187:367;;;;;;;:::o;32560:313::-;;32711:2;32700:9;32696:18;32688:26;;32760:9;32754:4;32750:20;32746:1;32735:9;32731:17;32724:47;32788:78;32861:4;32852:6;32788:78;:::i;:::-;32780:86;;32678:195;;;;:::o;32879:419::-;;33083:2;33072:9;33068:18;33060:26;;33132:9;33126:4;33122:20;33118:1;33107:9;33103:17;33096:47;33160:131;33286:4;33160:131;:::i;:::-;33152:139;;33050:248;;;:::o;33304:419::-;;33508:2;33497:9;33493:18;33485:26;;33557:9;33551:4;33547:20;33543:1;33532:9;33528:17;33521:47;33585:131;33711:4;33585:131;:::i;:::-;33577:139;;33475:248;;;:::o;33729:419::-;;33933:2;33922:9;33918:18;33910:26;;33982:9;33976:4;33972:20;33968:1;33957:9;33953:17;33946:47;34010:131;34136:4;34010:131;:::i;:::-;34002:139;;33900:248;;;:::o;34154:419::-;;34358:2;34347:9;34343:18;34335:26;;34407:9;34401:4;34397:20;34393:1;34382:9;34378:17;34371:47;34435:131;34561:4;34435:131;:::i;:::-;34427:139;;34325:248;;;:::o;34579:419::-;;34783:2;34772:9;34768:18;34760:26;;34832:9;34826:4;34822:20;34818:1;34807:9;34803:17;34796:47;34860:131;34986:4;34860:131;:::i;:::-;34852:139;;34750:248;;;:::o;35004:419::-;;35208:2;35197:9;35193:18;35185:26;;35257:9;35251:4;35247:20;35243:1;35232:9;35228:17;35221:47;35285:131;35411:4;35285:131;:::i;:::-;35277:139;;35175:248;;;:::o;35429:419::-;;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35600:248;;;:::o;35854:419::-;;36058:2;36047:9;36043:18;36035:26;;36107:9;36101:4;36097:20;36093:1;36082:9;36078:17;36071:47;36135:131;36261:4;36135:131;:::i;:::-;36127:139;;36025:248;;;:::o;36279:419::-;;36483:2;36472:9;36468:18;36460:26;;36532:9;36526:4;36522:20;36518:1;36507:9;36503:17;36496:47;36560:131;36686:4;36560:131;:::i;:::-;36552:139;;36450:248;;;:::o;36704:419::-;;36908:2;36897:9;36893:18;36885:26;;36957:9;36951:4;36947:20;36943:1;36932:9;36928:17;36921:47;36985:131;37111:4;36985:131;:::i;:::-;36977:139;;36875:248;;;:::o;37129:419::-;;37333:2;37322:9;37318:18;37310:26;;37382:9;37376:4;37372:20;37368:1;37357:9;37353:17;37346:47;37410:131;37536:4;37410:131;:::i;:::-;37402:139;;37300:248;;;:::o;37554:419::-;;37758:2;37747:9;37743:18;37735:26;;37807:9;37801:4;37797:20;37793:1;37782:9;37778:17;37771:47;37835:131;37961:4;37835:131;:::i;:::-;37827:139;;37725:248;;;:::o;37979:419::-;;38183:2;38172:9;38168:18;38160:26;;38232:9;38226:4;38222:20;38218:1;38207:9;38203:17;38196:47;38260:131;38386:4;38260:131;:::i;:::-;38252:139;;38150:248;;;:::o;38404:419::-;;38608:2;38597:9;38593:18;38585:26;;38657:9;38651:4;38647:20;38643:1;38632:9;38628:17;38621:47;38685:131;38811:4;38685:131;:::i;:::-;38677:139;;38575:248;;;:::o;38829:419::-;;39033:2;39022:9;39018:18;39010:26;;39082:9;39076:4;39072:20;39068:1;39057:9;39053:17;39046:47;39110:131;39236:4;39110:131;:::i;:::-;39102:139;;39000:248;;;:::o;39254:419::-;;39458:2;39447:9;39443:18;39435:26;;39507:9;39501:4;39497:20;39493:1;39482:9;39478:17;39471:47;39535:131;39661:4;39535:131;:::i;:::-;39527:139;;39425:248;;;:::o;39679:419::-;;39883:2;39872:9;39868:18;39860:26;;39932:9;39926:4;39922:20;39918:1;39907:9;39903:17;39896:47;39960:131;40086:4;39960:131;:::i;:::-;39952:139;;39850:248;;;:::o;40104:419::-;;40308:2;40297:9;40293:18;40285:26;;40357:9;40351:4;40347:20;40343:1;40332:9;40328:17;40321:47;40385:131;40511:4;40385:131;:::i;:::-;40377:139;;40275:248;;;:::o;40529:419::-;;40733:2;40722:9;40718:18;40710:26;;40782:9;40776:4;40772:20;40768:1;40757:9;40753:17;40746:47;40810:131;40936:4;40810:131;:::i;:::-;40802:139;;40700:248;;;:::o;40954:419::-;;41158:2;41147:9;41143:18;41135:26;;41207:9;41201:4;41197:20;41193:1;41182:9;41178:17;41171:47;41235:131;41361:4;41235:131;:::i;:::-;41227:139;;41125:248;;;:::o;41379:419::-;;41583:2;41572:9;41568:18;41560:26;;41632:9;41626:4;41622:20;41618:1;41607:9;41603:17;41596:47;41660:131;41786:4;41660:131;:::i;:::-;41652:139;;41550:248;;;:::o;41804:419::-;;42008:2;41997:9;41993:18;41985:26;;42057:9;42051:4;42047:20;42043:1;42032:9;42028:17;42021:47;42085:131;42211:4;42085:131;:::i;:::-;42077:139;;41975:248;;;:::o;42229:419::-;;42433:2;42422:9;42418:18;42410:26;;42482:9;42476:4;42472:20;42468:1;42457:9;42453:17;42446:47;42510:131;42636:4;42510:131;:::i;:::-;42502:139;;42400:248;;;:::o;42654:419::-;;42858:2;42847:9;42843:18;42835:26;;42907:9;42901:4;42897:20;42893:1;42882:9;42878:17;42871:47;42935:131;43061:4;42935:131;:::i;:::-;42927:139;;42825:248;;;:::o;43079:419::-;;43283:2;43272:9;43268:18;43260:26;;43332:9;43326:4;43322:20;43318:1;43307:9;43303:17;43296:47;43360:131;43486:4;43360:131;:::i;:::-;43352:139;;43250:248;;;:::o;43504:419::-;;43708:2;43697:9;43693:18;43685:26;;43757:9;43751:4;43747:20;43743:1;43732:9;43728:17;43721:47;43785:131;43911:4;43785:131;:::i;:::-;43777:139;;43675:248;;;:::o;43929:419::-;;44133:2;44122:9;44118:18;44110:26;;44182:9;44176:4;44172:20;44168:1;44157:9;44153:17;44146:47;44210:131;44336:4;44210:131;:::i;:::-;44202:139;;44100:248;;;:::o;44354:419::-;;44558:2;44547:9;44543:18;44535:26;;44607:9;44601:4;44597:20;44593:1;44582:9;44578:17;44571:47;44635:131;44761:4;44635:131;:::i;:::-;44627:139;;44525:248;;;:::o;44779:419::-;;44983:2;44972:9;44968:18;44960:26;;45032:9;45026:4;45022:20;45018:1;45007:9;45003:17;44996:47;45060:131;45186:4;45060:131;:::i;:::-;45052:139;;44950:248;;;:::o;45204:222::-;;45335:2;45324:9;45320:18;45312:26;;45348:71;45416:1;45405:9;45401:17;45392:6;45348:71;:::i;:::-;45302:124;;;;:::o;45432:743::-;;45689:3;45678:9;45674:19;45666:27;;45703:71;45771:1;45760:9;45756:17;45747:6;45703:71;:::i;:::-;45784:72;45852:2;45841:9;45837:18;45828:6;45784:72;:::i;:::-;45866;45934:2;45923:9;45919:18;45910:6;45866:72;:::i;:::-;45948:66;46010:2;45999:9;45995:18;45986:6;45948:66;:::i;:::-;46062:9;46056:4;46052:20;46046:3;46035:9;46031:19;46024:49;46090:78;46163:4;46154:6;46090:78;:::i;:::-;46082:86;;45656:519;;;;;;;;:::o;46181:278::-;;46247:2;46241:9;46231:19;;46289:4;46281:6;46277:17;46396:6;46384:10;46381:22;46360:18;46348:10;46345:34;46342:62;46339:2;;;46407:13;;:::i;:::-;46339:2;46442:10;46438:2;46431:22;46221:238;;;;:::o;46465:326::-;;46616:18;46608:6;46605:30;46602:2;;;46638:13;;:::i;:::-;46602:2;46718:4;46714:9;46707:4;46699:6;46695:17;46691:33;46683:41;;46779:4;46773;46769:15;46761:23;;46531:260;;;:::o;46797:327::-;;46949:18;46941:6;46938:30;46935:2;;;46971:13;;:::i;:::-;46935:2;47051:4;47047:9;47040:4;47032:6;47028:17;47024:33;47016:41;;47112:4;47106;47102:15;47094:23;;46864:260;;;:::o;47130:161::-;;47249:3;47241:11;;47279:4;47274:3;47270:14;47262:22;;47231:60;;;:::o;47297:143::-;;47427:5;47421:12;47411:22;;47400:40;;;:::o;47446:98::-;;47531:5;47525:12;47515:22;;47504:40;;;:::o;47550:99::-;;47636:5;47630:12;47620:22;;47609:40;;;:::o;47655:142::-;;47786:4;47781:3;47777:14;47769:22;;47759:38;;;:::o;47803:213::-;;47965:6;47960:3;47953:19;48005:4;48000:3;47996:14;47981:29;;47943:73;;;;:::o;48022:168::-;;48139:6;48134:3;48127:19;48179:4;48174:3;48170:14;48155:29;;48117:73;;;;:::o;48196:147::-;;48334:3;48319:18;;48309:34;;;;:::o;48349:159::-;;48457:6;48452:3;48445:19;48497:4;48492:3;48488:14;48473:29;;48435:73;;;;:::o;48514:169::-;;48632:6;48627:3;48620:19;48672:4;48667:3;48663:14;48648:29;;48610:73;;;;:::o;48689:148::-;;48828:3;48813:18;;48803:34;;;;:::o;48843:96::-;;48909:24;48927:5;48909:24;:::i;:::-;48898:35;;48888:51;;;:::o;48945:104::-;;49019:24;49037:5;49019:24;:::i;:::-;49008:35;;48998:51;;;:::o;49055:90::-;;49132:5;49125:13;49118:21;49107:32;;49097:48;;;:::o;49151:77::-;;49217:5;49206:16;;49196:32;;;:::o;49234:149::-;;49310:66;49303:5;49299:78;49288:89;;49278:105;;;:::o;49389:126::-;;49466:42;49459:5;49455:54;49444:65;;49434:81;;;:::o;49521:77::-;;49587:5;49576:16;;49566:32;;;:::o;49604:86::-;;49679:4;49672:5;49668:16;49657:27;;49647:43;;;:::o;49696:134::-;;49787:37;49818:5;49787:37;:::i;:::-;49774:50;;49764:66;;;:::o;49836:154::-;;49933:51;49978:5;49933:51;:::i;:::-;49920:64;;49910:80;;;:::o;49996:127::-;;50093:24;50111:5;50093:24;:::i;:::-;50080:37;;50070:53;;;:::o;50129:126::-;;50212:37;50243:5;50212:37;:::i;:::-;50199:50;;50189:66;;;:::o;50261:113::-;;50344:24;50362:5;50344:24;:::i;:::-;50331:37;;50321:53;;;:::o;50380:154::-;50464:6;50459:3;50454;50441:30;50526:1;50517:6;50512:3;50508:16;50501:27;50431:103;;;:::o;50540:307::-;50608:1;50618:113;50632:6;50629:1;50626:13;50618:113;;;50717:1;50712:3;50708:11;50702:18;50698:1;50693:3;50689:11;50682:39;50654:2;50651:1;50647:10;50642:15;;50618:113;;;50749:6;50746:1;50743:13;50740:2;;;50829:1;50820:6;50815:3;50811:16;50804:27;50740:2;50589:258;;;;:::o;50853:100::-;;50921:26;50941:5;50921:26;:::i;:::-;50910:37;;50900:53;;;:::o;50959:79::-;;51027:5;51016:16;;51006:32;;;:::o;51044:94::-;;51112:20;51126:5;51112:20;:::i;:::-;51101:31;;51091:47;;;:::o;51144:79::-;;51212:5;51201:16;;51191:32;;;:::o;51229:48::-;51262:9;51283:102;;51375:2;51371:7;51366:2;51359:5;51355:14;51351:28;51341:38;;51331:54;;;:::o;51391:94::-;;51472:5;51468:2;51464:14;51443:35;;51433:52;;;:::o;51491:122::-;51564:24;51582:5;51564:24;:::i;:::-;51557:5;51554:35;51544:2;;51603:1;51600;51593:12;51544:2;51534:79;:::o;51619:138::-;51700:32;51726:5;51700:32;:::i;:::-;51693:5;51690:43;51680:2;;51747:1;51744;51737:12;51680:2;51670:87;:::o;51763:116::-;51833:21;51848:5;51833:21;:::i;:::-;51826:5;51823:32;51813:2;;51869:1;51866;51859:12;51813:2;51803:76;:::o;51885:122::-;51958:24;51976:5;51958:24;:::i;:::-;51951:5;51948:35;51938:2;;51997:1;51994;51987:12;51938:2;51928:79;:::o;52013:120::-;52085:23;52102:5;52085:23;:::i;:::-;52078:5;52075:34;52065:2;;52123:1;52120;52113:12;52065:2;52055:78;:::o;52139:122::-;52212:24;52230:5;52212:24;:::i;:::-;52205:5;52202:35;52192:2;;52251:1;52248;52241:12;52192:2;52182:79;:::o;52267:118::-;52338:22;52354:5;52338:22;:::i;:::-;52331:5;52328:33;52318:2;;52375:1;52372;52365:12;52318:2;52308:77;:::o
Swarm Source
ipfs://21380bc2c122d502c1ccb402847277616a9a53387d2b9012af2c831b50bd6ce4
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.