Source Code
Latest 25 from a total of 198 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Releaserooms | 17459149 | 988 days ago | IN | 0 ETH | 0.00339944 | ||||
| Claim Rewards | 17459147 | 988 days ago | IN | 0 ETH | 0.00176618 | ||||
| Claim Rewards | 16759880 | 1087 days ago | IN | 0 ETH | 0.00208058 | ||||
| Releaserooms | 16759864 | 1087 days ago | IN | 0 ETH | 0.01049903 | ||||
| Releaserooms | 16754602 | 1088 days ago | IN | 0 ETH | 0.01126513 | ||||
| Releaserooms | 16617724 | 1107 days ago | IN | 0 ETH | 0.00631068 | ||||
| Claim Rewards | 16594606 | 1110 days ago | IN | 0 ETH | 0.00458624 | ||||
| Claim Rewards | 16548477 | 1117 days ago | IN | 0 ETH | 0.00301625 | ||||
| Claim Rewards | 16538124 | 1118 days ago | IN | 0 ETH | 0.00273012 | ||||
| Rentrooms | 16518372 | 1121 days ago | IN | 0 ETH | 0.00633696 | ||||
| Rentrooms | 16509327 | 1122 days ago | IN | 0 ETH | 0.00548208 | ||||
| Rentrooms | 16507221 | 1123 days ago | IN | 0 ETH | 0.00552784 | ||||
| Rentrooms | 16506020 | 1123 days ago | IN | 0 ETH | 0.00558485 | ||||
| Claim Rewards | 16504497 | 1123 days ago | IN | 0 ETH | 0.00174459 | ||||
| Rentrooms | 16495659 | 1124 days ago | IN | 0 ETH | 0.00582771 | ||||
| Rentrooms | 16490688 | 1125 days ago | IN | 0 ETH | 0.00555664 | ||||
| Rentrooms | 16488951 | 1125 days ago | IN | 0 ETH | 0.00605295 | ||||
| Rentrooms | 16487078 | 1125 days ago | IN | 0 ETH | 0.00890701 | ||||
| Rentrooms | 16484749 | 1126 days ago | IN | 0 ETH | 0.00902674 | ||||
| Rentrooms | 16483912 | 1126 days ago | IN | 0 ETH | 0.00684947 | ||||
| Rentrooms | 16483085 | 1126 days ago | IN | 0 ETH | 0.00516297 | ||||
| Rentrooms | 16480326 | 1126 days ago | IN | 0 ETH | 0.00649525 | ||||
| Rentrooms | 16478487 | 1127 days ago | IN | 0 ETH | 0.02273585 | ||||
| Rentrooms | 16475167 | 1127 days ago | IN | 0 ETH | 0.00734123 | ||||
| Rentrooms | 16469260 | 1128 days ago | IN | 0 ETH | 0.01064929 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Rooms_Renting
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-01-15
*/
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
//"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,"5000000000000000000",2,"1668708000","1668967200","1672509600"
pragma solidity ^0.8.0;
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);
function numberTokensLocked(address owner) external view returns (uint256 number);
/**
* @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`.
*
* 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;
/**
* @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;
function totalSupply() external view returns (uint256);
/**
* @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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
abstract contract ReentrancyGuard {
// word because each write operation emits an extra SLOAD to first read the
// back. This is the compiler's defense against contract upgrades and
// but in exchange the refund on every call to nonReentrant will be lower in
// transaction's gas, it is best to keep them low in cases like this one, to
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
abstract contract EIP712 {
/* solhint-disable var-name-mixedcase */
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
uint256 private immutable _CACHED_CHAIN_ID;
address private immutable _CACHED_THIS;
bytes32 private immutable _HASHED_NAME;
bytes32 private immutable _HASHED_VERSION;
bytes32 private immutable _TYPE_HASH;
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_CACHED_THIS = address(this);
_TYPE_HASH = typeHash;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR;
} else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
}
}
function _buildDomainSeparator(
bytes32 typeHash,
bytes32 nameHash,
bytes32 versionHash
) private view returns (bytes32) {
return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
}
}
//SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
contract Rooms_Renting is EIP712, Ownable, ReentrancyGuard{
using SafeMath for uint256;
string private constant SIGNING_DOMAIN = "sanctum";
string private constant SIGNATURE_VERSION = "1";
bool paused = false;
//Erc20 Variables
IERC20 public rewardToken;
//Locking Variables
uint256 public totalroomsLocked = 0;
mapping(address => uint256) private _balances;
mapping(address => uint256) public lastClaimTime;
mapping(uint => uint256) public voucherIds;
//Collection Variables
IERC721 public nft;
IERC721 public Neophyte_Locking_contract;
mapping(uint256 => address) public tokenIdOwners;
mapping(uint256 => uint256) public rewardingList;
uint public totalNums=0;
mapping(address => uint256) public numberTokensLocked;
mapping(address => mapping(uint256 => uint256)) public ownerTokenIds;
uint[] public legendids;
address private Verify = 0x1479d797B8431d0D47F2e7A18d589dD67a4b7dc4;
modifier updateReward(address account) {
uint256 reward = getRewards(account);
lastClaimTime[account] = block.timestamp;
_balances[account] += reward;
_;
}
///////////////////////////////////////////////////////////////////
struct Locking_record{
uint tokenid;
uint perdaytoken;
uint owntime;
uint starttime;
uint endtime;
uint total;
}
////////////////////////////////////////////////////////////////////
struct user_record{
Locking_record[] nft_entries;
uint totalentries;
uint totalreward;
uint claimedreward;
uint total_Locked_Nfts;
}
mapping(address => user_record) private user_db;
constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){
//nft = IERC721(_nftAddress);
//rewardToken = IERC20(_rewardToken);
}
function add_token_rates(uint[] memory list) public onlyOwner{
for(uint i=0;i<list.length;i++){
totalNums++;
rewardingList[totalNums]=list[i] * 1 ether;
}
}
//once dispose function will run it should empty the list otherwise it will cause issues,start and ends added to cover transaction failures
function dispose_rewarding_list(uint start, uint ends) public onlyOwner{
for(uint i=start;i<=ends;i++){
totalNums--;
delete rewardingList[i];
}
}
//this function is to get estimated earing for 1 day if you rent now
function Rewards_Calculator_per_entry_checker(address user,uint tokenid, uint ot) public view returns(uint) {
uint tm=0;
if(ot==5)
{
uint totalentries=user_db[user].totalentries;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].tokenid==tokenid)
{
tm = user_db[user].nft_entries[i].owntime;
}
}
}
else{tm=ot;}
uint owntime = tm;
uint starttime = block.timestamp;
uint endtime = starttime+86401;
if(endtime==0){endtime=block.timestamp;}
uint perdaytoken = rewardingList[tokenid];
uint owningdays= (starttime-owntime)/86400;
owningdays++;
uint calculation=0;
//factor calculator
uint totallockingdays= (endtime-starttime)/86400;
uint factordays=owningdays;
uint looptorun=0;
if(owningdays<30)
{
if(totallockingdays<30-owningdays)
{
looptorun=totallockingdays;
}
else{
looptorun=30-owningdays;
}
for(uint i=1;i<=looptorun;i++)
{
uint operand1 = factordays * 1000;
uint operand2 = 30;
uint operand3 = perdaytoken;
// Perform the calculation using integer arithmetic
uint result = (operand1/operand2)*operand3;
result=result / 1000;
calculation +=result;
factordays++;
}
if(totallockingdays+owningdays>30){
calculation+=(totallockingdays-factordays)*perdaytoken;
}
}
else{
calculation=totallockingdays*perdaytoken;
}
return calculation; }
//this function is to calculate the rewards per locking record
function Rewards_Calculator_per_entry(Locking_record memory temp) public view returns(uint) {
uint owntime = temp.owntime;
uint starttime = temp.starttime;
uint endtime = temp.endtime;
if(endtime==0){endtime=block.timestamp;}
uint perdaytoken = temp.perdaytoken;
uint owningdays= (starttime-owntime)/86400;
owningdays++;
uint calculation=0;
//factor calculator
uint totallockingdays= (endtime-starttime)/86400;
uint factordays=owningdays;
uint looptorun=0;
if(owningdays<30)
{
if(totallockingdays<30-owningdays)
{
looptorun=totallockingdays;
}
else{
looptorun=30-owningdays;
}
for(uint i=1;i<=looptorun;i++)
{
uint operand1 = factordays * 1000;
uint operand2 = 30;
uint operand3 = perdaytoken;
// Perform the calculation using integer arithmetic
uint result = (operand1/operand2)*operand3;
result=result / 1000;
calculation +=result;
factordays++;
}
if(totallockingdays+owningdays>30){
calculation+=(totallockingdays-factordays)*perdaytoken;
}
}
else{
calculation=totallockingdays*perdaytoken;
}
return calculation;
}
function nft_entry(address user, uint perdaytoken, uint tokenid,
uint owntime
) internal{
Locking_record memory temp;
temp.tokenid=tokenid;
temp.owntime=owntime;
temp.starttime=block.timestamp;
temp.endtime=0;
temp.perdaytoken=perdaytoken;
temp.total=0;
user_db[user].nft_entries.push(temp);
user_db[user].totalentries+=1;
user_db[user].total_Locked_Nfts+=1;
}
function close_nft_entry(address user, uint tokenid) internal
{
user_db[user].total_Locked_Nfts=user_db[user].total_Locked_Nfts-1;
uint totalentries=user_db[user].totalentries;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].tokenid==tokenid && user_db[user].nft_entries[i].total==0)
{
user_db[user].nft_entries[i].total=Rewards_Calculator_per_entry(user_db[user].nft_entries[i]);
user_db[user].nft_entries[i].endtime=block.timestamp;
}
}
}
function getlast_tms(uint tokenid, address user
) internal view returns (uint){
uint totalentries=user_db[user].totalentries;
uint tm=0;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].tokenid==tokenid)
{
tm = user_db[user].nft_entries[i].owntime;
}
}
return tm;
}
function get_total_rewards(address user) public view returns(uint){
uint totalentries=user_db[user].totalentries;
uint totalcalculation=0;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0)
{
totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]);
}
else
{
totalcalculation +=user_db[user].nft_entries[i].total;
}
}
return totalcalculation;
}
//Setter Functions
function setRewardTokenAddress(address val) public onlyOwner{
rewardToken = IERC20(val);
}
function setNftAddress(address val) public onlyOwner{
nft = IERC721(val);
}
function setNeophytesLockingAddress(address val) public onlyOwner{
Neophyte_Locking_contract = IERC721(val);
}
function withdrawTokens(address _to, uint amount_in_wei) public onlyOwner{
rewardToken.transfer(_to, amount_in_wei);
}
function rewardsPerDay(address user) public view returns (uint256){
uint totalentries=user_db[user].totalentries;
uint totalcalculation=0;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0)
{
totalcalculation += Rewards_Calculator_per_entry_checker(user,user_db[user].nft_entries[i].tokenid, user_db[user].nft_entries[i].owntime);
}
}
return totalcalculation;
}
function getRewards(address user) internal view returns(uint256) {
uint totalentries=user_db[user].totalentries;
uint totalcalculation=0;
for(uint i=0;i<totalentries;i++)
{
if(user_db[user].nft_entries[i].total==0)
{
totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]);
}
else
{
totalcalculation +=user_db[user].nft_entries[i].total;
}
}
return totalcalculation;
}
function viewRewards(address account) public view returns(uint256){ // Total Earned Rewards
uint256 totalReward = getRewards(account);
return totalReward - user_db[account].claimedreward;
}
function claimRewards() updateReward(msg.sender) external nonReentrant{
uint256 reward = viewRewards(msg.sender);
require(reward > 0, "Zero Rewards");
require(rewardToken.balanceOf(address(this)) >= reward, "Contract does not have enough reward Tokens.");
_balances[msg.sender] = 0;
user_db[msg.sender].claimedreward+=reward;
rewardToken.transfer(address(msg.sender), reward);
}
function getNftsIdsbyAddress(address _add) public view returns (uint256[] memory){
uint256 len = nft.balanceOf(_add);
uint256[] memory temp = new uint[](len);
uint256 temp_count = 0;
uint256 totalCollectionSize = nft.totalSupply();
for(uint i=1;i<=totalCollectionSize;i++){
if(nft.ownerOf(i) == _add){
temp[temp_count] = i;
temp_count++;
}
}
return temp;
}
function getUserLockedNftIds(address _user) public view returns (uint256[] memory){
uint256 len = numberTokensLocked[_user];
uint256[] memory temp = new uint[](len);
uint totalentries=user_db[_user].totalentries;
uint counter=0;
for(uint i=0;i<totalentries;i++)
{
if(user_db[_user].nft_entries[i].total==0 && user_db[_user].nft_entries[i].endtime==0)
{
temp[counter]=user_db[_user].nft_entries[i].tokenid;
counter++;
}
}
return temp;
}
//this function will run in Locking function to calculate per day reward of a token
function perday_calculator(uint tokennum) public view returns (uint){
return rewardingList[tokennum];
}
function check_ownership(address user, uint[] memory list)public view returns (bool){
for (uint256 i = 0; i < list.length; i++) {
if(IERC721(nft).ownerOf(list[i]) != user)
{
return false;
}
}
return true;
}
function check_all_tms(uint[] memory listtms) internal pure returns(bool){
for (uint256 i = 0; i < listtms.length; i++) {
if(listtms[i] == 0)
{
return false;
}
}
return true;
}
function check_Locked_ownership(address user, uint[] memory list)public view returns (bool){
for (uint256 i = 0; i < list.length; i++) {
if(tokenIdOwners[list[i]] != user)
{
return false;
}
}
return true;
}
function Rentrooms(uint256[] memory tokenIds, uint[] memory tms, uint256 id, bytes memory signature) updateReward(msg.sender) external nonReentrant {
require(!paused,"Contract is paused");
require(IERC721(nft).isApprovedForAll(msg.sender, address(this)) , "Approve Rooms First");
require(numberTokensLocked[msg.sender]+tokenIds.length<=Neophyte_Locking_contract.numberTokensLocked(msg.sender),"Please lock more Neophytes first");
require(tokenIds.length > 0, "0 Room to rent");
require(check_ownership(msg.sender,tokenIds),"You are not owner of this room.");
require(check_all_tms(tms),"Something went wrong");
require(check(id,signature) == Verify, "Sorry Something is wrong with the encryption.");
require(voucherIds[id] == 0, "Invalid Voucher. Try Again.");
voucherIds[id] = 1;
uint256 len = tokenIds.length;
uint256 numLocked = numberTokensLocked[msg.sender];
for (uint256 i = 0; i < len; i++) {
uint256 tokenId = tokenIds[i];
if(tms[i]!=5)//if released and unsold error code
{
nft_entry(msg.sender,perday_calculator(tokenIds[i]),tokenIds[i],tms[i]);
}
else{
nft_entry(msg.sender, perday_calculator(tokenIds[i]), tokenIds[i], getlast_tms(tokenIds[i], msg.sender));
}
tokenIdOwners[tokenId] = msg.sender;
ownerTokenIds[msg.sender][numLocked] = tokenId;
numLocked++;
totalroomsLocked++;
nft.transferFrom(msg.sender,address(this),tokenId);
}
numberTokensLocked[msg.sender] = numLocked;
}
function Releaserooms(uint256[] memory tokenIds) updateReward(msg.sender) external nonReentrant{
require(!paused,"Contract is paused");
require(tokenIds.length > 0, "0 Rooms to release");
require(check_ownership(address(this),tokenIds),"Room not available in the contract");
require(check_Locked_ownership(msg.sender,tokenIds),"You don't own this Room");
uint256 len = tokenIds.length;
for (uint256 i = 0; i < len; i++) {
uint256 tokenId = tokenIds[i];
removeFromUserLockedTokens(msg.sender, tokenId);
close_nft_entry(msg.sender,tokenIds[i]);
numberTokensLocked[msg.sender]--;
totalroomsLocked--;
delete tokenIdOwners[tokenId];
nft.transferFrom(
address(this),
msg.sender,
tokenId
);
}
}
function inputLegends(uint[] memory ids) public onlyOwner{
for(uint i=0; i<ids.length;i++)
{
legendids.push(ids[i]);
}
}
function togglePause() public onlyOwner{
paused = !paused;
}
function removeFromUserLockedTokens(address user, uint256 tokenId) internal {
uint256 _numLocked = numberTokensLocked[user];
for (uint256 j = 0; j < _numLocked; ++j) {
if (ownerTokenIds[user][j] == tokenId) {
uint256 lastIndex = _numLocked - 1;
ownerTokenIds[user][j] = ownerTokenIds[user][
lastIndex
];
delete ownerTokenIds[user][lastIndex];
break;
}
}
}
function check(uint id, bytes memory signature) public view returns(address){
return _verify(id, signature);
}
function _verify(uint id, bytes memory signature) internal view returns(address){
bytes32 digest = _hash(id);
return ECDSA.recover(digest, signature);
}
function _hash(uint id) internal view returns(bytes32){
return _hashTypedDataV4(keccak256(abi.encode(
keccak256("EIP712Domain(uint id)"),
id
)));
}
function verifySignature(bytes memory signature, bytes memory message, address expectedAddress) public pure returns (bool) {
// Extract the v, r, and s values from the signature
(uint8 v, bytes32 r, bytes32 s) = abi.decode(signature, (uint8, bytes32, bytes32));
// Recover the signer's address
address signer = ecrecover(keccak256(abi.encodePacked(message)), v, r, s);
return signer == expectedAddress;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"Neophyte_Locking_contract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Releaserooms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tms","type":"uint256[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"Rentrooms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"perdaytoken","type":"uint256"},{"internalType":"uint256","name":"owntime","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"internalType":"struct Rooms_Renting.Locking_record","name":"temp","type":"tuple"}],"name":"Rewards_Calculator_per_entry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"ot","type":"uint256"}],"name":"Rewards_Calculator_per_entry_checker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"add_token_rates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_Locked_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"ends","type":"uint256"}],"name":"dispose_rewarding_list","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getNftsIdsbyAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserLockedNftIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"get_total_rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"inputLegends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"legendids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberTokensLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokennum","type":"uint256"}],"name":"perday_calculator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardingList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rewardsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setNeophytesLockingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setRewardTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNums","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalroomsLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"address","name":"expectedAddress","type":"address"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount_in_wei","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101406040526000600260006101000a81548160ff02191690831515021790555060006003556000600b55731479d797b8431d0d47f2e7a18d589dd67a4b7dc4600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008c57600080fd5b506040518060400160405280600781526020017f73616e6374756d000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000162818484620001db60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620001ce620001c26200021760201b60201c565b6200021f60201b60201c565b60018081905550620003bb565b60008383834630604051602001620001f895949392919062000316565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ee8162000373565b82525050565b620002ff8162000387565b82525050565b6200031081620003b1565b82525050565b600060a0820190506200032d6000830188620002f4565b6200033c6020830187620002f4565b6200034b6040830186620002f4565b6200035a606083018562000305565b620003696080830184620002e3565b9695505050505050565b6000620003808262000391565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60805160a05160c05160601c60e0516101005161012051615e336200040e6000396000614289015260006142cb015260006142aa015260006141df015260006142350152600061425e0152615e336000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80639354527211610130578063da40ef80116100b8578063ed73be151161007c578063ed73be151461070e578063ed8c6bcb1461072a578063eedfa6f014610746578063f2fde38b14610776578063f7c618c11461079257610231565b8063da40ef8014610658578063de5d6f3f14610688578063dfedcc81146106a6578063e57deb39146106c2578063eaead17c146106f257610231565b8063b5bb2b06116100ff578063b5bb2b06146105a2578063b773bf5e146105d2578063b77cf9c6146105ee578063c4ae31681461061e578063c9bc0a9a1461062857610231565b8063935452721461050a5780639a6acf201461053a578063ab34ee4f14610556578063b1d6b6301461058657610231565b80632bf2a10a116101be578063715018a611610182578063715018a614610452578063722a10ac1461045c578063786568da1461048c5780638da5cb5b146104bc57806391a7e0a7146104da57610231565b80632bf2a10a1461039a578063372500ab146103ca57806342265f9a146103d457806347ccca02146104045780634884254a1461042257610231565b80630de4d44f116102055780630de4d44f146102bc5780630fb979a1146102da57806317afaee71461030a5780631bfff8ac1461033a57806322f108361461036a57610231565b80629ead9614610236578063029b82791461025457806306b091f9146102845780630b102d1a146102a0575b600080fd5b61023e6107b0565b60405161024b919061547b565b60405180910390f35b61026e60048036038101906102699190614a77565b6107b6565b60405161027b919061547b565b60405180910390f35b61029e600480360381019061029991906147fb565b6107ce565b005b6102ba60048036038101906102b59190614745565b6108fe565b005b6102c46109be565b6040516102d191906151e0565b60405180910390f35b6102f460048036038101906102ef919061479f565b6109e4565b60405161030191906150e9565b60405180910390f35b610324600480360381019061031f9190614745565b610a9e565b604051610331919061547b565b60405180910390f35b610354600480360381019061034f9190614745565b610d26565b604051610361919061547b565b60405180910390f35b610384600480360381019061037f91906147fb565b610f5a565b604051610391919061547b565b60405180910390f35b6103b460048036038101906103af9190614745565b610f7f565b6040516103c1919061547b565b60405180910390f35b6103d2610f97565b005b6103ee60048036038101906103e99190614a4a565b611324565b6040516103fb919061547b565b60405180910390f35b61040c6114c5565b60405161041991906151e0565b60405180910390f35b61043c60048036038101906104379190614a77565b6114eb565b6040516104499190615023565b60405180910390f35b61045a61151e565b005b61047660048036038101906104719190614a77565b6115a6565b604051610483919061547b565b60405180910390f35b6104a660048036038101906104a191906149bf565b6115ca565b6040516104b391906150e9565b60405180910390f35b6104c461169f565b6040516104d19190615023565b60405180910390f35b6104f460048036038101906104ef9190614a77565b6116c8565b604051610501919061547b565b60405180910390f35b610524600480360381019061051f9190614745565b6116e5565b60405161053191906150c7565b60405180910390f35b610554600480360381019061054f9190614745565b61195e565b005b610570600480360381019061056b9190614a77565b611a1e565b60405161057d919061547b565b60405180910390f35b6105a0600480360381019061059b919061488e565b611a36565b005b6105bc60048036038101906105b7919061479f565b611b34565b6040516105c991906150e9565b60405180910390f35b6105ec60048036038101906105e7919061488e565b611c65565b005b61060860048036038101906106039190614745565b611d47565b604051610615919061547b565b60405180910390f35b610626611d5f565b005b610642600480360381019061063d9190614745565b611e07565b60405161064f91906150c7565b60405180910390f35b610672600480360381019061066d9190614745565b6120e5565b60405161067f919061547b565b60405180910390f35b610690612149565b60405161069d919061547b565b60405180910390f35b6106c060048036038101906106bb9190614745565b61214f565b005b6106dc60048036038101906106d79190614ad1565b61220f565b6040516106e99190615023565b60405180910390f35b61070c60048036038101906107079190614b2d565b612223565b005b6107286004803603810190610723919061488e565b6122f3565b005b610744600480360381019061073f91906148d7565b6126c3565b005b610760600480360381019061075b919061483b565b612f3b565b60405161076d919061547b565b60405180910390f35b610790600480360381019061078b9190614745565b613245565b005b61079a61333d565b6040516107a791906151c5565b60405180910390f35b60035481565b600a6020528060005260406000206000915090505481565b6107d6613363565b73ffffffffffffffffffffffffffffffffffffffff166107f461169f565b73ffffffffffffffffffffffffffffffffffffffff161461084a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610841906153db565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016108a792919061509e565b602060405180830381600087803b1580156108c157600080fd5b505af11580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190614992565b505050565b610906613363565b73ffffffffffffffffffffffffffffffffffffffff1661092461169f565b73ffffffffffffffffffffffffffffffffffffffff161461097a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610971906153db565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b8251811015610a92578373ffffffffffffffffffffffffffffffffffffffff1660096000858481518110610a2357610a226158bc565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a7f576000915050610a98565b8080610a8a906157dc565b9150506109ec565b50600190505b92915050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610d1b576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b4857610b476158bc565b5b906000526020600020906006020160050154148015610bcc57506000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610bb857610bb76158bc565b5b906000526020600020906006020160040154145b15610c9457610c82601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610c2857610c276158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b82610c8d9190615583565b9150610d08565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610ce857610ce76158bc565b5b90600052602060002090600602016005015482610d059190615583565b91505b8080610d13906157dc565b915050610aea565b508092505050919050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610f4f576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610dd057610dcf6158bc565b5b906000526020600020906006020160050154148015610e5457506000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610e4057610e3f6158bc565b5b906000526020600020906006020160040154145b15610f3c57610f2e85601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610eb157610eb06158bc565b5b906000526020600020906006020160000154601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610f1757610f166158bc565b5b906000526020600020906006020160020154612f3b565b82610f399190615583565b91505b8080610f47906157dc565b915050610d72565b508092505050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b600c6020528060005260406000206000915090505481565b336000610fa38261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110389190615583565b9250508190555060026001541415611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061545b565b60405180910390fd5b60026001819055506000611098336120e5565b9050600081116110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906152bb565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111399190615023565b60206040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111899190614aa4565b10156111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c19061541b565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546112619190615583565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112c592919061509e565b602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113179190614992565b5050600180819055505050565b60008082604001519050600083606001519050600084608001519050600081141561134d574290505b60008560200151905060006201518085856113689190615664565b61137291906155d9565b9050808061137f906157dc565b9150506000806201518086866113959190615664565b61139f91906155d9565b905060008390506000601e8510156114a55784601e6113be9190615664565b8310156113cd578290506113dd565b84601e6113da9190615664565b90505b6000600190505b8181116114665760006103e8846113fb919061560a565b90506000601e90506000899050600081838561141791906155d9565b611421919061560a565b90506103e88161143191906155d9565b9050808961143f9190615583565b9850868061144c906157dc565b97505050505050808061145e906157dc565b9150506113e4565b50601e85846114759190615583565b11156114a0578582846114889190615664565b611492919061560a565b8461149d9190615583565b93505b6114b4565b85836114b1919061560a565b93505b839950505050505050505050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611526613363565b73ffffffffffffffffffffffffffffffffffffffff1661154461169f565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906153db565b60405180910390fd5b6115a46000613582565b565b600e81815481106115b657600080fd5b906000526020600020016000915090505481565b600080600080868060200190518101906115e49190614b6d565b92509250925060006001876040516020016115ff9190614fd5565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516116359493929190615180565b6020604051602081039080840390855afa158015611657573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a6000838152602001908152602001600020549050919050565b60606000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008167ffffffffffffffff811115611747576117466158eb565b5b6040519080825280602002602001820160405280156117755781602001602082028036833780820191505090505b5090506000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015611951576000601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611821576118206158bc565b5b9060005260206000209060060201600501541480156118a557506000601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611891576118906158bc565b5b906000526020600020906006020160040154145b1561193e57601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106118fe576118fd6158bc565b5b906000526020600020906006020160000154848381518110611923576119226158bc565b5b602002602001018181525050818061193a906157dc565b9250505b8080611949906157dc565b9150506117c3565b5082945050505050919050565b611966613363565b73ffffffffffffffffffffffffffffffffffffffff1661198461169f565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906153db565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b611a3e613363565b73ffffffffffffffffffffffffffffffffffffffff16611a5c61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906153db565b60405180910390fd5b60005b8151811015611b3057600b6000815480929190611ad1906157dc565b9190505550670de0b6b3a7640000828281518110611af257611af16158bc565b5b6020026020010151611b04919061560a565b600a6000600b548152602001908152602001600020819055508080611b28906157dc565b915050611ab5565b5050565b600080600090505b8251811015611c59578373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110611bad57611bac6158bc565b5b60200260200101516040518263ffffffff1660e01b8152600401611bd1919061547b565b60206040518083038186803b158015611be957600080fd5b505afa158015611bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c219190614772565b73ffffffffffffffffffffffffffffffffffffffff1614611c46576000915050611c5f565b8080611c51906157dc565b915050611b3c565b50600190505b92915050565b611c6d613363565b73ffffffffffffffffffffffffffffffffffffffff16611c8b61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd8906153db565b60405180910390fd5b60005b8151811015611d4357600e828281518110611d0257611d016158bc565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d3b906157dc565b915050611ce4565b5050565b60056020528060005260406000206000915090505481565b611d67613363565b73ffffffffffffffffffffffffffffffffffffffff16611d8561169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906153db565b60405180910390fd5b600260009054906101000a900460ff1615600260006101000a81548160ff021916908315150217905550565b60606000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611e669190615023565b60206040518083038186803b158015611e7e57600080fd5b505afa158015611e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190614aa4565b905060008167ffffffffffffffff811115611ed457611ed36158eb565b5b604051908082528060200260200182016040528015611f025781602001602082028036833780820191505090505b509050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7057600080fd5b505afa158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa89190614aa4565b90506000600190505b8181116120d8578673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161202a919061547b565b60206040518083038186803b15801561204257600080fd5b505afa158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a9190614772565b73ffffffffffffffffffffffffffffffffffffffff1614156120c557808484815181106120aa576120a96158bc565b5b60200260200101818152505082806120c1906157dc565b9350505b80806120d0906157dc565b915050611fb1565b5082945050505050919050565b6000806120f18361336b565b9050601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816121419190615664565b915050919050565b600b5481565b612157613363565b73ffffffffffffffffffffffffffffffffffffffff1661217561169f565b73ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c2906153db565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061221b8383613646565b905092915050565b61222b613363565b73ffffffffffffffffffffffffffffffffffffffff1661224961169f565b73ffffffffffffffffffffffffffffffffffffffff161461229f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612296906153db565b60405180910390fd5b60008290505b8181116122ee57600b60008154809291906122bf90615781565b9190505550600a60008281526020019081526020016000206000905580806122e6906157dc565b9150506122a5565b505050565b3360006122ff8261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123949190615583565b92505081905550600260015414156123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061545b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061543b565b60405180910390fd5b600083511161247d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124749061533b565b60405180910390fd5b6124873084611b34565b6124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd906152db565b60405180910390fd5b6124d033846109e4565b61250f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125069061521b565b60405180910390fd5b60008351905060005b818110156126b5576000858281518110612535576125346158bc565b5b602002602001015190506125493382613667565b61256d338784815181106125605761255f6158bc565b5b6020026020010151613835565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906125bd90615781565b9190505550600360008154809291906125d590615781565b91905055506009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161266f93929190615067565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505080806126ad906157dc565b915050612518565b505060018081905550505050565b3360006126cf8261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127649190615583565b92505081905550600260015414156127b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a89061545b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128009061543b565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161286692919061503e565b60206040518083038186803b15801561287e57600080fd5b505afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b69190614992565b6128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec9061537b565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b81526004016129509190615023565b60206040518083038186803b15801561296857600080fd5b505afa15801561297c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a09190614aa4565b8651600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ec9190615583565b1115612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a249061529b565b60405180910390fd5b6000865111612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a68906153bb565b60405180910390fd5b612a7b3387611b34565b612aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab19061535b565b60405180910390fd5b612ac385613b98565b612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af99061527b565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b45858561220f565b73ffffffffffffffffffffffffffffffffffffffff1614612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b929061531b565b60405180910390fd5b6000600660008681526020019081526020016000205414612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906153fb565b60405180910390fd5b600160066000868152602001908152602001600020819055506000865190506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b82811015612ee5576000898281518110612c7457612c736158bc565b5b602002602001015190506005898381518110612c9357612c926158bc565b5b602002602001015114612d0757612d0233612cc78c8581518110612cba57612cb96158bc565b5b60200260200101516116c8565b8c8581518110612cda57612cd96158bc565b5b60200260200101518c8681518110612cf557612cf46158bc565b5b6020026020010151613bf4565b612d73565b612d7233612d2e8c8581518110612d2157612d206158bc565b5b60200260200101516116c8565b8c8581518110612d4157612d406158bc565b5b6020026020010151612d6d8e8781518110612d5f57612d5e6158bc565b5b602002602001015133613d9f565b613bf4565b5b336009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055508280612e25906157dc565b93505060036000815480929190612e3b906157dc565b9190505550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401612e9f93929190615067565b600060405180830381600087803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050508080612edd906157dc565b915050612c57565b5080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505060018081905550505050505050565b60008060009050600583141561308d576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156130865785601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612ff257612ff16158bc565b5b906000526020600020906006020160000154141561307357601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061305e5761305d6158bc565b5b90600052602060002090600602016002015492505b808061307e906157dc565b915050612f95565b5050613091565b8290505b60008190506000429050600062015181826130ac9190615583565b905060008114156130bb574290505b6000600a600089815260200190815260200160002054905060006201518085856130e59190615664565b6130ef91906155d9565b905080806130fc906157dc565b9150506000806201518086866131129190615664565b61311c91906155d9565b905060008390506000601e8510156132225784601e61313b9190615664565b83101561314a5782905061315a565b84601e6131579190615664565b90505b6000600190505b8181116131e35760006103e884613178919061560a565b90506000601e90506000899050600081838561319491906155d9565b61319e919061560a565b90506103e8816131ae91906155d9565b905080896131bc9190615583565b985086806131c9906157dc565b9750505050505080806131db906157dc565b915050613161565b50601e85846131f29190615583565b111561321d578582846132059190615664565b61320f919061560a565b8461321a9190615583565b93505b613231565b858361322e919061560a565b93505b839a50505050505050505050509392505050565b61324d613363565b73ffffffffffffffffffffffffffffffffffffffff1661326b61169f565b73ffffffffffffffffffffffffffffffffffffffff16146132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b8906153db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133289061525b565b60405180910390fd5b61333a81613582565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613577576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613415576134146158bc565b5b90600052602060002090600602016005015414156134f0576134de601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613484576134836158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b826134e99190615583565b9150613564565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613544576135436158bc565b5b906000526020600020906006020160050154826135619190615583565b91505b808061356f906157dc565b9150506133b7565b508092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061365284613ee8565b905061365e8184613f42565b91505092915050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8181101561382f5782600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054141561381e57600060018361371d9190615664565b9050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600090555061382f565b80613828906157dc565b90506136ae565b50505050565b6001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546138849190615664565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b81811015613b925782601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613971576139706158bc565b5b9060005260206000209060060201600001541480156139f557506000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139e1576139e06158bc565b5b906000526020600020906006020160050154145b15613b7f57613aab601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a5157613a506158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613aff57613afe6158bc565b5b90600052602060002090600602016005018190555042601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613b6957613b686158bc565b5b9060005260206000209060060201600401819055505b8080613b8a906157dc565b915050613914565b50505050565b600080600090505b8251811015613be9576000838281518110613bbe57613bbd6158bc565b5b60200260200101511415613bd6576000915050613bef565b8080613be1906157dc565b915050613ba0565b50600190505b919050565b613bfc6144ce565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613d379190615583565b925050819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000828254613d919190615583565b925050819055505050505050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613edc5785601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613e4857613e476158bc565b5b9060005260206000209060060201600001541415613ec957601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613eb457613eb36158bc565b5b90600052602060002090600602016002015491505b8080613ed4906157dc565b915050613deb565b50809250505092915050565b6000613f3b7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613f20929190615157565b60405160208183030381529060405280519060200120613f69565b9050919050565b6000806000613f518585613f83565b91509150613f5e81614006565b819250505092915050565b6000613f7c613f766141db565b836142f5565b9050919050565b600080604183511415613fc55760008060006020860151925060408601519150606086015160001a9050613fb987828585614328565b94509450505050613fff565b604083511415613ff6576000806020850151915060408501519050613feb868383614435565b935093505050613fff565b60006002915091505b9250929050565b6000600481111561401a5761401961588d565b5b81600481111561402d5761402c61588d565b5b1415614038576141d8565b6001600481111561404c5761404b61588d565b5b81600481111561405f5761405e61588d565b5b14156140a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614097906151fb565b60405180910390fd5b600260048111156140b4576140b361588d565b5b8160048111156140c7576140c661588d565b5b1415614108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ff9061523b565b60405180910390fd5b6003600481111561411c5761411b61588d565b5b81600481111561412f5761412e61588d565b5b1415614170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614167906152fb565b60405180910390fd5b6004808111156141835761418261588d565b5b8160048111156141965761419561588d565b5b14156141d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141ce9061539b565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561425757507f000000000000000000000000000000000000000000000000000000000000000046145b15614284577f000000000000000000000000000000000000000000000000000000000000000090506142f2565b6142ef7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614494565b90505b90565b6000828260405160200161430a929190614fec565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561436357600060039150915061442c565b601b8560ff161415801561437b5750601c8560ff1614155b1561438d57600060049150915061442c565b6000600187878787604051600081526020016040526040516143b29493929190615180565b6020604051602081039080840390855afa1580156143d4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156144235760006001925092505061442c565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6144789190615583565b905061448687828885614328565b935093505050935093915050565b600083838346306040516020016144af959493929190615104565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000614517614512846154bb565b615496565b9050808382526020820190508285602086028201111561453a57614539615924565b5b60005b8581101561456a57816145508882614706565b84526020840193506020830192505060018101905061453d565b5050509392505050565b6000614587614582846154e7565b615496565b9050828152602081018484840111156145a3576145a2615929565b5b6145ae84828561573f565b509392505050565b6000813590506145c581615d8a565b92915050565b6000815190506145da81615d8a565b92915050565b600082601f8301126145f5576145f461591a565b5b8135614605848260208601614504565b91505092915050565b60008151905061461d81615da1565b92915050565b60008151905061463281615db8565b92915050565b600082601f83011261464d5761464c61591a565b5b813561465d848260208601614574565b91505092915050565b600060c0828403121561467c5761467b61591f565b5b61468660c0615496565b9050600061469684828501614706565b60008301525060206146aa84828501614706565b60208301525060406146be84828501614706565b60408301525060606146d284828501614706565b60608301525060806146e684828501614706565b60808301525060a06146fa84828501614706565b60a08301525092915050565b60008135905061471581615dcf565b92915050565b60008151905061472a81615dcf565b92915050565b60008151905061473f81615de6565b92915050565b60006020828403121561475b5761475a615933565b5b6000614769848285016145b6565b91505092915050565b60006020828403121561478857614787615933565b5b6000614796848285016145cb565b91505092915050565b600080604083850312156147b6576147b5615933565b5b60006147c4858286016145b6565b925050602083013567ffffffffffffffff8111156147e5576147e461592e565b5b6147f1858286016145e0565b9150509250929050565b6000806040838503121561481257614811615933565b5b6000614820858286016145b6565b925050602061483185828601614706565b9150509250929050565b60008060006060848603121561485457614853615933565b5b6000614862868287016145b6565b935050602061487386828701614706565b925050604061488486828701614706565b9150509250925092565b6000602082840312156148a4576148a3615933565b5b600082013567ffffffffffffffff8111156148c2576148c161592e565b5b6148ce848285016145e0565b91505092915050565b600080600080608085870312156148f1576148f0615933565b5b600085013567ffffffffffffffff81111561490f5761490e61592e565b5b61491b878288016145e0565b945050602085013567ffffffffffffffff81111561493c5761493b61592e565b5b614948878288016145e0565b935050604061495987828801614706565b925050606085013567ffffffffffffffff81111561497a5761497961592e565b5b61498687828801614638565b91505092959194509250565b6000602082840312156149a8576149a7615933565b5b60006149b68482850161460e565b91505092915050565b6000806000606084860312156149d8576149d7615933565b5b600084013567ffffffffffffffff8111156149f6576149f561592e565b5b614a0286828701614638565b935050602084013567ffffffffffffffff811115614a2357614a2261592e565b5b614a2f86828701614638565b9250506040614a40868287016145b6565b9150509250925092565b600060c08284031215614a6057614a5f615933565b5b6000614a6e84828501614666565b91505092915050565b600060208284031215614a8d57614a8c615933565b5b6000614a9b84828501614706565b91505092915050565b600060208284031215614aba57614ab9615933565b5b6000614ac88482850161471b565b91505092915050565b60008060408385031215614ae857614ae7615933565b5b6000614af685828601614706565b925050602083013567ffffffffffffffff811115614b1757614b1661592e565b5b614b2385828601614638565b9150509250929050565b60008060408385031215614b4457614b43615933565b5b6000614b5285828601614706565b9250506020614b6385828601614706565b9150509250929050565b600080600060608486031215614b8657614b85615933565b5b6000614b9486828701614730565b9350506020614ba586828701614623565b9250506040614bb686828701614623565b9150509250925092565b6000614bcc8383614fa8565b60208301905092915050565b614be181615698565b82525050565b6000614bf282615528565b614bfc818561554b565b9350614c0783615518565b8060005b83811015614c38578151614c1f8882614bc0565b9750614c2a8361553e565b925050600181019050614c0b565b5085935050505092915050565b614c4e816156aa565b82525050565b614c5d816156b6565b82525050565b614c74614c6f826156b6565b615825565b82525050565b6000614c8582615533565b614c8f818561555c565b9350614c9f81856020860161574e565b80840191505092915050565b614cb4816156f7565b82525050565b614cc381615709565b82525050565b6000614cd6601883615567565b9150614ce182615949565b602082019050919050565b6000614cf9601783615567565b9150614d0482615972565b602082019050919050565b6000614d1c601f83615567565b9150614d278261599b565b602082019050919050565b6000614d3f602683615567565b9150614d4a826159c4565b604082019050919050565b6000614d62600283615578565b9150614d6d82615a13565b600282019050919050565b6000614d85601483615567565b9150614d9082615a3c565b602082019050919050565b6000614da8602083615567565b9150614db382615a65565b602082019050919050565b6000614dcb600c83615567565b9150614dd682615a8e565b602082019050919050565b6000614dee602283615567565b9150614df982615ab7565b604082019050919050565b6000614e11602283615567565b9150614e1c82615b06565b604082019050919050565b6000614e34602d83615567565b9150614e3f82615b55565b604082019050919050565b6000614e57601283615567565b9150614e6282615ba4565b602082019050919050565b6000614e7a601f83615567565b9150614e8582615bcd565b602082019050919050565b6000614e9d601383615567565b9150614ea882615bf6565b602082019050919050565b6000614ec0602283615567565b9150614ecb82615c1f565b604082019050919050565b6000614ee3600e83615567565b9150614eee82615c6e565b602082019050919050565b6000614f06602083615567565b9150614f1182615c97565b602082019050919050565b6000614f29601b83615567565b9150614f3482615cc0565b602082019050919050565b6000614f4c602c83615567565b9150614f5782615ce9565b604082019050919050565b6000614f6f601283615567565b9150614f7a82615d38565b602082019050919050565b6000614f92601f83615567565b9150614f9d82615d61565b602082019050919050565b614fb1816156e0565b82525050565b614fc0816156e0565b82525050565b614fcf816156ea565b82525050565b6000614fe18284614c7a565b915081905092915050565b6000614ff782614d55565b91506150038285614c63565b6020820191506150138284614c63565b6020820191508190509392505050565b60006020820190506150386000830184614bd8565b92915050565b60006040820190506150536000830185614bd8565b6150606020830184614bd8565b9392505050565b600060608201905061507c6000830186614bd8565b6150896020830185614bd8565b6150966040830184614fb7565b949350505050565b60006040820190506150b36000830185614bd8565b6150c06020830184614fb7565b9392505050565b600060208201905081810360008301526150e18184614be7565b905092915050565b60006020820190506150fe6000830184614c45565b92915050565b600060a0820190506151196000830188614c54565b6151266020830187614c54565b6151336040830186614c54565b6151406060830185614fb7565b61514d6080830184614bd8565b9695505050505050565b600060408201905061516c6000830185614c54565b6151796020830184614fb7565b9392505050565b60006080820190506151956000830187614c54565b6151a26020830186614fc6565b6151af6040830185614c54565b6151bc6060830184614c54565b95945050505050565b60006020820190506151da6000830184614cab565b92915050565b60006020820190506151f56000830184614cba565b92915050565b6000602082019050818103600083015261521481614cc9565b9050919050565b6000602082019050818103600083015261523481614cec565b9050919050565b6000602082019050818103600083015261525481614d0f565b9050919050565b6000602082019050818103600083015261527481614d32565b9050919050565b6000602082019050818103600083015261529481614d78565b9050919050565b600060208201905081810360008301526152b481614d9b565b9050919050565b600060208201905081810360008301526152d481614dbe565b9050919050565b600060208201905081810360008301526152f481614de1565b9050919050565b6000602082019050818103600083015261531481614e04565b9050919050565b6000602082019050818103600083015261533481614e27565b9050919050565b6000602082019050818103600083015261535481614e4a565b9050919050565b6000602082019050818103600083015261537481614e6d565b9050919050565b6000602082019050818103600083015261539481614e90565b9050919050565b600060208201905081810360008301526153b481614eb3565b9050919050565b600060208201905081810360008301526153d481614ed6565b9050919050565b600060208201905081810360008301526153f481614ef9565b9050919050565b6000602082019050818103600083015261541481614f1c565b9050919050565b6000602082019050818103600083015261543481614f3f565b9050919050565b6000602082019050818103600083015261545481614f62565b9050919050565b6000602082019050818103600083015261547481614f85565b9050919050565b60006020820190506154906000830184614fb7565b92915050565b60006154a06154b1565b90506154ac82826157ab565b919050565b6000604051905090565b600067ffffffffffffffff8211156154d6576154d56158eb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615502576155016158eb565b5b61550b82615938565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061558e826156e0565b9150615599836156e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155ce576155cd61582f565b5b828201905092915050565b60006155e4826156e0565b91506155ef836156e0565b9250826155ff576155fe61585e565b5b828204905092915050565b6000615615826156e0565b9150615620836156e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156595761565861582f565b5b828202905092915050565b600061566f826156e0565b915061567a836156e0565b92508282101561568d5761568c61582f565b5b828203905092915050565b60006156a3826156c0565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006157028261571b565b9050919050565b60006157148261571b565b9050919050565b60006157268261572d565b9050919050565b6000615738826156c0565b9050919050565b82818337600083830152505050565b60005b8381101561576c578082015181840152602081019050615751565b8381111561577b576000848401525b50505050565b600061578c826156e0565b915060008214156157a05761579f61582f565b5b600182039050919050565b6157b482615938565b810181811067ffffffffffffffff821117156157d3576157d26158eb565b5b80604052505050565b60006157e7826156e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561581a5761581961582f565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f596f7520646f6e2774206f776e207468697320526f6f6d000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f506c65617365206c6f636b206d6f7265204e656f706879746573206669727374600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f526f6f6d206e6f7420617661696c61626c6520696e2074686520636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f3020526f6f6d7320746f2072656c656173650000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f66207468697320726f6f6d2e00600082015250565b7f417070726f766520526f6f6d7320466972737400000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f3020526f6f6d20746f2072656e74000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615d9381615698565b8114615d9e57600080fd5b50565b615daa816156aa565b8114615db557600080fd5b50565b615dc1816156b6565b8114615dcc57600080fd5b50565b615dd8816156e0565b8114615de357600080fd5b50565b615def816156ea565b8114615dfa57600080fd5b5056fea26469706673582212200531a8e0d27c9b5c5c69d5dc81f23c22191a4d69b6167052fc09adb4ff98e3e164736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102315760003560e01c80639354527211610130578063da40ef80116100b8578063ed73be151161007c578063ed73be151461070e578063ed8c6bcb1461072a578063eedfa6f014610746578063f2fde38b14610776578063f7c618c11461079257610231565b8063da40ef8014610658578063de5d6f3f14610688578063dfedcc81146106a6578063e57deb39146106c2578063eaead17c146106f257610231565b8063b5bb2b06116100ff578063b5bb2b06146105a2578063b773bf5e146105d2578063b77cf9c6146105ee578063c4ae31681461061e578063c9bc0a9a1461062857610231565b8063935452721461050a5780639a6acf201461053a578063ab34ee4f14610556578063b1d6b6301461058657610231565b80632bf2a10a116101be578063715018a611610182578063715018a614610452578063722a10ac1461045c578063786568da1461048c5780638da5cb5b146104bc57806391a7e0a7146104da57610231565b80632bf2a10a1461039a578063372500ab146103ca57806342265f9a146103d457806347ccca02146104045780634884254a1461042257610231565b80630de4d44f116102055780630de4d44f146102bc5780630fb979a1146102da57806317afaee71461030a5780631bfff8ac1461033a57806322f108361461036a57610231565b80629ead9614610236578063029b82791461025457806306b091f9146102845780630b102d1a146102a0575b600080fd5b61023e6107b0565b60405161024b919061547b565b60405180910390f35b61026e60048036038101906102699190614a77565b6107b6565b60405161027b919061547b565b60405180910390f35b61029e600480360381019061029991906147fb565b6107ce565b005b6102ba60048036038101906102b59190614745565b6108fe565b005b6102c46109be565b6040516102d191906151e0565b60405180910390f35b6102f460048036038101906102ef919061479f565b6109e4565b60405161030191906150e9565b60405180910390f35b610324600480360381019061031f9190614745565b610a9e565b604051610331919061547b565b60405180910390f35b610354600480360381019061034f9190614745565b610d26565b604051610361919061547b565b60405180910390f35b610384600480360381019061037f91906147fb565b610f5a565b604051610391919061547b565b60405180910390f35b6103b460048036038101906103af9190614745565b610f7f565b6040516103c1919061547b565b60405180910390f35b6103d2610f97565b005b6103ee60048036038101906103e99190614a4a565b611324565b6040516103fb919061547b565b60405180910390f35b61040c6114c5565b60405161041991906151e0565b60405180910390f35b61043c60048036038101906104379190614a77565b6114eb565b6040516104499190615023565b60405180910390f35b61045a61151e565b005b61047660048036038101906104719190614a77565b6115a6565b604051610483919061547b565b60405180910390f35b6104a660048036038101906104a191906149bf565b6115ca565b6040516104b391906150e9565b60405180910390f35b6104c461169f565b6040516104d19190615023565b60405180910390f35b6104f460048036038101906104ef9190614a77565b6116c8565b604051610501919061547b565b60405180910390f35b610524600480360381019061051f9190614745565b6116e5565b60405161053191906150c7565b60405180910390f35b610554600480360381019061054f9190614745565b61195e565b005b610570600480360381019061056b9190614a77565b611a1e565b60405161057d919061547b565b60405180910390f35b6105a0600480360381019061059b919061488e565b611a36565b005b6105bc60048036038101906105b7919061479f565b611b34565b6040516105c991906150e9565b60405180910390f35b6105ec60048036038101906105e7919061488e565b611c65565b005b61060860048036038101906106039190614745565b611d47565b604051610615919061547b565b60405180910390f35b610626611d5f565b005b610642600480360381019061063d9190614745565b611e07565b60405161064f91906150c7565b60405180910390f35b610672600480360381019061066d9190614745565b6120e5565b60405161067f919061547b565b60405180910390f35b610690612149565b60405161069d919061547b565b60405180910390f35b6106c060048036038101906106bb9190614745565b61214f565b005b6106dc60048036038101906106d79190614ad1565b61220f565b6040516106e99190615023565b60405180910390f35b61070c60048036038101906107079190614b2d565b612223565b005b6107286004803603810190610723919061488e565b6122f3565b005b610744600480360381019061073f91906148d7565b6126c3565b005b610760600480360381019061075b919061483b565b612f3b565b60405161076d919061547b565b60405180910390f35b610790600480360381019061078b9190614745565b613245565b005b61079a61333d565b6040516107a791906151c5565b60405180910390f35b60035481565b600a6020528060005260406000206000915090505481565b6107d6613363565b73ffffffffffffffffffffffffffffffffffffffff166107f461169f565b73ffffffffffffffffffffffffffffffffffffffff161461084a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610841906153db565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016108a792919061509e565b602060405180830381600087803b1580156108c157600080fd5b505af11580156108d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f99190614992565b505050565b610906613363565b73ffffffffffffffffffffffffffffffffffffffff1661092461169f565b73ffffffffffffffffffffffffffffffffffffffff161461097a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610971906153db565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b8251811015610a92578373ffffffffffffffffffffffffffffffffffffffff1660096000858481518110610a2357610a226158bc565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a7f576000915050610a98565b8080610a8a906157dc565b9150506109ec565b50600190505b92915050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610d1b576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b4857610b476158bc565b5b906000526020600020906006020160050154148015610bcc57506000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610bb857610bb76158bc565b5b906000526020600020906006020160040154145b15610c9457610c82601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610c2857610c276158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b82610c8d9190615583565b9150610d08565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610ce857610ce76158bc565b5b90600052602060002090600602016005015482610d059190615583565b91505b8080610d13906157dc565b915050610aea565b508092505050919050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610f4f576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610dd057610dcf6158bc565b5b906000526020600020906006020160050154148015610e5457506000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610e4057610e3f6158bc565b5b906000526020600020906006020160040154145b15610f3c57610f2e85601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610eb157610eb06158bc565b5b906000526020600020906006020160000154601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610f1757610f166158bc565b5b906000526020600020906006020160020154612f3b565b82610f399190615583565b91505b8080610f47906157dc565b915050610d72565b508092505050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b600c6020528060005260406000206000915090505481565b336000610fa38261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110389190615583565b9250508190555060026001541415611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061545b565b60405180910390fd5b60026001819055506000611098336120e5565b9050600081116110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906152bb565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111399190615023565b60206040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111899190614aa4565b10156111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c19061541b565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546112619190615583565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112c592919061509e565b602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113179190614992565b5050600180819055505050565b60008082604001519050600083606001519050600084608001519050600081141561134d574290505b60008560200151905060006201518085856113689190615664565b61137291906155d9565b9050808061137f906157dc565b9150506000806201518086866113959190615664565b61139f91906155d9565b905060008390506000601e8510156114a55784601e6113be9190615664565b8310156113cd578290506113dd565b84601e6113da9190615664565b90505b6000600190505b8181116114665760006103e8846113fb919061560a565b90506000601e90506000899050600081838561141791906155d9565b611421919061560a565b90506103e88161143191906155d9565b9050808961143f9190615583565b9850868061144c906157dc565b97505050505050808061145e906157dc565b9150506113e4565b50601e85846114759190615583565b11156114a0578582846114889190615664565b611492919061560a565b8461149d9190615583565b93505b6114b4565b85836114b1919061560a565b93505b839950505050505050505050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611526613363565b73ffffffffffffffffffffffffffffffffffffffff1661154461169f565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906153db565b60405180910390fd5b6115a46000613582565b565b600e81815481106115b657600080fd5b906000526020600020016000915090505481565b600080600080868060200190518101906115e49190614b6d565b92509250925060006001876040516020016115ff9190614fd5565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516116359493929190615180565b6020604051602081039080840390855afa158015611657573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a6000838152602001908152602001600020549050919050565b60606000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008167ffffffffffffffff811115611747576117466158eb565b5b6040519080825280602002602001820160405280156117755781602001602082028036833780820191505090505b5090506000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015611951576000601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611821576118206158bc565b5b9060005260206000209060060201600501541480156118a557506000601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110611891576118906158bc565b5b906000526020600020906006020160040154145b1561193e57601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106118fe576118fd6158bc565b5b906000526020600020906006020160000154848381518110611923576119226158bc565b5b602002602001018181525050818061193a906157dc565b9250505b8080611949906157dc565b9150506117c3565b5082945050505050919050565b611966613363565b73ffffffffffffffffffffffffffffffffffffffff1661198461169f565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906153db565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b611a3e613363565b73ffffffffffffffffffffffffffffffffffffffff16611a5c61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906153db565b60405180910390fd5b60005b8151811015611b3057600b6000815480929190611ad1906157dc565b9190505550670de0b6b3a7640000828281518110611af257611af16158bc565b5b6020026020010151611b04919061560a565b600a6000600b548152602001908152602001600020819055508080611b28906157dc565b915050611ab5565b5050565b600080600090505b8251811015611c59578373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110611bad57611bac6158bc565b5b60200260200101516040518263ffffffff1660e01b8152600401611bd1919061547b565b60206040518083038186803b158015611be957600080fd5b505afa158015611bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c219190614772565b73ffffffffffffffffffffffffffffffffffffffff1614611c46576000915050611c5f565b8080611c51906157dc565b915050611b3c565b50600190505b92915050565b611c6d613363565b73ffffffffffffffffffffffffffffffffffffffff16611c8b61169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd8906153db565b60405180910390fd5b60005b8151811015611d4357600e828281518110611d0257611d016158bc565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d3b906157dc565b915050611ce4565b5050565b60056020528060005260406000206000915090505481565b611d67613363565b73ffffffffffffffffffffffffffffffffffffffff16611d8561169f565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906153db565b60405180910390fd5b600260009054906101000a900460ff1615600260006101000a81548160ff021916908315150217905550565b60606000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611e669190615023565b60206040518083038186803b158015611e7e57600080fd5b505afa158015611e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190614aa4565b905060008167ffffffffffffffff811115611ed457611ed36158eb565b5b604051908082528060200260200182016040528015611f025781602001602082028036833780820191505090505b509050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7057600080fd5b505afa158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa89190614aa4565b90506000600190505b8181116120d8578673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161202a919061547b565b60206040518083038186803b15801561204257600080fd5b505afa158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a9190614772565b73ffffffffffffffffffffffffffffffffffffffff1614156120c557808484815181106120aa576120a96158bc565b5b60200260200101818152505082806120c1906157dc565b9350505b80806120d0906157dc565b915050611fb1565b5082945050505050919050565b6000806120f18361336b565b9050601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816121419190615664565b915050919050565b600b5481565b612157613363565b73ffffffffffffffffffffffffffffffffffffffff1661217561169f565b73ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c2906153db565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061221b8383613646565b905092915050565b61222b613363565b73ffffffffffffffffffffffffffffffffffffffff1661224961169f565b73ffffffffffffffffffffffffffffffffffffffff161461229f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612296906153db565b60405180910390fd5b60008290505b8181116122ee57600b60008154809291906122bf90615781565b9190505550600a60008281526020019081526020016000206000905580806122e6906157dc565b9150506122a5565b505050565b3360006122ff8261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123949190615583565b92505081905550600260015414156123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061545b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061543b565b60405180910390fd5b600083511161247d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124749061533b565b60405180910390fd5b6124873084611b34565b6124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd906152db565b60405180910390fd5b6124d033846109e4565b61250f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125069061521b565b60405180910390fd5b60008351905060005b818110156126b5576000858281518110612535576125346158bc565b5b602002602001015190506125493382613667565b61256d338784815181106125605761255f6158bc565b5b6020026020010151613835565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906125bd90615781565b9190505550600360008154809291906125d590615781565b91905055506009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161266f93929190615067565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505080806126ad906157dc565b915050612518565b505060018081905550505050565b3360006126cf8261336b565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127649190615583565b92505081905550600260015414156127b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a89061545b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128009061543b565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161286692919061503e565b60206040518083038186803b15801561287e57600080fd5b505afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b69190614992565b6128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec9061537b565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b81526004016129509190615023565b60206040518083038186803b15801561296857600080fd5b505afa15801561297c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a09190614aa4565b8651600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ec9190615583565b1115612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a249061529b565b60405180910390fd5b6000865111612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a68906153bb565b60405180910390fd5b612a7b3387611b34565b612aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab19061535b565b60405180910390fd5b612ac385613b98565b612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af99061527b565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b45858561220f565b73ffffffffffffffffffffffffffffffffffffffff1614612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b929061531b565b60405180910390fd5b6000600660008681526020019081526020016000205414612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906153fb565b60405180910390fd5b600160066000868152602001908152602001600020819055506000865190506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b82811015612ee5576000898281518110612c7457612c736158bc565b5b602002602001015190506005898381518110612c9357612c926158bc565b5b602002602001015114612d0757612d0233612cc78c8581518110612cba57612cb96158bc565b5b60200260200101516116c8565b8c8581518110612cda57612cd96158bc565b5b60200260200101518c8681518110612cf557612cf46158bc565b5b6020026020010151613bf4565b612d73565b612d7233612d2e8c8581518110612d2157612d206158bc565b5b60200260200101516116c8565b8c8581518110612d4157612d406158bc565b5b6020026020010151612d6d8e8781518110612d5f57612d5e6158bc565b5b602002602001015133613d9f565b613bf4565b5b336009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055508280612e25906157dc565b93505060036000815480929190612e3b906157dc565b9190505550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401612e9f93929190615067565b600060405180830381600087803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050508080612edd906157dc565b915050612c57565b5080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505060018081905550505050505050565b60008060009050600583141561308d576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156130865785601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612ff257612ff16158bc565b5b906000526020600020906006020160000154141561307357601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061305e5761305d6158bc565b5b90600052602060002090600602016002015492505b808061307e906157dc565b915050612f95565b5050613091565b8290505b60008190506000429050600062015181826130ac9190615583565b905060008114156130bb574290505b6000600a600089815260200190815260200160002054905060006201518085856130e59190615664565b6130ef91906155d9565b905080806130fc906157dc565b9150506000806201518086866131129190615664565b61311c91906155d9565b905060008390506000601e8510156132225784601e61313b9190615664565b83101561314a5782905061315a565b84601e6131579190615664565b90505b6000600190505b8181116131e35760006103e884613178919061560a565b90506000601e90506000899050600081838561319491906155d9565b61319e919061560a565b90506103e8816131ae91906155d9565b905080896131bc9190615583565b985086806131c9906157dc565b9750505050505080806131db906157dc565b915050613161565b50601e85846131f29190615583565b111561321d578582846132059190615664565b61320f919061560a565b8461321a9190615583565b93505b613231565b858361322e919061560a565b93505b839a50505050505050505050509392505050565b61324d613363565b73ffffffffffffffffffffffffffffffffffffffff1661326b61169f565b73ffffffffffffffffffffffffffffffffffffffff16146132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b8906153db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133289061525b565b60405180910390fd5b61333a81613582565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613577576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613415576134146158bc565b5b90600052602060002090600602016005015414156134f0576134de601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613484576134836158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b826134e99190615583565b9150613564565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613544576135436158bc565b5b906000526020600020906006020160050154826135619190615583565b91505b808061356f906157dc565b9150506133b7565b508092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061365284613ee8565b905061365e8184613f42565b91505092915050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8181101561382f5782600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054141561381e57600060018361371d9190615664565b9050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600090555061382f565b80613828906157dc565b90506136ae565b50505050565b6001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546138849190615664565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b81811015613b925782601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613971576139706158bc565b5b9060005260206000209060060201600001541480156139f557506000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139e1576139e06158bc565b5b906000526020600020906006020160050154145b15613b7f57613aab601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a5157613a506158bc565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050611324565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613aff57613afe6158bc565b5b90600052602060002090600602016005018190555042601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613b6957613b686158bc565b5b9060005260206000209060060201600401819055505b8080613b8a906157dc565b915050613914565b50505050565b600080600090505b8251811015613be9576000838281518110613bbe57613bbd6158bc565b5b60200260200101511415613bd6576000915050613bef565b8080613be1906157dc565b915050613ba0565b50600190505b919050565b613bfc6144ce565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613d379190615583565b925050819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000828254613d919190615583565b925050819055505050505050565b600080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613edc5785601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613e4857613e476158bc565b5b9060005260206000209060060201600001541415613ec957601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613eb457613eb36158bc565b5b90600052602060002090600602016002015491505b8080613ed4906157dc565b915050613deb565b50809250505092915050565b6000613f3b7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613f20929190615157565b60405160208183030381529060405280519060200120613f69565b9050919050565b6000806000613f518585613f83565b91509150613f5e81614006565b819250505092915050565b6000613f7c613f766141db565b836142f5565b9050919050565b600080604183511415613fc55760008060006020860151925060408601519150606086015160001a9050613fb987828585614328565b94509450505050613fff565b604083511415613ff6576000806020850151915060408501519050613feb868383614435565b935093505050613fff565b60006002915091505b9250929050565b6000600481111561401a5761401961588d565b5b81600481111561402d5761402c61588d565b5b1415614038576141d8565b6001600481111561404c5761404b61588d565b5b81600481111561405f5761405e61588d565b5b14156140a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614097906151fb565b60405180910390fd5b600260048111156140b4576140b361588d565b5b8160048111156140c7576140c661588d565b5b1415614108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ff9061523b565b60405180910390fd5b6003600481111561411c5761411b61588d565b5b81600481111561412f5761412e61588d565b5b1415614170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614167906152fb565b60405180910390fd5b6004808111156141835761418261588d565b5b8160048111156141965761419561588d565b5b14156141d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141ce9061539b565b60405180910390fd5b5b50565b60007f0000000000000000000000002ae57159fbf5de2e6012a8e4182cd2decaab5a8c73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561425757507f000000000000000000000000000000000000000000000000000000000000000146145b15614284577f7b8b614b0b516eba899668076ae48e443b3c14b9ab65cd3f1787e0e23e3e4a5f90506142f2565b6142ef7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fff2482e359c85257fce2d1c26524268866db6bce9ba4a51357f2523068861c027fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6614494565b90505b90565b6000828260405160200161430a929190614fec565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561436357600060039150915061442c565b601b8560ff161415801561437b5750601c8560ff1614155b1561438d57600060049150915061442c565b6000600187878787604051600081526020016040526040516143b29493929190615180565b6020604051602081039080840390855afa1580156143d4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156144235760006001925092505061442c565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6144789190615583565b905061448687828885614328565b935093505050935093915050565b600083838346306040516020016144af959493929190615104565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000614517614512846154bb565b615496565b9050808382526020820190508285602086028201111561453a57614539615924565b5b60005b8581101561456a57816145508882614706565b84526020840193506020830192505060018101905061453d565b5050509392505050565b6000614587614582846154e7565b615496565b9050828152602081018484840111156145a3576145a2615929565b5b6145ae84828561573f565b509392505050565b6000813590506145c581615d8a565b92915050565b6000815190506145da81615d8a565b92915050565b600082601f8301126145f5576145f461591a565b5b8135614605848260208601614504565b91505092915050565b60008151905061461d81615da1565b92915050565b60008151905061463281615db8565b92915050565b600082601f83011261464d5761464c61591a565b5b813561465d848260208601614574565b91505092915050565b600060c0828403121561467c5761467b61591f565b5b61468660c0615496565b9050600061469684828501614706565b60008301525060206146aa84828501614706565b60208301525060406146be84828501614706565b60408301525060606146d284828501614706565b60608301525060806146e684828501614706565b60808301525060a06146fa84828501614706565b60a08301525092915050565b60008135905061471581615dcf565b92915050565b60008151905061472a81615dcf565b92915050565b60008151905061473f81615de6565b92915050565b60006020828403121561475b5761475a615933565b5b6000614769848285016145b6565b91505092915050565b60006020828403121561478857614787615933565b5b6000614796848285016145cb565b91505092915050565b600080604083850312156147b6576147b5615933565b5b60006147c4858286016145b6565b925050602083013567ffffffffffffffff8111156147e5576147e461592e565b5b6147f1858286016145e0565b9150509250929050565b6000806040838503121561481257614811615933565b5b6000614820858286016145b6565b925050602061483185828601614706565b9150509250929050565b60008060006060848603121561485457614853615933565b5b6000614862868287016145b6565b935050602061487386828701614706565b925050604061488486828701614706565b9150509250925092565b6000602082840312156148a4576148a3615933565b5b600082013567ffffffffffffffff8111156148c2576148c161592e565b5b6148ce848285016145e0565b91505092915050565b600080600080608085870312156148f1576148f0615933565b5b600085013567ffffffffffffffff81111561490f5761490e61592e565b5b61491b878288016145e0565b945050602085013567ffffffffffffffff81111561493c5761493b61592e565b5b614948878288016145e0565b935050604061495987828801614706565b925050606085013567ffffffffffffffff81111561497a5761497961592e565b5b61498687828801614638565b91505092959194509250565b6000602082840312156149a8576149a7615933565b5b60006149b68482850161460e565b91505092915050565b6000806000606084860312156149d8576149d7615933565b5b600084013567ffffffffffffffff8111156149f6576149f561592e565b5b614a0286828701614638565b935050602084013567ffffffffffffffff811115614a2357614a2261592e565b5b614a2f86828701614638565b9250506040614a40868287016145b6565b9150509250925092565b600060c08284031215614a6057614a5f615933565b5b6000614a6e84828501614666565b91505092915050565b600060208284031215614a8d57614a8c615933565b5b6000614a9b84828501614706565b91505092915050565b600060208284031215614aba57614ab9615933565b5b6000614ac88482850161471b565b91505092915050565b60008060408385031215614ae857614ae7615933565b5b6000614af685828601614706565b925050602083013567ffffffffffffffff811115614b1757614b1661592e565b5b614b2385828601614638565b9150509250929050565b60008060408385031215614b4457614b43615933565b5b6000614b5285828601614706565b9250506020614b6385828601614706565b9150509250929050565b600080600060608486031215614b8657614b85615933565b5b6000614b9486828701614730565b9350506020614ba586828701614623565b9250506040614bb686828701614623565b9150509250925092565b6000614bcc8383614fa8565b60208301905092915050565b614be181615698565b82525050565b6000614bf282615528565b614bfc818561554b565b9350614c0783615518565b8060005b83811015614c38578151614c1f8882614bc0565b9750614c2a8361553e565b925050600181019050614c0b565b5085935050505092915050565b614c4e816156aa565b82525050565b614c5d816156b6565b82525050565b614c74614c6f826156b6565b615825565b82525050565b6000614c8582615533565b614c8f818561555c565b9350614c9f81856020860161574e565b80840191505092915050565b614cb4816156f7565b82525050565b614cc381615709565b82525050565b6000614cd6601883615567565b9150614ce182615949565b602082019050919050565b6000614cf9601783615567565b9150614d0482615972565b602082019050919050565b6000614d1c601f83615567565b9150614d278261599b565b602082019050919050565b6000614d3f602683615567565b9150614d4a826159c4565b604082019050919050565b6000614d62600283615578565b9150614d6d82615a13565b600282019050919050565b6000614d85601483615567565b9150614d9082615a3c565b602082019050919050565b6000614da8602083615567565b9150614db382615a65565b602082019050919050565b6000614dcb600c83615567565b9150614dd682615a8e565b602082019050919050565b6000614dee602283615567565b9150614df982615ab7565b604082019050919050565b6000614e11602283615567565b9150614e1c82615b06565b604082019050919050565b6000614e34602d83615567565b9150614e3f82615b55565b604082019050919050565b6000614e57601283615567565b9150614e6282615ba4565b602082019050919050565b6000614e7a601f83615567565b9150614e8582615bcd565b602082019050919050565b6000614e9d601383615567565b9150614ea882615bf6565b602082019050919050565b6000614ec0602283615567565b9150614ecb82615c1f565b604082019050919050565b6000614ee3600e83615567565b9150614eee82615c6e565b602082019050919050565b6000614f06602083615567565b9150614f1182615c97565b602082019050919050565b6000614f29601b83615567565b9150614f3482615cc0565b602082019050919050565b6000614f4c602c83615567565b9150614f5782615ce9565b604082019050919050565b6000614f6f601283615567565b9150614f7a82615d38565b602082019050919050565b6000614f92601f83615567565b9150614f9d82615d61565b602082019050919050565b614fb1816156e0565b82525050565b614fc0816156e0565b82525050565b614fcf816156ea565b82525050565b6000614fe18284614c7a565b915081905092915050565b6000614ff782614d55565b91506150038285614c63565b6020820191506150138284614c63565b6020820191508190509392505050565b60006020820190506150386000830184614bd8565b92915050565b60006040820190506150536000830185614bd8565b6150606020830184614bd8565b9392505050565b600060608201905061507c6000830186614bd8565b6150896020830185614bd8565b6150966040830184614fb7565b949350505050565b60006040820190506150b36000830185614bd8565b6150c06020830184614fb7565b9392505050565b600060208201905081810360008301526150e18184614be7565b905092915050565b60006020820190506150fe6000830184614c45565b92915050565b600060a0820190506151196000830188614c54565b6151266020830187614c54565b6151336040830186614c54565b6151406060830185614fb7565b61514d6080830184614bd8565b9695505050505050565b600060408201905061516c6000830185614c54565b6151796020830184614fb7565b9392505050565b60006080820190506151956000830187614c54565b6151a26020830186614fc6565b6151af6040830185614c54565b6151bc6060830184614c54565b95945050505050565b60006020820190506151da6000830184614cab565b92915050565b60006020820190506151f56000830184614cba565b92915050565b6000602082019050818103600083015261521481614cc9565b9050919050565b6000602082019050818103600083015261523481614cec565b9050919050565b6000602082019050818103600083015261525481614d0f565b9050919050565b6000602082019050818103600083015261527481614d32565b9050919050565b6000602082019050818103600083015261529481614d78565b9050919050565b600060208201905081810360008301526152b481614d9b565b9050919050565b600060208201905081810360008301526152d481614dbe565b9050919050565b600060208201905081810360008301526152f481614de1565b9050919050565b6000602082019050818103600083015261531481614e04565b9050919050565b6000602082019050818103600083015261533481614e27565b9050919050565b6000602082019050818103600083015261535481614e4a565b9050919050565b6000602082019050818103600083015261537481614e6d565b9050919050565b6000602082019050818103600083015261539481614e90565b9050919050565b600060208201905081810360008301526153b481614eb3565b9050919050565b600060208201905081810360008301526153d481614ed6565b9050919050565b600060208201905081810360008301526153f481614ef9565b9050919050565b6000602082019050818103600083015261541481614f1c565b9050919050565b6000602082019050818103600083015261543481614f3f565b9050919050565b6000602082019050818103600083015261545481614f62565b9050919050565b6000602082019050818103600083015261547481614f85565b9050919050565b60006020820190506154906000830184614fb7565b92915050565b60006154a06154b1565b90506154ac82826157ab565b919050565b6000604051905090565b600067ffffffffffffffff8211156154d6576154d56158eb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615502576155016158eb565b5b61550b82615938565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061558e826156e0565b9150615599836156e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155ce576155cd61582f565b5b828201905092915050565b60006155e4826156e0565b91506155ef836156e0565b9250826155ff576155fe61585e565b5b828204905092915050565b6000615615826156e0565b9150615620836156e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156595761565861582f565b5b828202905092915050565b600061566f826156e0565b915061567a836156e0565b92508282101561568d5761568c61582f565b5b828203905092915050565b60006156a3826156c0565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006157028261571b565b9050919050565b60006157148261571b565b9050919050565b60006157268261572d565b9050919050565b6000615738826156c0565b9050919050565b82818337600083830152505050565b60005b8381101561576c578082015181840152602081019050615751565b8381111561577b576000848401525b50505050565b600061578c826156e0565b915060008214156157a05761579f61582f565b5b600182039050919050565b6157b482615938565b810181811067ffffffffffffffff821117156157d3576157d26158eb565b5b80604052505050565b60006157e7826156e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561581a5761581961582f565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f596f7520646f6e2774206f776e207468697320526f6f6d000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f506c65617365206c6f636b206d6f7265204e656f706879746573206669727374600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f526f6f6d206e6f7420617661696c61626c6520696e2074686520636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f3020526f6f6d7320746f2072656c656173650000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f66207468697320726f6f6d2e00600082015250565b7f417070726f766520526f6f6d7320466972737400000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f3020526f6f6d20746f2072656e74000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615d9381615698565b8114615d9e57600080fd5b50565b615daa816156aa565b8114615db557600080fd5b50565b615dc1816156b6565b8114615dcc57600080fd5b50565b615dd8816156e0565b8114615de357600080fd5b50565b615def816156ea565b8114615dfa57600080fd5b5056fea26469706673582212200531a8e0d27c9b5c5c69d5dc81f23c22191a4d69b6167052fc09adb4ff98e3e164736f6c63430008070033
Deployed Bytecode Sourcemap
47109:17475:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47430:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47789:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55747:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55511:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47687:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59635:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54750:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55887:584;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47934:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47874:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57268:449;;;:::i;:::-;;51616:1516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47661:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47734:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14445:103;;;:::i;:::-;;48009:23;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64124:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13794:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58920:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58230:597;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55401:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47585:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49051:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59051:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62782:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47524:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62953:74;;;:::i;:::-;;57726:489;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57048:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47844:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55608:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63609;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49393:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61744:1032;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59945:1791;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49656:1889;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14703:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47371:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47430:35;;;;:::o;47789:48::-;;;;;;;;;;;;;;;;;:::o;55747:132::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55831:11:::1;;;;;;;;;;;:20;;;55852:3;55857:13;55831:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55747:132:::0;;:::o;55511:89::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55588:3:::1;55574;;:18;;;;;;;;;;;;;;;;;;55511:89:::0;:::o;47687:40::-;;;;;;;;;;;;;:::o;59635:302::-;59721:4;59743:9;59755:1;59743:13;;59738:168;59762:4;:11;59758:1;:15;59738:168;;;59825:4;59799:30;;:13;:22;59813:4;59818:1;59813:7;;;;;;;;:::i;:::-;;;;;;;;59799:22;;;;;;;;;;;;;;;;;;;;;:30;;;59796:98;;59872:5;59865:12;;;;;59796:98;59775:3;;;;;:::i;:::-;;;;59738:168;;;;59923:4;59916:11;;59635:302;;;;;:::o;54750:601::-;54811:4;54825:17;54843:7;:13;54851:4;54843:13;;;;;;;;;;;;;;;:26;;;54825:44;;54878:21;54916:6;54912:398;54927:12;54925:1;:14;54912:398;;;55011:1;54975:7;:13;54983:4;54975:13;;;;;;;;;;;;;;;:25;;55001:1;54975:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;55054:1;55016:7;:13;55024:4;55016:13;;;;;;;;;;;;;;;:25;;55042:1;55016:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;54975:80;54972:327;;;55105:58;55134:7;:13;55142:4;55134:13;;;;;;;;;;;;;;;:25;;55160:1;55134:28;;;;;;;;:::i;:::-;;;;;;;;;;;;55105:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;55085:78;;;;;:::i;:::-;;;54972:327;;;55249:7;:13;55257:4;55249:13;;;;;;;;;;;;;;;:25;;55275:1;55249:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;55230:53;;;;;:::i;:::-;;;54972:327;54940:3;;;;;:::i;:::-;;;;54912:398;;;;55327:16;55320:23;;;;54750:601;;;:::o;55887:584::-;55945:7;55965:17;55983:7;:13;55991:4;55983:13;;;;;;;;;;;;;;;:26;;;55965:44;;56021:21;56062:6;56058:368;56073:12;56071:1;:14;56058:368;;;56157:1;56121:7;:13;56129:4;56121:13;;;;;;;;;;;;;;;:25;;56147:1;56121:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;56200:1;56162:7;:13;56170:4;56162:13;;;;;;;;;;;;;;;:25;;56188:1;56162:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;56121:80;56118:284;;;56269:117;56306:4;56311:7;:13;56319:4;56311:13;;;;;;;;;;;;;;;:25;;56337:1;56311:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;56349:7;:13;56357:4;56349:13;;;;;;;;;;;;;;;:25;;56375:1;56349:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;56269;:117::i;:::-;56249:137;;;;;:::i;:::-;;;56118:284;56086:3;;;;;:::i;:::-;;;;56058:368;;;;56447:16;56440:23;;;;55887:584;;;:::o;47934:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47874:53::-;;;;;;;;;;;;;;;;;:::o;57268:449::-;57305:10;48166:14;48183:19;48194:7;48183:10;:19::i;:::-;48166:36;;48238:15;48213:13;:22;48227:7;48213:22;;;;;;;;;;;;;;;:40;;;;48286:6;48264:9;:18;48274:7;48264:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;57349:14:::2;57366:23;57378:10;57366:11;:23::i;:::-;57349:40;;57417:1;57408:6;:10;57400:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;57494:6;57454:11;;;;;;;;;;;:21;;;57484:4;57454:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;57446:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57584:1;57560:9;:21;57570:10;57560:21;;;;;;;;;;;;;;;:25;;;;57631:6;57596:7;:19;57604:10;57596:19;;;;;;;;;;;;;;;:33;;;:41;;;;;;;:::i;:::-;;;;;;;;57650:11;;;;;;;;;;;:20;;;57679:10;57692:6;57650:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57338:379;32218:1:::1;32570:7:::0;:22:::1;;;;48155:157:::0;57268:449;:::o;51616:1516::-;51702:4;51720:12;51735:4;:12;;;51720:27;;51759:14;51776:4;:14;;;51759:31;;51802:12;51817:4;:12;;;51802:27;;51853:1;51844:7;:10;51841:40;;;51864:15;51856:23;;51841:40;51892:16;51911:4;:16;;;51892:35;;51939:15;51976:5;51967:7;51957:9;:17;;;;:::i;:::-;51956:25;;;;:::i;:::-;51939:42;;51993:12;;;;;:::i;:::-;;;;52016:16;52094:21;52137:5;52126:9;52118:7;:17;;;;:::i;:::-;52117:25;;;;:::i;:::-;52094:48;;52152:15;52168:10;52152:26;;52189:14;52230:2;52219:10;:13;52216:872;;;52281:10;52278:2;:13;;;;:::i;:::-;52261:16;:30;52258:181;;;52335:16;52325:26;;52258:181;;;52413:10;52410:2;:13;;;;:::i;:::-;52400:23;;52258:181;52459:6;52466:1;52459:8;;52455:408;52471:9;52468:1;:12;52455:408;;52514:13;52543:4;52530:10;:17;;;;:::i;:::-;52514:33;;52562:13;52578:2;52562:18;;52595:13;52611:11;52595:27;;52700:11;52734:8;52724;52715;:17;;;;:::i;:::-;52714:28;;;;:::i;:::-;52700:42;;52773:4;52764:6;:13;;;;:::i;:::-;52757:20;;52810:6;52796:20;;;;;:::i;:::-;;;52835:12;;;;;:::i;:::-;;;;52499:364;;;;52481:3;;;;;:::i;:::-;;;;52455:408;;;;52908:2;52897:10;52880:16;:27;;;;:::i;:::-;:30;52877:118;;;52968:11;52956:10;52939:16;:27;;;;:::i;:::-;52938:41;;;;:::i;:::-;52925:54;;;;;:::i;:::-;;;52877:118;52216:872;;;53065:11;53048:16;:28;;;;:::i;:::-;53036:40;;52216:872;53111:11;53104:18;;;;;;;;;;;51616:1516;;;:::o;47661:18::-;;;;;;;;;;;;;:::o;47734:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;14445:103::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14510:30:::1;14537:1;14510:18;:30::i;:::-;14445:103::o:0;48009:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64124:454::-;64241:4;64321:7;64330:9;64341;64365;64354:48;;;;;;;;;;;;:::i;:::-;64320:82;;;;;;64454:14;64471:56;64508:7;64491:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;64481:36;;;;;;64519:1;64522;64525;64471:56;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:73;;64555:15;64545:25;;:6;:25;;;64538:32;;;;;;64124:454;;;;;:::o;13794:87::-;13840:7;13867:6;;;;;;;;;;;13860:13;;13794:87;:::o;58920:125::-;58983:4;59014:13;:23;59028:8;59014:23;;;;;;;;;;;;59007:30;;58920:125;;;:::o;58230:597::-;58295:16;58323:11;58337:18;:25;58356:5;58337:25;;;;;;;;;;;;;;;;58323:39;;58373:21;58408:3;58397:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58373:39;;58423:17;58441:7;:14;58449:5;58441:14;;;;;;;;;;;;;;;:27;;;58423:45;;58480:12;58512:6;58508:290;58523:12;58521:1;:14;58508:290;;;58608:1;58571:7;:14;58579:5;58571:14;;;;;;;;;;;;;;;:26;;58598:1;58571:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;:38;:82;;;;;58652:1;58613:7;:14;58621:5;58613:14;;;;;;;;;;;;;;;:26;;58640:1;58613:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;:40;58571:82;58568:206;;;58697:7;:14;58705:5;58697:14;;;;;;;;;;;;;;;:26;;58724:1;58697:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;58683:4;58688:7;58683:13;;;;;;;;:::i;:::-;;;;;;;:51;;;;;58749:9;;;;;:::i;:::-;;;;58568:206;58536:3;;;;;:::i;:::-;;;;58508:290;;;;58815:4;58808:11;;;;;;58230:597;;;:::o;55401:104::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55493:3:::1;55472:11;;:25;;;;;;;;;;;;;;;;;;55401:104:::0;:::o;47585:42::-;;;;;;;;;;;;;;;;;:::o;49051:195::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49125:6:::1;49121:120;49136:4;:11;49134:1;:13;49121:120;;;49165:9;;:11;;;;;;;;;:::i;:::-;;;;;;49224:7;49214:4;49219:1;49214:7;;;;;;;;:::i;:::-;;;;;;;;:17;;;;:::i;:::-;49189:13;:24;49203:9;;49189:24;;;;;;;;;;;:42;;;;49148:3;;;;;:::i;:::-;;;;49121:120;;;;49051:195:::0;:::o;59051:302::-;59130:4;59152:9;59164:1;59152:13;;59147:175;59171:4;:11;59167:1;:15;59147:175;;;59241:4;59208:37;;59216:3;;;;;;;;;;;59208:20;;;59229:4;59234:1;59229:7;;;;;;;;:::i;:::-;;;;;;;;59208:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;59205:105;;59288:5;59281:12;;;;;59205:105;59184:3;;;;;:::i;:::-;;;;59147:175;;;;59339:4;59332:11;;59051:302;;;;;:::o;62782:165::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62854:6:::1;62850:90;62866:3;:10;62864:1;:12;62850:90;;;62906:9;62921:3;62925:1;62921:6;;;;;;;;:::i;:::-;;;;;;;;62906:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62877:3;;;;;:::i;:::-;;;;62850:90;;;;62782:165:::0;:::o;47524:48::-;;;;;;;;;;;;;;;;;:::o;62953:74::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63013:6:::1;;;;;;;;;;;63012:7;63003:6;;:16;;;;;;;;;;;;;;;;;;62953:74::o:0;57726:489::-;57790:16;57818:11;57832:3;;;;;;;;;;;:13;;;57846:4;57832:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57818:33;;57862:21;57897:3;57886:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57862:39;;57912:18;57947:27;57977:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57947:47;;58011:6;58018:1;58011:8;;58007:177;58023:19;58020:1;:22;58007:177;;58083:4;58065:22;;:3;;;;;;;;;;;:11;;;58077:1;58065:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;;58062:111;;;58125:1;58106:4;58111:10;58106:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;58145:12;;;;;:::i;:::-;;;;58062:111;58043:3;;;;;:::i;:::-;;;;58007:177;;;;58203:4;58196:11;;;;;;57726:489;;;:::o;57048:212::-;57106:7;57149:19;57171;57182:7;57171:10;:19::i;:::-;57149:41;;57222:7;:16;57230:7;57222:16;;;;;;;;;;;;;;;:30;;;57208:11;:44;;;;:::i;:::-;57201:51;;;57048:212;;;:::o;47844:23::-;;;;:::o;55608:124::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55720:3:::1;55684:25;;:40;;;;;;;;;;;;;;;;;;55608:124:::0;:::o;63609:::-;63677:7;63703:22;63711:2;63715:9;63703:7;:22::i;:::-;63696:29;;63609:124;;;;:::o;49393:188::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49477:6:::1;49484:5;49477:12;;49473:95;49493:4;49490:1;:7;49473:95;;49513:9;;:11;;;;;;;;;:::i;:::-;;;;;;49542:13;:16;49556:1;49542:16;;;;;;;;;;;49535:23;;;49498:3;;;;;:::i;:::-;;;;49473:95;;;;49393:188:::0;;:::o;61744:1032::-;61806:10;48166:14;48183:19;48194:7;48183:10;:19::i;:::-;48166:36;;48238:15;48213:13;:22;48227:7;48213:22;;;;;;;;;;;;;;;:40;;;;48286:6;48264:9;:18;48274:7;48264:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;61859:6:::2;;;;;;;;;;;61858:7;61850:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61924:1;61906:8;:15;:19;61898:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;61967:39;61991:4;61997:8;61967:15;:39::i;:::-;61959:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;62063:43;62086:10;62097:8;62063:22;:43::i;:::-;62055:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62148:11;62162:8;:15;62148:29;;62199:9;62194:559;62218:3;62214:1;:7;62194:559;;;62246:15;62264:8;62273:1;62264:11;;;;;;;;:::i;:::-;;;;;;;;62246:29;;62309:47;62336:10;62348:7;62309:26;:47::i;:::-;62392:39;62408:10;62419:8;62428:1;62419:11;;;;;;;;:::i;:::-;;;;;;;;62392:15;:39::i;:::-;62451:18;:30;62470:10;62451:30;;;;;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;62501:16;;:18;;;;;;;;;:::i;:::-;;;;;;62544:13;:22;62558:7;62544:22;;;;;;;;;;;;62537:29;;;;;;;;;;;62587:3;;;;;;;;;;;:16;;;62638:4;62670:10;62707:7;62587:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;62228:525;62223:3;;;;;:::i;:::-;;;;62194:559;;;;61839:937;32218:1:::1;32570:7:::0;:22:::1;;;;48155:157:::0;61744:1032;;:::o;59945:1791::-;60059:10;48166:14;48183:19;48194:7;48183:10;:19::i;:::-;48166:36;;48238:15;48213:13;:22;48227:7;48213:22;;;;;;;;;;;;;;;:40;;;;48286:6;48264:9;:18;48274:7;48264:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;60113:6:::2;;;;;;;;;;;60112:7;60104:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60168:3;;;;;;;;;;;60160:29;;;60190:10;60210:4;60160:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60152:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;60309:25;;;;;;;;;;;:44;;;60354:10;60309:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60292:8;:15;60261:18;:30;60280:10;60261:30;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:104;;60253:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;60438:1;60420:8;:15;:19;60412:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60477:36;60493:10;60504:8;60477:15;:36::i;:::-;60469:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;60567:18;60581:3;60567:13;:18::i;:::-;60559:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;60651:6;;;;;;;;;;;60628:29;;:19;60634:2;60637:9;60628:5;:19::i;:::-;:29;;;60620:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60744:1;60726:10;:14;60737:2;60726:14;;;;;;;;;;;;:19;60718:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60805:1;60788:10;:14;60799:2;60788:14;;;;;;;;;;;:18;;;;60821:11;60835:8;:15;60821:29;;60865:17;60885:18;:30;60904:10;60885:30;;;;;;;;;;;;;;;;60865:50;;60935:9;60930:732;60954:3;60950:1;:7;60930:732;;;60983:15;61001:8;61010:1;61001:11;;;;;;;;:::i;:::-;;;;;;;;60983:29;;61060:1;61052:3;61056:1;61052:6;;;;;;;;:::i;:::-;;;;;;;;:9;61049:341;;61134:71;61144:10;61155:30;61173:8;61182:1;61173:11;;;;;;;;:::i;:::-;;;;;;;;61155:17;:30::i;:::-;61186:8;61195:1;61186:11;;;;;;;;:::i;:::-;;;;;;;;61198:3;61202:1;61198:6;;;;;;;;:::i;:::-;;;;;;;;61134:9;:71::i;:::-;61049:341;;;61266:104;61276:10;61288:30;61306:8;61315:1;61306:11;;;;;;;;:::i;:::-;;;;;;;;61288:17;:30::i;:::-;61320:8;61329:1;61320:11;;;;;;;;:::i;:::-;;;;;;;;61333:36;61345:8;61354:1;61345:11;;;;;;;;:::i;:::-;;;;;;;;61358:10;61333:11;:36::i;:::-;61266:9;:104::i;:::-;61049:341;61435:10;61410:13;:22;61424:7;61410:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;61503:7;61464:13;:25;61478:10;61464:25;;;;;;;;;;;;;;;:36;61490:9;61464:36;;;;;;;;;;;:46;;;;61529:11;;;;;:::i;:::-;;;;61559:16;;:18;;;;;;;;;:::i;:::-;;;;;;61596:3;;;;;;;;;;;:16;;;61613:10;61632:4;61638:7;61596:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;60964:698;60959:3;;;;;:::i;:::-;;;;60930:732;;;;61709:9;61676:18;:30;61695:10;61676:30;;;;;;;;;;;;;;;:42;;;;60093:1643;;32218:1:::1;32570:7:::0;:22:::1;;;;48155:157:::0;59945:1791;;;;;:::o;49656:1889::-;49758:4;49775:7;49783:1;49775:9;;49803:1;49799:2;:5;49796:347;;;49828:17;49846:7;:13;49854:4;49846:13;;;;;;;;;;;;;;;:26;;;49828:44;;49895:6;49891:217;49906:12;49904:1;:14;49891:217;;;49992:7;49954;:13;49962:4;49954:13;;;;;;;;;;;;;;;:25;;49980:1;49954:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;49951:135;;;50034:7;:13;50042:4;50034:13;;;;;;;;;;;;;;;:25;;50060:1;50034:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;50029:41;;49951:135;49919:3;;;;;:::i;:::-;;;;49891:217;;;;49816:304;49796:347;;;50139:2;50136:5;;49796:347;50154:12;50169:2;50154:17;;50183:14;50200:15;50183:32;;50227:12;50252:5;50242:9;:15;;;;:::i;:::-;50227:30;;50281:1;50272:7;:10;50269:40;;;50292:15;50284:23;;50269:40;50320:16;50339:13;:22;50353:7;50339:22;;;;;;;;;;;;50320:41;;50373:15;50410:5;50401:7;50391:9;:17;;;;:::i;:::-;50390:25;;;;:::i;:::-;50373:42;;50427:12;;;;;:::i;:::-;;;;50450:16;50528:21;50571:5;50560:9;50552:7;:17;;;;:::i;:::-;50551:25;;;;:::i;:::-;50528:48;;50586:15;50602:10;50586:26;;50623:14;50664:2;50653:10;:13;50650:856;;;50715:10;50712:2;:13;;;;:::i;:::-;50695:16;:30;50692:181;;;50769:16;50759:26;;50692:181;;;50847:10;50844:2;:13;;;;:::i;:::-;50834:23;;50692:181;50893:6;50900:1;50893:8;;50889:393;50905:9;50902:1;:12;50889:393;;50948:13;50977:4;50964:10;:17;;;;:::i;:::-;50948:33;;50992:13;51008:2;50992:18;;51021:13;51037:11;51021:27;;51122:11;51156:8;51146;51137;:17;;;;:::i;:::-;51136:28;;;;:::i;:::-;51122:42;;51192:4;51183:6;:13;;;;:::i;:::-;51176:20;;51229:6;51215:20;;;;;:::i;:::-;;;51254:12;;;;;:::i;:::-;;;;50933:349;;;;50915:3;;;;;:::i;:::-;;;;50889:393;;;;51327:2;51316:10;51299:16;:27;;;;:::i;:::-;:30;51296:118;;;51387:11;51375:10;51358:16;:27;;;;:::i;:::-;51357:41;;;;:::i;:::-;51344:54;;;;;:::i;:::-;;;51296:118;50650:856;;;51483:11;51466:16;:28;;;;:::i;:::-;51454:40;;50650:856;51529:11;51522:18;;;;;;;;;;;;49656:1889;;;;;:::o;14703:201::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14812:1:::1;14792:22;;:8;:22;;;;14784:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14868:28;14887:8;14868:18;:28::i;:::-;14703:201:::0;:::o;47371:25::-;;;;;;;;;;;;;:::o;12518:98::-;12571:7;12598:10;12591:17;;12518:98;:::o;56477:563::-;56533:7;56557:17;56575:7;:13;56583:4;56575:13;;;;;;;;;;;;;;;:26;;;56557:44;;56610:21;56648:6;56644:355;56659:12;56657:1;:14;56644:355;;;56743:1;56707:7;:13;56715:4;56707:13;;;;;;;;;;;;;;;:25;;56733:1;56707:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;56704:284;;;56794:58;56823:7;:13;56831:4;56823:13;;;;;;;;;;;;;;;:25;;56849:1;56823:28;;;;;;;;:::i;:::-;;;;;;;;;;;;56794:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;56774:78;;;;;:::i;:::-;;;56704:284;;;56938:7;:13;56946:4;56938:13;;;;;;;;;;;;;;;:25;;56964:1;56938:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;56919:53;;;;;:::i;:::-;;;56704:284;56672:3;;;;;:::i;:::-;;;;56644:355;;;;57016:16;57009:23;;;;56477:563;;;:::o;15064:191::-;15138:16;15157:6;;;;;;;;;;;15138:25;;15183:8;15174:6;;:17;;;;;;;;;;;;;;;;;;15238:8;15207:40;;15228:8;15207:40;;;;;;;;;;;;15127:128;15064:191;:::o;63741:175::-;63813:7;63832:14;63849:9;63855:2;63849:5;:9::i;:::-;63832:26;;63876:32;63890:6;63898:9;63876:13;:32::i;:::-;63869:39;;;63741:175;;;;:::o;63035:555::-;63122:18;63143;:24;63162:4;63143:24;;;;;;;;;;;;;;;;63122:45;;63183:9;63178:405;63202:10;63198:1;:14;63178:405;;;63268:7;63242:13;:19;63256:4;63242:19;;;;;;;;;;;;;;;:22;63262:1;63242:22;;;;;;;;;;;;:33;63238:330;;;63300:17;63333:1;63320:10;:14;;;;:::i;:::-;63300:34;;63382:13;:19;63396:4;63382:19;;;;;;;;;;;;;;;:78;63428:9;63382:78;;;;;;;;;;;;63357:13;:19;63371:4;63357:19;;;;;;;;;;;;;;;:22;63377:1;63357:22;;;;;;;;;;;:103;;;;63490:13;:19;63504:4;63490:19;;;;;;;;;;;;;;;:30;63510:9;63490:30;;;;;;;;;;;63483:37;;;63543:5;;;63238:330;63214:3;;;;:::i;:::-;;;63178:405;;;;63111:479;63035:555;;:::o;53667:640::-;53821:1;53789:7;:13;53797:4;53789:13;;;;;;;;;;;;;;;:31;;;:33;;;;:::i;:::-;53757:7;:13;53765:4;53757:13;;;;;;;;;;;;;;;:31;;:65;;;;53842:17;53860:7;:13;53868:4;53860:13;;;;;;;;;;;;;;;:26;;;53842:44;;53919:6;53915:377;53930:12;53928:1;:14;53915:377;;;54016:7;53978;:13;53986:4;53978:13;;;;;;;;;;;;;;;:25;;54004:1;53978:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;:86;;;;;54063:1;54027:7;:13;54035:4;54027:13;;;;;;;;;;;;;;;:25;;54053:1;54027:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;53978:86;53975:295;;;54129:58;54158:7;:13;54166:4;54158:13;;;;;;;;;;;;;;;:25;;54184:1;54158:28;;;;;;;;:::i;:::-;;;;;;;;;;;;54129:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;54094:7;:13;54102:4;54094:13;;;;;;;;;;;;;;;:25;;54120:1;54094:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;:93;;;;54239:15;54202:7;:13;54210:4;54202:13;;;;;;;;;;;;;;;:25;;54228:1;54202:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;:52;;;;53975:295;53943:3;;;;;:::i;:::-;;;;53915:377;;;;53738:569;53667:640;;:::o;59361:270::-;59429:4;59451:9;59463:1;59451:13;;59446:156;59470:7;:14;59466:1;:18;59446:156;;;59524:1;59510:7;59518:1;59510:10;;;;;;;;:::i;:::-;;;;;;;;:15;59507:83;;;59568:5;59561:12;;;;;59507:83;59486:3;;;;;:::i;:::-;;;;59446:156;;;;59619:4;59612:11;;59361:270;;;;:::o;53139:522::-;53256:26;;:::i;:::-;53310:7;53297:4;:12;;:20;;;;;53345:7;53332:4;:12;;:20;;;;;53382:15;53367:4;:14;;:30;;;;;53425:1;53412:4;:12;;:14;;;;;53458:11;53441:4;:16;;:28;;;;;53495:1;53484:4;:10;;:12;;;;;53513:7;:13;53521:4;53513:13;;;;;;;;;;;;;;;:25;;53544:4;53513:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53593:1;53565:7;:13;53573:4;53565:13;;;;;;;;;;;;;;;:26;;;:29;;;;;;;:::i;:::-;;;;;;;;53642:1;53609:7;:13;53617:4;53609:13;;;;;;;;;;;;;;;:31;;;:34;;;;;;;:::i;:::-;;;;;;;;53245:416;53139:522;;;;:::o;54316:426::-;54398:4;54415:17;54433:7;:13;54441:4;54433:13;;;;;;;;;;;;;;;:26;;;54415:44;;54468:7;54492:6;54488:217;54503:12;54501:1;:14;54488:217;;;54589:7;54551;:13;54559:4;54551:13;;;;;;;;;;;;;;;:25;;54577:1;54551:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;54548:135;;;54631:7;:13;54639:4;54631:13;;;;;;;;;;;;;;;:25;;54657:1;54631:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;54626:41;;54548:135;54516:3;;;;;:::i;:::-;;;;54488:217;;;;54722:2;54715:9;;;;54316:426;;;;:::o;63924:196::-;63970:7;63996:116;64048:34;64097:2;64023:87;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64013:98;;;;;;63996:16;:116::i;:::-;63989:123;;63924:196;;;:::o;38644:231::-;38722:7;38743:17;38762:18;38784:27;38795:4;38801:9;38784:10;:27::i;:::-;38742:69;;;;38822:18;38834:5;38822:11;:18::i;:::-;38858:9;38851:16;;;;38644:231;;;;:::o;46877:167::-;46954:7;46981:55;47003:20;:18;:20::i;:::-;47025:10;46981:21;:55::i;:::-;46974:62;;46877:167;;;:::o;36534:1308::-;36615:7;36624:12;36869:2;36849:9;:16;:22;36845:990;;;36888:9;36912;36936:7;37145:4;37134:9;37130:20;37124:27;37119:32;;37195:4;37184:9;37180:20;37174:27;37169:32;;37253:4;37242:9;37238:20;37232:27;37229:1;37224:36;37219:41;;37296:25;37307:4;37313:1;37316;37319;37296:10;:25::i;:::-;37289:32;;;;;;;;;36845:990;37363:2;37343:9;:16;:22;37339:496;;;37382:9;37406:10;37618:4;37607:9;37603:20;37597:27;37592:32;;37669:4;37658:9;37654:20;37648:27;37642:33;;37711:23;37722:4;37728:1;37731:2;37711:10;:23::i;:::-;37704:30;;;;;;;;37339:496;37783:1;37787:35;37767:56;;;;36534:1308;;;;;;:::o;34805:643::-;34883:20;34874:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;34870:571;;;34920:7;;34870:571;34981:29;34972:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;34968:473;;;35027:34;;;;;;;;;;:::i;:::-;;;;;;;;34968:473;35092:35;35083:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;35079:362;;;35144:41;;;;;;;;;;:::i;:::-;;;;;;;;35079:362;35216:30;35207:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35203:238;;;35263:44;;;;;;;;;;:::i;:::-;;;;;;;;35203:238;35338:30;35329:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35325:116;;;35385:44;;;;;;;;;;:::i;:::-;;;;;;;;35325:116;34805:643;;:::o;45650:314::-;45703:7;45744:12;45727:29;;45735:4;45727:29;;;:66;;;;;45777:16;45760:13;:33;45727:66;45723:234;;;45817:24;45810:31;;;;45723:234;45881:64;45903:10;45915:12;45929:15;45881:21;:64::i;:::-;45874:71;;45650:314;;:::o;43558:196::-;43651:7;43717:15;43734:10;43688:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43678:68;;;;;;43671:75;;43558:196;;;;:::o;40096:1632::-;40227:7;40236:12;41161:66;41156:1;41148:10;;:79;41144:163;;;41260:1;41264:30;41244:51;;;;;;41144:163;41326:2;41321:1;:7;;;;:18;;;;;41337:2;41332:1;:7;;;;41321:18;41317:102;;;41372:1;41376:30;41356:51;;;;;;41317:102;41516:14;41533:24;41543:4;41549:1;41552;41555;41533:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41516:41;;41590:1;41572:20;;:6;:20;;;41568:103;;;41625:1;41629:29;41609:50;;;;;;;41568:103;41691:6;41699:20;41683:37;;;;;40096:1632;;;;;;;;:::o;39138:344::-;39252:7;39261:12;39286:9;39311:66;39303:75;;39298:2;:80;39286:92;;39389:7;39428:2;39421:3;39414:2;39406:11;;:18;;39405:25;;;;:::i;:::-;39389:42;;39449:25;39460:4;39466:1;39469;39472;39449:10;:25::i;:::-;39442:32;;;;;;39138:344;;;;;;:::o;45972:263::-;46116:7;46164:8;46174;46184:11;46197:13;46220:4;46153:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46143:84;;;;;;46136:91;;45972:263;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:143::-;1370:5;1401:6;1395:13;1386:22;;1417:33;1444:5;1417:33;:::i;:::-;1313:143;;;;:::o;1479:370::-;1550:5;1599:3;1592:4;1584:6;1580:17;1576:27;1566:122;;1607:79;;:::i;:::-;1566:122;1724:6;1711:20;1749:94;1839:3;1831:6;1824:4;1816:6;1812:17;1749:94;:::i;:::-;1740:103;;1556:293;1479:370;;;;:::o;1855:137::-;1909:5;1940:6;1934:13;1925:22;;1956:30;1980:5;1956:30;:::i;:::-;1855:137;;;;:::o;1998:143::-;2055:5;2086:6;2080:13;2071:22;;2102:33;2129:5;2102:33;:::i;:::-;1998:143;;;;:::o;2160:338::-;2215:5;2264:3;2257:4;2249:6;2245:17;2241:27;2231:122;;2272:79;;:::i;:::-;2231:122;2389:6;2376:20;2414:78;2488:3;2480:6;2473:4;2465:6;2461:17;2414:78;:::i;:::-;2405:87;;2221:277;2160:338;;;;:::o;2547:1249::-;2628:5;2672:4;2660:9;2655:3;2651:19;2647:30;2644:117;;;2680:79;;:::i;:::-;2644:117;2779:21;2795:4;2779:21;:::i;:::-;2770:30;;2862:1;2902:49;2947:3;2938:6;2927:9;2923:22;2902:49;:::i;:::-;2895:4;2888:5;2884:16;2877:75;2810:153;3029:2;3070:49;3115:3;3106:6;3095:9;3091:22;3070:49;:::i;:::-;3063:4;3056:5;3052:16;3045:75;2973:158;3193:2;3234:49;3279:3;3270:6;3259:9;3255:22;3234:49;:::i;:::-;3227:4;3220:5;3216:16;3209:75;3141:154;3359:2;3400:49;3445:3;3436:6;3425:9;3421:22;3400:49;:::i;:::-;3393:4;3386:5;3382:16;3375:75;3305:156;3523:3;3565:49;3610:3;3601:6;3590:9;3586:22;3565:49;:::i;:::-;3558:4;3551:5;3547:16;3540:75;3471:155;3686:3;3728:49;3773:3;3764:6;3753:9;3749:22;3728:49;:::i;:::-;3721:4;3714:5;3710:16;3703:75;3636:153;2547:1249;;;;:::o;3802:139::-;3848:5;3886:6;3873:20;3864:29;;3902:33;3929:5;3902:33;:::i;:::-;3802:139;;;;:::o;3947:143::-;4004:5;4035:6;4029:13;4020:22;;4051:33;4078:5;4051:33;:::i;:::-;3947:143;;;;:::o;4096:139::-;4151:5;4182:6;4176:13;4167:22;;4198:31;4223:5;4198:31;:::i;:::-;4096:139;;;;:::o;4241:329::-;4300:6;4349:2;4337:9;4328:7;4324:23;4320:32;4317:119;;;4355:79;;:::i;:::-;4317:119;4475:1;4500:53;4545:7;4536:6;4525:9;4521:22;4500:53;:::i;:::-;4490:63;;4446:117;4241:329;;;;:::o;4576:351::-;4646:6;4695:2;4683:9;4674:7;4670:23;4666:32;4663:119;;;4701:79;;:::i;:::-;4663:119;4821:1;4846:64;4902:7;4893:6;4882:9;4878:22;4846:64;:::i;:::-;4836:74;;4792:128;4576:351;;;;:::o;4933:684::-;5026:6;5034;5083:2;5071:9;5062:7;5058:23;5054:32;5051:119;;;5089:79;;:::i;:::-;5051:119;5209:1;5234:53;5279:7;5270:6;5259:9;5255:22;5234:53;:::i;:::-;5224:63;;5180:117;5364:2;5353:9;5349:18;5336:32;5395:18;5387:6;5384:30;5381:117;;;5417:79;;:::i;:::-;5381:117;5522:78;5592:7;5583:6;5572:9;5568:22;5522:78;:::i;:::-;5512:88;;5307:303;4933:684;;;;;:::o;5623:474::-;5691:6;5699;5748:2;5736:9;5727:7;5723:23;5719:32;5716:119;;;5754:79;;:::i;:::-;5716:119;5874:1;5899:53;5944:7;5935:6;5924:9;5920:22;5899:53;:::i;:::-;5889:63;;5845:117;6001:2;6027:53;6072:7;6063:6;6052:9;6048:22;6027:53;:::i;:::-;6017:63;;5972:118;5623:474;;;;;:::o;6103:619::-;6180:6;6188;6196;6245:2;6233:9;6224:7;6220:23;6216:32;6213:119;;;6251:79;;:::i;:::-;6213:119;6371:1;6396:53;6441:7;6432:6;6421:9;6417:22;6396:53;:::i;:::-;6386:63;;6342:117;6498:2;6524:53;6569:7;6560:6;6549:9;6545:22;6524:53;:::i;:::-;6514:63;;6469:118;6626:2;6652:53;6697:7;6688:6;6677:9;6673:22;6652:53;:::i;:::-;6642:63;;6597:118;6103:619;;;;;:::o;6728:539::-;6812:6;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;7015:1;7004:9;7000:17;6987:31;7045:18;7037:6;7034:30;7031:117;;;7067:79;;:::i;:::-;7031:117;7172:78;7242:7;7233:6;7222:9;7218:22;7172:78;:::i;:::-;7162:88;;6958:302;6728:539;;;;:::o;7273:1363::-;7418:6;7426;7434;7442;7491:3;7479:9;7470:7;7466:23;7462:33;7459:120;;;7498:79;;:::i;:::-;7459:120;7646:1;7635:9;7631:17;7618:31;7676:18;7668:6;7665:30;7662:117;;;7698:79;;:::i;:::-;7662:117;7803:78;7873:7;7864:6;7853:9;7849:22;7803:78;:::i;:::-;7793:88;;7589:302;7958:2;7947:9;7943:18;7930:32;7989:18;7981:6;7978:30;7975:117;;;8011:79;;:::i;:::-;7975:117;8116:78;8186:7;8177:6;8166:9;8162:22;8116:78;:::i;:::-;8106:88;;7901:303;8243:2;8269:53;8314:7;8305:6;8294:9;8290:22;8269:53;:::i;:::-;8259:63;;8214:118;8399:2;8388:9;8384:18;8371:32;8430:18;8422:6;8419:30;8416:117;;;8452:79;;:::i;:::-;8416:117;8557:62;8611:7;8602:6;8591:9;8587:22;8557:62;:::i;:::-;8547:72;;8342:287;7273:1363;;;;;;;:::o;8642:345::-;8709:6;8758:2;8746:9;8737:7;8733:23;8729:32;8726:119;;;8764:79;;:::i;:::-;8726:119;8884:1;8909:61;8962:7;8953:6;8942:9;8938:22;8909:61;:::i;:::-;8899:71;;8855:125;8642:345;;;;:::o;8993:975::-;9088:6;9096;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9307:1;9296:9;9292:17;9279:31;9337:18;9329:6;9326:30;9323:117;;;9359:79;;:::i;:::-;9323:117;9464:62;9518:7;9509:6;9498:9;9494:22;9464:62;:::i;:::-;9454:72;;9250:286;9603:2;9592:9;9588:18;9575:32;9634:18;9626:6;9623:30;9620:117;;;9656:79;;:::i;:::-;9620:117;9761:62;9815:7;9806:6;9795:9;9791:22;9761:62;:::i;:::-;9751:72;;9546:287;9872:2;9898:53;9943:7;9934:6;9923:9;9919:22;9898:53;:::i;:::-;9888:63;;9843:118;8993:975;;;;;:::o;9974:394::-;10065:6;10114:3;10102:9;10093:7;10089:23;10085:33;10082:120;;;10121:79;;:::i;:::-;10082:120;10241:1;10266:85;10343:7;10334:6;10323:9;10319:22;10266:85;:::i;:::-;10256:95;;10212:149;9974:394;;;;:::o;10374:329::-;10433:6;10482:2;10470:9;10461:7;10457:23;10453:32;10450:119;;;10488:79;;:::i;:::-;10450:119;10608:1;10633:53;10678:7;10669:6;10658:9;10654:22;10633:53;:::i;:::-;10623:63;;10579:117;10374:329;;;;:::o;10709:351::-;10779:6;10828:2;10816:9;10807:7;10803:23;10799:32;10796:119;;;10834:79;;:::i;:::-;10796:119;10954:1;10979:64;11035:7;11026:6;11015:9;11011:22;10979:64;:::i;:::-;10969:74;;10925:128;10709:351;;;;:::o;11066:652::-;11143:6;11151;11200:2;11188:9;11179:7;11175:23;11171:32;11168:119;;;11206:79;;:::i;:::-;11168:119;11326:1;11351:53;11396:7;11387:6;11376:9;11372:22;11351:53;:::i;:::-;11341:63;;11297:117;11481:2;11470:9;11466:18;11453:32;11512:18;11504:6;11501:30;11498:117;;;11534:79;;:::i;:::-;11498:117;11639:62;11693:7;11684:6;11673:9;11669:22;11639:62;:::i;:::-;11629:72;;11424:287;11066:652;;;;;:::o;11724:474::-;11792:6;11800;11849:2;11837:9;11828:7;11824:23;11820:32;11817:119;;;11855:79;;:::i;:::-;11817:119;11975:1;12000:53;12045:7;12036:6;12025:9;12021:22;12000:53;:::i;:::-;11990:63;;11946:117;12102:2;12128:53;12173:7;12164:6;12153:9;12149:22;12128:53;:::i;:::-;12118:63;;12073:118;11724:474;;;;;:::o;12204:659::-;12290:6;12298;12306;12355:2;12343:9;12334:7;12330:23;12326:32;12323:119;;;12361:79;;:::i;:::-;12323:119;12481:1;12506:62;12560:7;12551:6;12540:9;12536:22;12506:62;:::i;:::-;12496:72;;12452:126;12617:2;12643:64;12699:7;12690:6;12679:9;12675:22;12643:64;:::i;:::-;12633:74;;12588:129;12756:2;12782:64;12838:7;12829:6;12818:9;12814:22;12782:64;:::i;:::-;12772:74;;12727:129;12204:659;;;;;:::o;12869:179::-;12938:10;12959:46;13001:3;12993:6;12959:46;:::i;:::-;13037:4;13032:3;13028:14;13014:28;;12869:179;;;;:::o;13054:118::-;13141:24;13159:5;13141:24;:::i;:::-;13136:3;13129:37;13054:118;;:::o;13208:732::-;13327:3;13356:54;13404:5;13356:54;:::i;:::-;13426:86;13505:6;13500:3;13426:86;:::i;:::-;13419:93;;13536:56;13586:5;13536:56;:::i;:::-;13615:7;13646:1;13631:284;13656:6;13653:1;13650:13;13631:284;;;13732:6;13726:13;13759:63;13818:3;13803:13;13759:63;:::i;:::-;13752:70;;13845:60;13898:6;13845:60;:::i;:::-;13835:70;;13691:224;13678:1;13675;13671:9;13666:14;;13631:284;;;13635:14;13931:3;13924:10;;13332:608;;;13208:732;;;;:::o;13946:109::-;14027:21;14042:5;14027:21;:::i;:::-;14022:3;14015:34;13946:109;;:::o;14061:118::-;14148:24;14166:5;14148:24;:::i;:::-;14143:3;14136:37;14061:118;;:::o;14185:157::-;14290:45;14310:24;14328:5;14310:24;:::i;:::-;14290:45;:::i;:::-;14285:3;14278:58;14185:157;;:::o;14348:373::-;14452:3;14480:38;14512:5;14480:38;:::i;:::-;14534:88;14615:6;14610:3;14534:88;:::i;:::-;14527:95;;14631:52;14676:6;14671:3;14664:4;14657:5;14653:16;14631:52;:::i;:::-;14708:6;14703:3;14699:16;14692:23;;14456:265;14348:373;;;;:::o;14727:159::-;14828:51;14873:5;14828:51;:::i;:::-;14823:3;14816:64;14727:159;;:::o;14892:161::-;14994:52;15040:5;14994:52;:::i;:::-;14989:3;14982:65;14892:161;;:::o;15059:366::-;15201:3;15222:67;15286:2;15281:3;15222:67;:::i;:::-;15215:74;;15298:93;15387:3;15298:93;:::i;:::-;15416:2;15411:3;15407:12;15400:19;;15059:366;;;:::o;15431:::-;15573:3;15594:67;15658:2;15653:3;15594:67;:::i;:::-;15587:74;;15670:93;15759:3;15670:93;:::i;:::-;15788:2;15783:3;15779:12;15772:19;;15431:366;;;:::o;15803:::-;15945:3;15966:67;16030:2;16025:3;15966:67;:::i;:::-;15959:74;;16042:93;16131:3;16042:93;:::i;:::-;16160:2;16155:3;16151:12;16144:19;;15803:366;;;:::o;16175:::-;16317:3;16338:67;16402:2;16397:3;16338:67;:::i;:::-;16331:74;;16414:93;16503:3;16414:93;:::i;:::-;16532:2;16527:3;16523:12;16516:19;;16175:366;;;:::o;16547:400::-;16707:3;16728:84;16810:1;16805:3;16728:84;:::i;:::-;16721:91;;16821:93;16910:3;16821:93;:::i;:::-;16939:1;16934:3;16930:11;16923:18;;16547:400;;;:::o;16953:366::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;16953:366;;;:::o;17325:::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17697:366;;;:::o;18069:::-;18211:3;18232:67;18296:2;18291:3;18232:67;:::i;:::-;18225:74;;18308:93;18397:3;18308:93;:::i;:::-;18426:2;18421:3;18417:12;18410:19;;18069:366;;;:::o;18441:::-;18583:3;18604:67;18668:2;18663:3;18604:67;:::i;:::-;18597:74;;18680:93;18769:3;18680:93;:::i;:::-;18798:2;18793:3;18789:12;18782:19;;18441:366;;;:::o;18813:::-;18955:3;18976:67;19040:2;19035:3;18976:67;:::i;:::-;18969:74;;19052:93;19141:3;19052:93;:::i;:::-;19170:2;19165:3;19161:12;19154:19;;18813:366;;;:::o;19185:::-;19327:3;19348:67;19412:2;19407:3;19348:67;:::i;:::-;19341:74;;19424:93;19513:3;19424:93;:::i;:::-;19542:2;19537:3;19533:12;19526:19;;19185:366;;;:::o;19557:::-;19699:3;19720:67;19784:2;19779:3;19720:67;:::i;:::-;19713:74;;19796:93;19885:3;19796:93;:::i;:::-;19914:2;19909:3;19905:12;19898:19;;19557:366;;;:::o;19929:::-;20071:3;20092:67;20156:2;20151:3;20092:67;:::i;:::-;20085:74;;20168:93;20257:3;20168:93;:::i;:::-;20286:2;20281:3;20277:12;20270:19;;19929:366;;;:::o;20301:::-;20443:3;20464:67;20528:2;20523:3;20464:67;:::i;:::-;20457:74;;20540:93;20629:3;20540:93;:::i;:::-;20658:2;20653:3;20649:12;20642:19;;20301:366;;;:::o;20673:::-;20815:3;20836:67;20900:2;20895:3;20836:67;:::i;:::-;20829:74;;20912:93;21001:3;20912:93;:::i;:::-;21030:2;21025:3;21021:12;21014:19;;20673:366;;;:::o;21045:::-;21187:3;21208:67;21272:2;21267:3;21208:67;:::i;:::-;21201:74;;21284:93;21373:3;21284:93;:::i;:::-;21402:2;21397:3;21393:12;21386:19;;21045:366;;;:::o;21417:::-;21559:3;21580:67;21644:2;21639:3;21580:67;:::i;:::-;21573:74;;21656:93;21745:3;21656:93;:::i;:::-;21774:2;21769:3;21765:12;21758:19;;21417:366;;;:::o;21789:::-;21931:3;21952:67;22016:2;22011:3;21952:67;:::i;:::-;21945:74;;22028:93;22117:3;22028:93;:::i;:::-;22146:2;22141:3;22137:12;22130:19;;21789:366;;;:::o;22161:::-;22303:3;22324:67;22388:2;22383:3;22324:67;:::i;:::-;22317:74;;22400:93;22489:3;22400:93;:::i;:::-;22518:2;22513:3;22509:12;22502:19;;22161:366;;;:::o;22533:::-;22675:3;22696:67;22760:2;22755:3;22696:67;:::i;:::-;22689:74;;22772:93;22861:3;22772:93;:::i;:::-;22890:2;22885:3;22881:12;22874:19;;22533:366;;;:::o;22905:108::-;22982:24;23000:5;22982:24;:::i;:::-;22977:3;22970:37;22905:108;;:::o;23019:118::-;23106:24;23124:5;23106:24;:::i;:::-;23101:3;23094:37;23019:118;;:::o;23143:112::-;23226:22;23242:5;23226:22;:::i;:::-;23221:3;23214:35;23143:112;;:::o;23261:271::-;23391:3;23413:93;23502:3;23493:6;23413:93;:::i;:::-;23406:100;;23523:3;23516:10;;23261:271;;;;:::o;23538:663::-;23779:3;23801:148;23945:3;23801:148;:::i;:::-;23794:155;;23959:75;24030:3;24021:6;23959:75;:::i;:::-;24059:2;24054:3;24050:12;24043:19;;24072:75;24143:3;24134:6;24072:75;:::i;:::-;24172:2;24167:3;24163:12;24156:19;;24192:3;24185:10;;23538:663;;;;;:::o;24207:222::-;24300:4;24338:2;24327:9;24323:18;24315:26;;24351:71;24419:1;24408:9;24404:17;24395:6;24351:71;:::i;:::-;24207:222;;;;:::o;24435:332::-;24556:4;24594:2;24583:9;24579:18;24571:26;;24607:71;24675:1;24664:9;24660:17;24651:6;24607:71;:::i;:::-;24688:72;24756:2;24745:9;24741:18;24732:6;24688:72;:::i;:::-;24435:332;;;;;:::o;24773:442::-;24922:4;24960:2;24949:9;24945:18;24937:26;;24973:71;25041:1;25030:9;25026:17;25017:6;24973:71;:::i;:::-;25054:72;25122:2;25111:9;25107:18;25098:6;25054:72;:::i;:::-;25136;25204:2;25193:9;25189:18;25180:6;25136:72;:::i;:::-;24773:442;;;;;;:::o;25221:332::-;25342:4;25380:2;25369:9;25365:18;25357:26;;25393:71;25461:1;25450:9;25446:17;25437:6;25393:71;:::i;:::-;25474:72;25542:2;25531:9;25527:18;25518:6;25474:72;:::i;:::-;25221:332;;;;;:::o;25559:373::-;25702:4;25740:2;25729:9;25725:18;25717:26;;25789:9;25783:4;25779:20;25775:1;25764:9;25760:17;25753:47;25817:108;25920:4;25911:6;25817:108;:::i;:::-;25809:116;;25559:373;;;;:::o;25938:210::-;26025:4;26063:2;26052:9;26048:18;26040:26;;26076:65;26138:1;26127:9;26123:17;26114:6;26076:65;:::i;:::-;25938:210;;;;:::o;26154:664::-;26359:4;26397:3;26386:9;26382:19;26374:27;;26411:71;26479:1;26468:9;26464:17;26455:6;26411:71;:::i;:::-;26492:72;26560:2;26549:9;26545:18;26536:6;26492:72;:::i;:::-;26574;26642:2;26631:9;26627:18;26618:6;26574:72;:::i;:::-;26656;26724:2;26713:9;26709:18;26700:6;26656:72;:::i;:::-;26738:73;26806:3;26795:9;26791:19;26782:6;26738:73;:::i;:::-;26154:664;;;;;;;;:::o;26824:332::-;26945:4;26983:2;26972:9;26968:18;26960:26;;26996:71;27064:1;27053:9;27049:17;27040:6;26996:71;:::i;:::-;27077:72;27145:2;27134:9;27130:18;27121:6;27077:72;:::i;:::-;26824:332;;;;;:::o;27162:545::-;27335:4;27373:3;27362:9;27358:19;27350:27;;27387:71;27455:1;27444:9;27440:17;27431:6;27387:71;:::i;:::-;27468:68;27532:2;27521:9;27517:18;27508:6;27468:68;:::i;:::-;27546:72;27614:2;27603:9;27599:18;27590:6;27546:72;:::i;:::-;27628;27696:2;27685:9;27681:18;27672:6;27628:72;:::i;:::-;27162:545;;;;;;;:::o;27713:250::-;27820:4;27858:2;27847:9;27843:18;27835:26;;27871:85;27953:1;27942:9;27938:17;27929:6;27871:85;:::i;:::-;27713:250;;;;:::o;27969:252::-;28077:4;28115:2;28104:9;28100:18;28092:26;;28128:86;28211:1;28200:9;28196:17;28187:6;28128:86;:::i;:::-;27969:252;;;;:::o;28227:419::-;28393:4;28431:2;28420:9;28416:18;28408:26;;28480:9;28474:4;28470:20;28466:1;28455:9;28451:17;28444:47;28508:131;28634:4;28508:131;:::i;:::-;28500:139;;28227:419;;;:::o;28652:::-;28818:4;28856:2;28845:9;28841:18;28833:26;;28905:9;28899:4;28895:20;28891:1;28880:9;28876:17;28869:47;28933:131;29059:4;28933:131;:::i;:::-;28925:139;;28652:419;;;:::o;29077:::-;29243:4;29281:2;29270:9;29266:18;29258:26;;29330:9;29324:4;29320:20;29316:1;29305:9;29301:17;29294:47;29358:131;29484:4;29358:131;:::i;:::-;29350:139;;29077:419;;;:::o;29502:::-;29668:4;29706:2;29695:9;29691:18;29683:26;;29755:9;29749:4;29745:20;29741:1;29730:9;29726:17;29719:47;29783:131;29909:4;29783:131;:::i;:::-;29775:139;;29502:419;;;:::o;29927:::-;30093:4;30131:2;30120:9;30116:18;30108:26;;30180:9;30174:4;30170:20;30166:1;30155:9;30151:17;30144:47;30208:131;30334:4;30208:131;:::i;:::-;30200:139;;29927:419;;;:::o;30352:::-;30518:4;30556:2;30545:9;30541:18;30533:26;;30605:9;30599:4;30595:20;30591:1;30580:9;30576:17;30569:47;30633:131;30759:4;30633:131;:::i;:::-;30625:139;;30352:419;;;:::o;30777:::-;30943:4;30981:2;30970:9;30966:18;30958:26;;31030:9;31024:4;31020:20;31016:1;31005:9;31001:17;30994:47;31058:131;31184:4;31058:131;:::i;:::-;31050:139;;30777:419;;;:::o;31202:::-;31368:4;31406:2;31395:9;31391:18;31383:26;;31455:9;31449:4;31445:20;31441:1;31430:9;31426:17;31419:47;31483:131;31609:4;31483:131;:::i;:::-;31475:139;;31202:419;;;:::o;31627:::-;31793:4;31831:2;31820:9;31816:18;31808:26;;31880:9;31874:4;31870:20;31866:1;31855:9;31851:17;31844:47;31908:131;32034:4;31908:131;:::i;:::-;31900:139;;31627:419;;;:::o;32052:::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:::-;32643:4;32681:2;32670:9;32666:18;32658:26;;32730:9;32724:4;32720:20;32716:1;32705:9;32701:17;32694:47;32758:131;32884:4;32758:131;:::i;:::-;32750:139;;32477:419;;;:::o;32902:::-;33068:4;33106:2;33095:9;33091:18;33083:26;;33155:9;33149:4;33145:20;33141:1;33130:9;33126:17;33119:47;33183:131;33309:4;33183:131;:::i;:::-;33175:139;;32902:419;;;:::o;33327:::-;33493:4;33531:2;33520:9;33516:18;33508:26;;33580:9;33574:4;33570:20;33566:1;33555:9;33551:17;33544:47;33608:131;33734:4;33608:131;:::i;:::-;33600:139;;33327:419;;;:::o;33752:::-;33918:4;33956:2;33945:9;33941:18;33933:26;;34005:9;33999:4;33995:20;33991:1;33980:9;33976:17;33969:47;34033:131;34159:4;34033:131;:::i;:::-;34025:139;;33752:419;;;:::o;34177:::-;34343:4;34381:2;34370:9;34366:18;34358:26;;34430:9;34424:4;34420:20;34416:1;34405:9;34401:17;34394:47;34458:131;34584:4;34458:131;:::i;:::-;34450:139;;34177:419;;;:::o;34602:::-;34768:4;34806:2;34795:9;34791:18;34783:26;;34855:9;34849:4;34845:20;34841:1;34830:9;34826:17;34819:47;34883:131;35009:4;34883:131;:::i;:::-;34875:139;;34602:419;;;:::o;35027:::-;35193:4;35231:2;35220:9;35216:18;35208:26;;35280:9;35274:4;35270:20;35266:1;35255:9;35251:17;35244:47;35308:131;35434:4;35308:131;:::i;:::-;35300:139;;35027:419;;;:::o;35452:::-;35618:4;35656:2;35645:9;35641:18;35633:26;;35705:9;35699:4;35695:20;35691:1;35680:9;35676:17;35669:47;35733:131;35859:4;35733:131;:::i;:::-;35725:139;;35452:419;;;:::o;35877:::-;36043:4;36081:2;36070:9;36066:18;36058:26;;36130:9;36124:4;36120:20;36116:1;36105:9;36101:17;36094:47;36158:131;36284:4;36158:131;:::i;:::-;36150:139;;35877:419;;;:::o;36302:::-;36468:4;36506:2;36495:9;36491:18;36483:26;;36555:9;36549:4;36545:20;36541:1;36530:9;36526:17;36519:47;36583:131;36709:4;36583:131;:::i;:::-;36575:139;;36302:419;;;:::o;36727:222::-;36820:4;36858:2;36847:9;36843:18;36835:26;;36871:71;36939:1;36928:9;36924:17;36915:6;36871:71;:::i;:::-;36727:222;;;;:::o;36955:129::-;36989:6;37016:20;;:::i;:::-;37006:30;;37045:33;37073:4;37065:6;37045:33;:::i;:::-;36955:129;;;:::o;37090:75::-;37123:6;37156:2;37150:9;37140:19;;37090:75;:::o;37171:311::-;37248:4;37338:18;37330:6;37327:30;37324:56;;;37360:18;;:::i;:::-;37324:56;37410:4;37402:6;37398:17;37390:25;;37470:4;37464;37460:15;37452:23;;37171:311;;;:::o;37488:307::-;37549:4;37639:18;37631:6;37628:30;37625:56;;;37661:18;;:::i;:::-;37625:56;37699:29;37721:6;37699:29;:::i;:::-;37691:37;;37783:4;37777;37773:15;37765:23;;37488:307;;;:::o;37801:132::-;37868:4;37891:3;37883:11;;37921:4;37916:3;37912:14;37904:22;;37801:132;;;:::o;37939:114::-;38006:6;38040:5;38034:12;38024:22;;37939:114;;;:::o;38059:98::-;38110:6;38144:5;38138:12;38128:22;;38059:98;;;:::o;38163:113::-;38233:4;38265;38260:3;38256:14;38248:22;;38163:113;;;:::o;38282:184::-;38381:11;38415:6;38410:3;38403:19;38455:4;38450:3;38446:14;38431:29;;38282:184;;;;:::o;38472:147::-;38573:11;38610:3;38595:18;;38472:147;;;;:::o;38625:169::-;38709:11;38743:6;38738:3;38731:19;38783:4;38778:3;38774:14;38759:29;;38625:169;;;;:::o;38800:148::-;38902:11;38939:3;38924:18;;38800:148;;;;:::o;38954:305::-;38994:3;39013:20;39031:1;39013:20;:::i;:::-;39008:25;;39047:20;39065:1;39047:20;:::i;:::-;39042:25;;39201:1;39133:66;39129:74;39126:1;39123:81;39120:107;;;39207:18;;:::i;:::-;39120:107;39251:1;39248;39244:9;39237:16;;38954:305;;;;:::o;39265:185::-;39305:1;39322:20;39340:1;39322:20;:::i;:::-;39317:25;;39356:20;39374:1;39356:20;:::i;:::-;39351:25;;39395:1;39385:35;;39400:18;;:::i;:::-;39385:35;39442:1;39439;39435:9;39430:14;;39265:185;;;;:::o;39456:348::-;39496:7;39519:20;39537:1;39519:20;:::i;:::-;39514:25;;39553:20;39571:1;39553:20;:::i;:::-;39548:25;;39741:1;39673:66;39669:74;39666:1;39663:81;39658:1;39651:9;39644:17;39640:105;39637:131;;;39748:18;;:::i;:::-;39637:131;39796:1;39793;39789:9;39778:20;;39456:348;;;;:::o;39810:191::-;39850:4;39870:20;39888:1;39870:20;:::i;:::-;39865:25;;39904:20;39922:1;39904:20;:::i;:::-;39899:25;;39943:1;39940;39937:8;39934:34;;;39948:18;;:::i;:::-;39934:34;39993:1;39990;39986:9;39978:17;;39810:191;;;;:::o;40007:96::-;40044:7;40073:24;40091:5;40073:24;:::i;:::-;40062:35;;40007:96;;;:::o;40109:90::-;40143:7;40186:5;40179:13;40172:21;40161:32;;40109:90;;;:::o;40205:77::-;40242:7;40271:5;40260:16;;40205:77;;;:::o;40288:126::-;40325:7;40365:42;40358:5;40354:54;40343:65;;40288:126;;;:::o;40420:77::-;40457:7;40486:5;40475:16;;40420:77;;;:::o;40503:86::-;40538:7;40578:4;40571:5;40567:16;40556:27;;40503:86;;;:::o;40595:140::-;40659:9;40692:37;40723:5;40692:37;:::i;:::-;40679:50;;40595:140;;;:::o;40741:141::-;40806:9;40839:37;40870:5;40839:37;:::i;:::-;40826:50;;40741:141;;;:::o;40888:126::-;40938:9;40971:37;41002:5;40971:37;:::i;:::-;40958:50;;40888:126;;;:::o;41020:113::-;41070:9;41103:24;41121:5;41103:24;:::i;:::-;41090:37;;41020:113;;;:::o;41139:154::-;41223:6;41218:3;41213;41200:30;41285:1;41276:6;41271:3;41267:16;41260:27;41139:154;;;:::o;41299:307::-;41367:1;41377:113;41391:6;41388:1;41385:13;41377:113;;;41476:1;41471:3;41467:11;41461:18;41457:1;41452:3;41448:11;41441:39;41413:2;41410:1;41406:10;41401:15;;41377:113;;;41508:6;41505:1;41502:13;41499:101;;;41588:1;41579:6;41574:3;41570:16;41563:27;41499:101;41348:258;41299:307;;;:::o;41612:171::-;41651:3;41674:24;41692:5;41674:24;:::i;:::-;41665:33;;41720:4;41713:5;41710:15;41707:41;;;41728:18;;:::i;:::-;41707:41;41775:1;41768:5;41764:13;41757:20;;41612:171;;;:::o;41789:281::-;41872:27;41894:4;41872:27;:::i;:::-;41864:6;41860:40;42002:6;41990:10;41987:22;41966:18;41954:10;41951:34;41948:62;41945:88;;;42013:18;;:::i;:::-;41945:88;42053:10;42049:2;42042:22;41832:238;41789:281;;:::o;42076:233::-;42115:3;42138:24;42156:5;42138:24;:::i;:::-;42129:33;;42184:66;42177:5;42174:77;42171:103;;;42254:18;;:::i;:::-;42171:103;42301:1;42294:5;42290:13;42283:20;;42076:233;;;:::o;42315:79::-;42354:7;42383:5;42372:16;;42315:79;;;:::o;42400:180::-;42448:77;42445:1;42438:88;42545:4;42542:1;42535:15;42569:4;42566:1;42559:15;42586:180;42634:77;42631:1;42624:88;42731:4;42728:1;42721:15;42755:4;42752:1;42745:15;42772:180;42820:77;42817:1;42810:88;42917:4;42914:1;42907:15;42941:4;42938:1;42931:15;42958:180;43006:77;43003:1;42996:88;43103:4;43100:1;43093:15;43127:4;43124:1;43117:15;43144:180;43192:77;43189:1;43182:88;43289:4;43286:1;43279:15;43313:4;43310:1;43303:15;43330:117;43439:1;43436;43429:12;43453:117;43562:1;43559;43552:12;43699:117;43808:1;43805;43798:12;43822:117;43931:1;43928;43921:12;43945:117;44054:1;44051;44044:12;44068:117;44177:1;44174;44167:12;44191:102;44232:6;44283:2;44279:7;44274:2;44267:5;44263:14;44259:28;44249:38;;44191:102;;;:::o;44299:174::-;44439:26;44435:1;44427:6;44423:14;44416:50;44299:174;:::o;44479:173::-;44619:25;44615:1;44607:6;44603:14;44596:49;44479:173;:::o;44658:181::-;44798:33;44794:1;44786:6;44782:14;44775:57;44658:181;:::o;44845:225::-;44985:34;44981:1;44973:6;44969:14;44962:58;45054:8;45049:2;45041:6;45037:15;45030:33;44845:225;:::o;45076:214::-;45216:66;45212:1;45204:6;45200:14;45193:90;45076:214;:::o;45296:170::-;45436:22;45432:1;45424:6;45420:14;45413:46;45296:170;:::o;45472:182::-;45612:34;45608:1;45600:6;45596:14;45589:58;45472:182;:::o;45660:162::-;45800:14;45796:1;45788:6;45784:14;45777:38;45660:162;:::o;45828:221::-;45968:34;45964:1;45956:6;45952:14;45945:58;46037:4;46032:2;46024:6;46020:15;46013:29;45828:221;:::o;46055:::-;46195:34;46191:1;46183:6;46179:14;46172:58;46264:4;46259:2;46251:6;46247:15;46240:29;46055:221;:::o;46282:232::-;46422:34;46418:1;46410:6;46406:14;46399:58;46491:15;46486:2;46478:6;46474:15;46467:40;46282:232;:::o;46520:168::-;46660:20;46656:1;46648:6;46644:14;46637:44;46520:168;:::o;46694:181::-;46834:33;46830:1;46822:6;46818:14;46811:57;46694:181;:::o;46881:169::-;47021:21;47017:1;47009:6;47005:14;46998:45;46881:169;:::o;47056:221::-;47196:34;47192:1;47184:6;47180:14;47173:58;47265:4;47260:2;47252:6;47248:15;47241:29;47056:221;:::o;47283:164::-;47423:16;47419:1;47411:6;47407:14;47400:40;47283:164;:::o;47453:182::-;47593:34;47589:1;47581:6;47577:14;47570:58;47453:182;:::o;47641:177::-;47781:29;47777:1;47769:6;47765:14;47758:53;47641:177;:::o;47824:231::-;47964:34;47960:1;47952:6;47948:14;47941:58;48033:14;48028:2;48020:6;48016:15;48009:39;47824:231;:::o;48061:168::-;48201:20;48197:1;48189:6;48185:14;48178:44;48061:168;:::o;48235:181::-;48375:33;48371:1;48363:6;48359:14;48352:57;48235:181;:::o;48422:122::-;48495:24;48513:5;48495:24;:::i;:::-;48488:5;48485:35;48475:63;;48534:1;48531;48524:12;48475:63;48422:122;:::o;48550:116::-;48620:21;48635:5;48620:21;:::i;:::-;48613:5;48610:32;48600:60;;48656:1;48653;48646:12;48600:60;48550:116;:::o;48672:122::-;48745:24;48763:5;48745:24;:::i;:::-;48738:5;48735:35;48725:63;;48784:1;48781;48774:12;48725:63;48672:122;:::o;48800:::-;48873:24;48891:5;48873:24;:::i;:::-;48866:5;48863:35;48853:63;;48912:1;48909;48902:12;48853:63;48800:122;:::o;48928:118::-;48999:22;49015:5;48999:22;:::i;:::-;48992:5;48989:33;48979:61;;49036:1;49033;49026:12;48979:61;48928:118;:::o
Swarm Source
ipfs://0531a8e0d27c9b5c5c69d5dc81f23c22191a4d69b6167052fc09adb4ff98e3e1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.