Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 156 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 362289522 | 189 days ago | IN | 0 ETH | 0.00000048 | ||||
| Withdraw | 289538087 | 401 days ago | IN | 0 ETH | 0.00001144 | ||||
| Reinvest | 228084251 | 580 days ago | IN | 0 ETH | 0.00000637 | ||||
| Withdraw | 70767242 | 1053 days ago | IN | 0 ETH | 0.00005478 | ||||
| Withdraw | 69238094 | 1058 days ago | IN | 0 ETH | 0.00005845 | ||||
| Withdraw | 69170834 | 1058 days ago | IN | 0 ETH | 0.00005716 | ||||
| Withdraw | 68901679 | 1059 days ago | IN | 0 ETH | 0.00007027 | ||||
| Reinvest | 36584321 | 1181 days ago | IN | 0 ETH | 0.00008938 | ||||
| Reinvest | 29406718 | 1211 days ago | IN | 0 ETH | 0.00009387 | ||||
| Reinvest | 25176888 | 1233 days ago | IN | 0 ETH | 0.00006253 | ||||
| Withdraw | 22826274 | 1247 days ago | IN | 0 ETH | 0.0000319 | ||||
| Reinvest | 21701588 | 1254 days ago | IN | 0 ETH | 0.000036441385 ETH | ||||
| Reinvest | 20852739 | 1261 days ago | IN | 0 ETH | 0.000050585434 ETH | ||||
| Reinvest | 19635822 | 1275 days ago | IN | 0 ETH | 0.00004816002 ETH | ||||
| Reinvest | 19536399 | 1276 days ago | IN | 0 ETH | 0.00006514771 ETH | ||||
| Reinvest | 18450961 | 1289 days ago | IN | 0 ETH | 0.000057810545 ETH | ||||
| Reinvest | 17429750 | 1302 days ago | IN | 0 ETH | 0.000126283151 ETH | ||||
| Reinvest | 17353815 | 1303 days ago | IN | 0 ETH | 0.000088362209 ETH | ||||
| Withdraw | 17000812 | 1309 days ago | IN | 0 ETH | 0.000170168898 ETH | ||||
| Reinvest | 16722216 | 1312 days ago | IN | 0 ETH | 0.000187976224 ETH | ||||
| Reinvest | 15176970 | 1323 days ago | IN | 0 ETH | 0.000165925044 ETH | ||||
| Reinvest | 14635586 | 1329 days ago | IN | 0 ETH | 0.00034128274 ETH | ||||
| Reinvest | 13892792 | 1337 days ago | IN | 0 ETH | 0.000373548697 ETH | ||||
| Withdraw | 13585643 | 1340 days ago | IN | 0 ETH | 0.00029960313 ETH | ||||
| Reinvest | 13277187 | 1344 days ago | IN | 0 ETH | 0.000206866665 ETH |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 70767242 | 1053 days ago | 0 ETH | ||||
| 70767242 | 1053 days ago | 0 ETH | ||||
| 70767242 | 1053 days ago | 0 ETH | ||||
| 69238094 | 1058 days ago | 0 ETH | ||||
| 69238094 | 1058 days ago | 0 ETH | ||||
| 69238094 | 1058 days ago | 0 ETH | ||||
| 69170834 | 1058 days ago | 0 ETH | ||||
| 69170834 | 1058 days ago | 0 ETH | ||||
| 69170834 | 1058 days ago | 0 ETH | ||||
| 68901679 | 1059 days ago | 0 ETH | ||||
| 68901679 | 1059 days ago | 0 ETH | ||||
| 68901679 | 1059 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH | ||||
| 36584321 | 1181 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SPELLETHStrategy
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2021-12-17
*/
/**
*Submitted for verification at arbiscan.io on 2021-09-22
*/
/**
*Submitted for verification at arbiscan.io on 2021-09-22
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
/**
* @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);
}
}
/**
* @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;
}
}
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @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);
}
/**
* @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:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), 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}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - 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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][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) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), 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:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, 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 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 {}
}
/**
* @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.
*
* 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.
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "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 onlyOwner {
emit OwnershipTransferred(owner, address(0));
owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
interface IRouter {
function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityAVAX(address token, uint amountTokenDesired, uint amountTokenMin, uint amountAVAXMin, address to, uint deadline) external payable returns (uint amountToken, uint amountAVAX, uint liquidity);
function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
function removeLiquidityAVAX(address token, uint liquidity, uint amountTokenMin, uint amountAVAXMin, address to, uint deadline) external returns (uint amountToken, uint amountAVAX);
function removeLiquidityWithPermit(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountA, uint amountB);
function removeLiquidityAVAXWithPermit(address token, uint liquidity, uint amountTokenMin, uint amountAVAXMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountToken, uint amountAVAX);
function removeLiquidityAVAXSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountAVAXMin, address to, uint deadline) external returns (uint amountAVAX);
function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountAVAXMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountAVAX);
function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapTokensForExactTokens(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactAVAXForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function swapTokensForExactAVAX(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactTokensForAVAX(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapAVAXForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external;
function swapExactAVAXForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] memory path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] memory path) external view returns (uint[] memory amounts);
}
interface IPair is IERC20 {
function token0() external pure returns (address);
function token1() external pure returns (address);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function mint(address to) external returns (uint liquidity);
function sync() external;
}
interface IMiniChefV2 {
function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending);
function deposit(uint256 pid, uint256 amount, address to) external;
function withdraw(uint256 pid, uint256 amount, address to) external;
function harvest(uint256 pid, address to) external;
}
interface IStrategy {
function deposit(uint amount) external;
function reinvest() external;
function withdraw(uint amount) external;
}
contract SPELLETHStrategy is ERC20, AccessControl, IStrategy {
uint public totalDeposits;
address public feeDestination;
IERC20 public arbi;
IRouter public router;
IPair public depositToken;
IERC20 public token0;
IERC20 public token1;
IERC20 public rewardToken1;//sushi
IERC20 public rewardToken2;//spell
IMiniChefV2 public stakingContract;
uint256 public pid;
uint public MIN_TOKENS_TO_REINVEST = 10000;
uint public REINVEST_REWARD_BIPS = 50;//0.5%
uint public ADMIN_FEE_BIPS = 300;//3%
uint public WITHDRAW_FEE_BIPS = 10;//0.1%
uint constant private BIPS_DIVISOR = 10000;
bool public REQUIRE_REINVEST_BEFORE_DEPOSIT;
uint public MIN_TOKENS_TO_REINVEST_BEFORE_DEPOSIT = 20;
event Deposit(address indexed account, uint amount);
event Withdraw(address indexed account, uint amount);
event Reinvest(uint newTotalDeposits, uint newTotalSupply);
event Recovered(address token, uint amount);
event UpdateAdminFee(uint oldValue, uint newValue);
event UpdateReinvestReward(uint oldValue, uint newValue);
event UpdateMinTokensToReinvest(uint oldValue, uint newValue);
event UpdateWithdrawFee(uint oldValue, uint newValue);
event UpdateRequireReinvestBeforeDeposit(bool newValue);
event UpdateMinTokensToReinvestBeforeDeposit(uint oldValue, uint newValue);
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
modifier onlyAdmin() {
require(hasRole(ADMIN_ROLE, msg.sender), "Caller is not an admin");
_;
}
constructor(
string memory _name,
string memory _symbol
) ERC20(_name, _symbol) {
depositToken = IPair(0xaa5bD49f2162ffdC15634c87A77AC67bD51C6a6D);
rewardToken1 = IERC20(0xd4d42F0b6DEF4CE0383636770eF773390d85c61A);//sushi
rewardToken2 = IERC20(0x8D9bA570D6cb60C7e3e0F31343Efe75AB8E65FB1);//gohm
stakingContract = IMiniChefV2(0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3);
router = IRouter(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
pid = 12;
address _token0 = depositToken.token0();//weth
address _token1 = depositToken.token1();//gohm
token0 = IERC20(_token0);
token1 = IERC20(_token1);
feeDestination = msg.sender;
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setupRole(ADMIN_ROLE, msg.sender);
setAllowances();
emit Reinvest(0, 0);
}
/**
* @dev Throws if called by smart contract
*/
modifier onlyEOA() {
require(tx.origin == msg.sender, "onlyEOA");
_;
}
function setArbi(address arbiAddress) public onlyAdmin {
require(address(arbi) == 0x0000000000000000000000000000000000000000, "arbi already set");
arbi = IERC20(arbiAddress);
}
/**
* @notice set desination for admin fees generated by this pool
* @param newDestination the address to send fees to
*/
function setFeeDestination(address newDestination) public onlyAdmin {
feeDestination = newDestination;
}
/**
* @notice Approve tokens for use in Strategy
* @dev Restricted to avoid griefing attacks
*/
function setAllowances() public onlyAdmin {
depositToken.approve(address(stakingContract), depositToken.totalSupply());
token0.approve(address(stakingContract), token0.totalSupply());
token0.approve(address(router), token0.totalSupply());
token1.approve(address(stakingContract), token1.totalSupply());
token1.approve(address(router), token1.totalSupply());
setRewardAllowances();
}
function setRewardAllowances() private {
rewardToken1.approve(address(stakingContract), rewardToken1.totalSupply());
rewardToken1.approve(address(router), rewardToken1.totalSupply());
rewardToken2.approve(address(stakingContract), rewardToken2.totalSupply());
rewardToken2.approve(address(router), rewardToken2.totalSupply());
}
/**
* @notice Revoke token allowance
* @dev Restricted to avoid griefing attacks
* @param token address
* @param spender address
*/
function revokeAllowance(address token, address spender) external onlyAdmin {
require(IERC20(token).approve(spender, 0));
}
/**
* @notice Deposit tokens to receive receipt tokens
* @param amount Amount of tokens to deposit
*/
function deposit(uint amount) external override {
_deposit(amount);
}
function _deposit(uint amount) internal {
require(totalDeposits >= totalSupply(), "deposit failed");
if (REQUIRE_REINVEST_BEFORE_DEPOSIT) {
uint unclaimedRewards = checkReward();
if (unclaimedRewards >= MIN_TOKENS_TO_REINVEST_BEFORE_DEPOSIT) {
_reinvest(unclaimedRewards);
}
}
require(depositToken.transferFrom(msg.sender, address(this), amount), "transferFrom failed");
_stakeDepositTokens(amount);
_mint(msg.sender, getSharesForDepositTokens(amount));
totalDeposits = totalDeposits + amount;
emit Deposit(msg.sender, amount);
}
/**
* @notice Withdraw LP tokens by redeeming receipt tokens
* @param amount Amount of receipt tokens to redeem
*/
function withdraw(uint amount) external override {
require(balanceOf(msg.sender) >= amount, "insufficent balance to withdraw");
uint depositTokenAmount = getDepositTokensForShares(amount);
if (depositTokenAmount > 0) {
_withdrawDepositTokens(depositTokenAmount);
if (WITHDRAW_FEE_BIPS != 0) {
uint withdrawFee = (depositTokenAmount * WITHDRAW_FEE_BIPS) / BIPS_DIVISOR;
require(depositToken.transfer(feeDestination, withdrawFee), "transfer failed");
depositTokenAmount = depositTokenAmount - withdrawFee;
}
require(depositToken.transfer(msg.sender, depositTokenAmount), "transfer failed");
_burn(msg.sender, amount);
totalDeposits = totalDeposits - depositTokenAmount;
emit Withdraw(msg.sender, depositTokenAmount);
}
}
/**
* @notice Calculate receipt tokens for a given amount of deposit tokens
* @dev If contract is empty, use 1:1 ratio
* @dev Could return zero shares for very low amounts of deposit tokens
* @param amount deposit tokens
* @return receipt tokens
*/
function getSharesForDepositTokens(uint amount) public view returns (uint) {
if ((totalSupply() * totalDeposits) == 0) {
return amount;
}
return (amount * totalSupply()) / totalDeposits;
}
/**
* @notice Calculate deposit tokens for a given amount of receipt tokens
* @param amount receipt tokens
* @return deposit tokens
*/
function getDepositTokensForShares(uint amount) public view returns (uint) {
if ((totalSupply() * totalDeposits) == 0) {
return 0;
}
return (amount * totalDeposits) / totalSupply();
}
/**
* @notice Reward token balance that can be reinvested
* @dev Staking rewards accurue to contract on each deposit/withdrawal
* @return Unclaimed rewards, plus contract balance
*/
function checkReward() public view returns (uint) {
uint pendingReward = stakingContract.pendingSushi(pid, address(this));
uint contractBalance = rewardToken1.balanceOf(address(this));
return pendingReward + contractBalance;
}
/**
* @notice Estimate reinvest reward for caller
* @return Estimated rewards tokens earned for calling `reinvest()`
*/
function estimateReinvestReward() external view returns (uint) {
uint unclaimedRewards = checkReward();
if (unclaimedRewards >= MIN_TOKENS_TO_REINVEST) {
return (unclaimedRewards * REINVEST_REWARD_BIPS) / BIPS_DIVISOR;
}
return 0;
}
/**
* @notice Reinvest rewards from staking contract to deposit tokens
* @dev This external function requires minimum tokens to be met
*/
function reinvest() external override onlyEOA {
uint unclaimedRewards = checkReward();
require(unclaimedRewards >= MIN_TOKENS_TO_REINVEST, "MIN_TOKENS_TO_REINVEST");
if (address(arbi) != 0x0000000000000000000000000000000000000000) {
require(arbi.balanceOf(msg.sender) >= 69000000000000000000, "insufficent ARBI balance");
}
_reinvest(unclaimedRewards);
}
/**
* @notice Reinvest rewards from staking contract to deposit tokens
* @dev This internal function does not require mininmum tokens to be met
*/
function _reinvest(uint amount) internal {
stakingContract.harvest(pid, address(this));
uint256 spellAmount = (rewardToken2.balanceOf(address(this)));
if (spellAmount > 10) {
uint256 adminSpellFee = (spellAmount * ADMIN_FEE_BIPS) / BIPS_DIVISOR;
uint256 spellReinvestFee = (spellAmount * ADMIN_FEE_BIPS) / BIPS_DIVISOR;
if (adminSpellFee > 0) {
require(rewardToken2.transfer(feeDestination, adminSpellFee), "admin fee2 transfer failed");
}
if (spellReinvestFee > 0) {
require(rewardToken2.transfer(msg.sender, spellReinvestFee), "reinvest fee2 transfer failed");
}
}
uint adminFee = (amount * ADMIN_FEE_BIPS) / BIPS_DIVISOR;
if (adminFee > 0) {
require(rewardToken1.transfer(feeDestination, adminFee), "admin fee transfer failed");
}
uint reinvestFee = (amount * REINVEST_REWARD_BIPS) / BIPS_DIVISOR;
if (reinvestFee > 0) {
require(rewardToken1.transfer(msg.sender, reinvestFee), "reinvest fee transfer failed");
}
uint lpTokenAmount = _convertRewardTokensToDepositTokens((amount - adminFee) - reinvestFee);
_stakeDepositTokens(lpTokenAmount);
totalDeposits = totalDeposits + lpTokenAmount;
emit Reinvest(totalDeposits, totalSupply());
}
/**
* @notice Converts reward tokens to deposit tokens
* @dev Always converts through router; there are no price checks enabled
* @return deposit tokens received
*/
function _convertRewardTokensToDepositTokens(uint amount) private returns (uint) {
uint amountIn = amount / 2;
require(amountIn > 0, "::_convertRewardTokensToDepositTokens");
//do this first bcuz code below also generates more gOHM
(uint256 amountOutWETH, uint256 amountOutgOHM) = convertSpell();
// swap reward1 to token0(weth)
address[] memory path0 = new address[](2);
path0[0] = address(rewardToken1);
path0[1] = depositToken.token0();//weth
uint amountOutToken0 = amountIn;
uint[] memory amountsOutToken0 = router.getAmountsOut(amountIn, path0);
amountOutToken0 = amountsOutToken0[amountsOutToken0.length - 1];
router.swapExactTokensForTokens(amountIn, amountOutToken0, path0, address(this), block.timestamp);
// swap reward1 to token1(gOHM)
address[] memory path1 = new address[](3);
path1[0] = path0[0];
path1[1] = IPair(address(depositToken)).token0();//weth
path1[2] = IPair(address(depositToken)).token1();//gohm
uint amountOutToken1 = amountIn;
uint[] memory amountsOutToken1 = router.getAmountsOut(amountIn, path1);
amountOutToken1 = amountsOutToken1[amountsOutToken1.length - 1];
router.swapExactTokensForTokens(amountIn, amountOutToken1, path1, address(this), block.timestamp);
(,,uint liquidity) = router.addLiquidity(
IPair(address(depositToken)).token0(), IPair(address(depositToken)).token1(),
amountOutToken0+amountOutWETH, amountOutToken1+amountOutgOHM,
0, 0,
address(this),
block.timestamp
);
return liquidity;
}
// (gOHM)
function convertSpell() internal returns (uint256, uint256) {
if (rewardToken2.balanceOf(address(this)) > 10) {
uint amountIn2 = rewardToken2.balanceOf(address(this)) / 2;
// swap reward2 to token0(weth)
address[] memory path2 = new address[](2);
path2[0] = address(rewardToken2);//gohm
path2[1] = depositToken.token0();//weth
uint256 amountOutToken02 = amountIn2;
uint[] memory amountsOutToken2 = router.getAmountsOut(amountIn2, path2);
amountOutToken02 = amountsOutToken2[amountsOutToken2.length - 1];
router.swapExactTokensForTokens(amountIn2, amountOutToken02, path2, address(this), block.timestamp);
return (amountIn2, amountOutToken02);
} else {
return (0,0);
}
}
/**
* @notice Stakes deposit tokens in Staking Contract
* @param amount deposit tokens to stake
*/
function _stakeDepositTokens(uint amount) internal {
require(amount > 0, "amount too low");
stakingContract.deposit(pid, uint128(amount), address(this));
}
/**
* @notice Withdraws deposit tokens from Staking Contract
* @dev Reward tokens are automatically collected
* @dev Reward tokens are not automatically reinvested
* @param amount deposit tokens to remove
*/
function _withdrawDepositTokens(uint amount) internal {
require(amount > 0, "amount too low");
stakingContract.withdraw(pid, uint128(amount), address(this));
}
/**
* @notice Update reinvest minimum threshold for external callers
* @param newValue min threshold in wei
*/
function updateMinTokensToReinvest(uint newValue) external onlyAdmin {
emit UpdateMinTokensToReinvest(MIN_TOKENS_TO_REINVEST, newValue);
MIN_TOKENS_TO_REINVEST = newValue;
}
/**
* @notice Update fee charged to withdraw from pool
* @param newValue amount in bips
*/
function updateWithdrawFeeBips(uint newValue) external onlyAdmin {
require(newValue < 50, "withdraw fee cant exceed 0.5%");
emit UpdateWithdrawFee(WITHDRAW_FEE_BIPS, newValue);
WITHDRAW_FEE_BIPS = newValue;
}
/**
* @notice Update admin fee
* @dev Total fees cannot be greater than BIPS_DIVISOR (max 5%)
* @param newValue specified in BIPS
*/
function updateAdminFee(uint newValue) external onlyAdmin {
require(newValue + REINVEST_REWARD_BIPS <= BIPS_DIVISOR / 20, "admin fee too high");
emit UpdateAdminFee(ADMIN_FEE_BIPS, newValue);
ADMIN_FEE_BIPS = newValue;
}
/**
* @notice Update reinvest reward
* @dev Total fees cannot be greater than BIPS_DIVISOR (max 5%)
* @param newValue specified in BIPS
*/
function updateReinvestReward(uint newValue) external onlyAdmin {
require(newValue + ADMIN_FEE_BIPS <= BIPS_DIVISOR / 20, "reinvest reward too high");
emit UpdateReinvestReward(REINVEST_REWARD_BIPS, newValue);
REINVEST_REWARD_BIPS = newValue;
}
/**
* @notice Toggle requirement to reinvest before deposit
*/
function updateRequireReinvestBeforeDeposit() external onlyAdmin {
REQUIRE_REINVEST_BEFORE_DEPOSIT = !REQUIRE_REINVEST_BEFORE_DEPOSIT;
emit UpdateRequireReinvestBeforeDeposit(REQUIRE_REINVEST_BEFORE_DEPOSIT);
}
/**
* @notice Update reinvest minimum threshold before a deposit
* @param newValue min threshold in wei
*/
function updateMinTokensToReinvestBeforeDeposit(uint newValue) external onlyAdmin {
emit UpdateMinTokensToReinvestBeforeDeposit(MIN_TOKENS_TO_REINVEST_BEFORE_DEPOSIT, newValue);
MIN_TOKENS_TO_REINVEST_BEFORE_DEPOSIT = newValue;
}
/**
* @notice Recover ether from contract (should never be any in it)
* @param amount amount
*/
function recoverETH(uint amount) external onlyAdmin {
require(amount > 0, "amount too low");
payable(msg.sender).transfer(amount);
emit Recovered(address(0), amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTotalDeposits","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateAdminFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateMinTokensToReinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateMinTokensToReinvestBeforeDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateReinvestReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"UpdateRequireReinvestBeforeDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpdateWithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ADMIN_FEE_BIPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TOKENS_TO_REINVEST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TOKENS_TO_REINVEST_BEFORE_DEPOSIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REINVEST_REWARD_BIPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUIRE_REINVEST_BEFORE_DEPOSIT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_FEE_BIPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arbi","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"contract IPair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimateReinvestReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getDepositTokensForShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getSharesForDepositTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"revokeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken1","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken2","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setAllowances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"arbiAddress","type":"address"}],"name":"setArbi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDestination","type":"address"}],"name":"setFeeDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract IMiniChefV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateAdminFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateMinTokensToReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateMinTokensToReinvestBeforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateReinvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRequireReinvestBeforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateWithdrawFeeBips","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052612710601155603260125561012c601355600a60145560146016553480156200002c57600080fd5b50604051620050fd380380620050fd8339810160408190526200004f9162000f85565b8151829082906200006890600390602085019062000dd2565b5080516200007e90600490602084019062000dd2565b5050600a80546001600160a01b031990811673aa5bd49f2162ffdc15634c87a77ac67bd51c6a6d908117909255600d8054821673d4d42f0b6def4ce0383636770ef773390d85c61a179055600e80548216738d9ba570d6cb60c7e3e0f31343efe75ab8e65fb1179055600f8054821673f4d73326c13a4fc5fd7a064217e12780e9bd62c317905560098054909116731b02da8cb0d097eb8d57a175b88c7d8b47997506179055600c60105560408051630dfe168160e01b8152905160009350630dfe168191600481810192602092909190829003018186803b1580156200016457600080fd5b505afa15801562000179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019f919062000f2f565b90506000600a60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620001f257600080fd5b505afa15801562000207573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022d919062000f2f565b600b80546001600160a01b03199081166001600160a01b0386811691909117909255600c805482169284169290921790915560078054339216821790559091506200027b90600090620002f4565b620002a77fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533620002f4565b620002b162000304565b60408051600080825260208201527fc7606d21ac05cd309191543e409f0845c016120563783d70e4f41419dc0ef234910160405180910390a1505050506200105c565b620003008282620008e8565b5050565b3360009081527fd8ef4509105c3edb0b04658b4528edc5ddd30ea5a81e623a2623c88db1eb54b6602052604090205460ff16620003875760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000604482015260640160405180910390fd5b600a54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b158015620003da57600080fd5b505afa158015620003ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000415919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156200045c57600080fd5b505af115801562000471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000497919062000f61565b50600b54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b158015620004eb57600080fd5b505afa15801562000500573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000526919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156200056d57600080fd5b505af115801562000582573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a8919062000f61565b50600b54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b158015620005fc57600080fd5b505afa15801562000611573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000637919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156200067e57600080fd5b505af115801562000693573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006b9919062000f61565b50600c54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b1580156200070d57600080fd5b505afa15801562000722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000748919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156200078f57600080fd5b505af1158015620007a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ca919062000f61565b50600c54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b1580156200081e57600080fd5b505afa15801562000833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000859919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015620008a057600080fd5b505af1158015620008b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008db919062000f61565b50620008e66200098c565b565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff16620003005760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620009483390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600d54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b158015620009df57600080fd5b505afa158015620009f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a1a919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801562000a6157600080fd5b505af115801562000a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a9c919062000f61565b50600d54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801562000af057600080fd5b505afa15801562000b05573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b2b919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801562000b7257600080fd5b505af115801562000b87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bad919062000f61565b50600e54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801562000c0157600080fd5b505afa15801562000c16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c3c919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801562000c8357600080fd5b505af115801562000c98573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cbe919062000f61565b50600e54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801562000d1257600080fd5b505afa15801562000d27573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4d919062000fef565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801562000d9457600080fd5b505af115801562000da9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dcf919062000f61565b50565b82805462000de09062001009565b90600052602060002090601f01602090048101928262000e04576000855562000e4f565b82601f1062000e1f57805160ff191683800117855562000e4f565b8280016001018555821562000e4f579182015b8281111562000e4f57825182559160200191906001019062000e32565b5062000e5d92915062000e61565b5090565b5b8082111562000e5d576000815560010162000e62565b600082601f83011262000e8a57600080fd5b81516001600160401b038082111562000ea75762000ea762001046565b604051601f8301601f19908116603f0116810190828211818310171562000ed25762000ed262001046565b8160405283815260209250868385880101111562000eef57600080fd5b600091505b8382101562000f13578582018301518183018401529082019062000ef4565b8382111562000f255760008385830101525b9695505050505050565b60006020828403121562000f4257600080fd5b81516001600160a01b038116811462000f5a57600080fd5b9392505050565b60006020828403121562000f7457600080fd5b8151801515811462000f5a57600080fd5b6000806040838503121562000f9957600080fd5b82516001600160401b038082111562000fb157600080fd5b62000fbf8683870162000e78565b9350602085015191508082111562000fd657600080fd5b5062000fe58582860162000e78565b9150509250929050565b6000602082840312156200100257600080fd5b5051919050565b600181811c908216806200101e57607f821691505b602082108114156200104057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b614091806200106c6000396000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c806395d89b41116101b8578063d547741f11610104578063eab89a5a116100a2578063f10684541161007c578063f1068454146106f7578063f887ea4014610700578063fbe5323414610713578063fdb5a03e1461072657600080fd5b8063eab89a5a146106be578063edb977b2146106d1578063ee99205c146106e457600080fd5b8063dd62ed3e116100de578063dd62ed3e14610656578063dd8ce4d61461068f578063de53fcd5146106a2578063e20318e1146106b557600080fd5b8063d547741f14610628578063d61a47f11461063b578063dbd9a4d41461064e57600080fd5b8063b9e57b8011610171578063c89039c51161014b578063c89039c5146105dc578063cff1b6ef146105ef578063d21220a714610602578063d33355531461061557600080fd5b8063b9e57b80146105c3578063bd079f55146105cb578063c4b24a46146105d457600080fd5b806395d89b4114610567578063a217fddf1461056f578063a457c2d714610577578063a8ae2b7c1461058a578063a9059cbb1461059d578063b6b55f25146105b057600080fd5b80632f2ff15d1161029257806370a08231116102305780637d8820971161020a5780637d8820971461052f57806381837230146105385780638aff733d1461054b57806391d148541461055457600080fd5b806370a08231146104de57806375b238fc146105075780637ae267731461051c57600080fd5b8063395093511161026c57806339509351146104925780635a8e1b6a146104a55780636e2936ff146104b85780636f28d688146104cb57600080fd5b80632f2ff15d1461045d578063313ce5671461047057806336568abe1461047f57600080fd5b806311451804116102ff578063236aecd5116102d9578063236aecd51461040c57806323b872dd14610414578063248a9ca3146104275780632e1a7d4d1461044a57600080fd5b806311451804146103ee57806313317314146103f757806318160ddd1461040457600080fd5b806301ffc9a71461034757806303f7d9071461036f57806306fdde03146103845780630767711114610399578063095ea7b3146103b05780630dfe1681146103c3575b600080fd5b61035a610355366004613ccb565b61072e565b60405190151581526020015b60405180910390f35b61038261037d366004613c8d565b610765565b005b61038c6107e3565b6040516103669190613e0e565b6103a260135481565b604051908152602001610366565b61035a6103be366004613b7a565b610875565b600b546103d6906001600160a01b031681565b6040516001600160a01b039091168152602001610366565b6103a260165481565b60155461035a9060ff1681565b6002546103a2565b61038261088b565b61035a610422366004613b39565b61090c565b6103a2610435366004613c8d565b60009081526005602052604090206001015490565b610382610458366004613c8d565b6109b6565b61038261046b366004613ca6565b610c43565b60405160128152602001610366565b61038261048d366004613ca6565b610c6e565b61035a6104a0366004613b7a565b610ce8565b6103826104b3366004613c8d565b610d24565b6103826104c6366004613ac6565b610de9565b600d546103d6906001600160a01b031681565b6103a26104ec366004613ac6565b6001600160a01b031660009081526020819052604090205490565b6103a260008051602061403c83398151915281565b61038261052a366004613b00565b610e8b565b6103a260065481565b610382610546366004613c8d565b610f49565b6103a260125481565b61035a610562366004613ca6565b610fbe565b61038c610fe9565b6103a2600081565b61035a610585366004613b7a565b610ff8565b610382610598366004613c8d565b611091565b61035a6105ab366004613b7a565b61116e565b6103826105be366004613c8d565b61117b565b6103a2611187565b6103a260115481565b6103a26111c6565b600a546103d6906001600160a01b031681565b6103826105fd366004613c8d565b6112e5565b600c546103d6906001600160a01b031681565b610382610623366004613c8d565b6113b7565b610382610636366004613ca6565b611476565b600e546103d6906001600160a01b031681565b61038261149c565b6103a2610664366004613b00565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103a261069d366004613c8d565b6119bc565b6007546103d6906001600160a01b031681565b6103a260145481565b6103a26106cc366004613c8d565b6119f6565b6008546103d6906001600160a01b031681565b600f546103d6906001600160a01b031681565b6103a260105481565b6009546103d6906001600160a01b031681565b610382610721366004613ac6565b611a2a565b610382611a80565b60006001600160e01b03198216637965db0b60e01b148061075f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61077d60008051602061403c83398151915233610fbe565b6107a25760405162461bcd60e51b815260040161079990613e69565b60405180910390fd5b60165460408051918252602082018390527fd0f7c999974ac5e720302e1a81f85f0e86835bd50d1cdd4086c839df9c123aab910160405180910390a1601655565b6060600380546107f290613fa9565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613fa9565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b6000610882338484611bfc565b50600192915050565b6108a360008051602061403c83398151915233610fbe565b6108bf5760405162461bcd60e51b815260040161079990613e69565b6015805460ff8082161560ff1990921682179092556040519116151581527fd46852adf64681b12b81a308b01efd0a546667f68ab41ae5855c2bae7756380f9060200160405180910390a1565b6000610919848484611d20565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561099e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610799565b6109ab8533858403611bfc565b506001949350505050565b33600090815260208190526040902054811115610a155760405162461bcd60e51b815260206004820152601f60248201527f696e737566666963656e742062616c616e636520746f207769746864726177006044820152606401610799565b6000610a20826119f6565b90508015610c3f57610a3181611ef0565b60145415610b2c57600061271060145483610a4c9190613f30565b610a569190613f0e565b600a5460075460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92610a8e9216908590600401613df5565b602060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190613c6b565b610b1e5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610799565b610b288183613f4f565b9150505b600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b5e9033908590600401613df5565b602060405180830381600087803b158015610b7857600080fd5b505af1158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190613c6b565b610bee5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610799565b610bf83383611f8b565b80600654610c069190613f4f565b60065560405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25b5050565b600082815260056020526040902060010154610c5f81336120d9565b610c69838361213d565b505050565b6001600160a01b0381163314610cde5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610799565b610c3f82826121c3565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610882918590610d1f908690613ef6565b611bfc565b610d3c60008051602061403c83398151915233610fbe565b610d585760405162461bcd60e51b815260040161079990613e69565b60328110610da85760405162461bcd60e51b815260206004820152601d60248201527f7769746864726177206665652063616e742065786365656420302e35250000006044820152606401610799565b60145460408051918252602082018390527fc8f740efc9743a417853bea994ab415c2814ca81da8cb892208738d64a508377910160405180910390a1601455565b610e0160008051602061403c83398151915233610fbe565b610e1d5760405162461bcd60e51b815260040161079990613e69565b6008546001600160a01b031615610e695760405162461bcd60e51b815260206004820152601060248201526f185c989a48185b1c9958591e481cd95d60821b6044820152606401610799565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b610ea360008051602061403c83398151915233610fbe565b610ebf5760405162461bcd60e51b815260040161079990613e69565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610eee908490600090600401613df5565b602060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190613c6b565b610c3f57600080fd5b610f6160008051602061403c83398151915233610fbe565b610f7d5760405162461bcd60e51b815260040161079990613e69565b60115460408051918252602082018390527f481f79ac3a523b6d6db3c5a720e190e986d1cc1b41adcdf50f9caef849901100910160405180910390a1601155565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546107f290613fa9565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561107a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610799565b6110873385858403611bfc565b5060019392505050565b6110a960008051602061403c83398151915233610fbe565b6110c55760405162461bcd60e51b815260040161079990613e69565b6110d26014612710613f0e565b6013546110df9083613ef6565b111561112d5760405162461bcd60e51b815260206004820152601860248201527f7265696e766573742072657761726420746f6f206869676800000000000000006044820152606401610799565b60125460408051918252602082018390527fe7f97d51d307dc44045597c9978bec0f842e6bb40d19b9444084cfa30d9ed4f2910160405180910390a1601255565b6000610882338484611d20565b6111848161222a565b50565b6000806111926111c6565b905060115481106111be57612710601254826111ae9190613f30565b6111b89190613f0e565b91505090565b600091505090565b600f5460105460405163065509bb60e21b8152600481019190915230602482015260009182916001600160a01b039091169063195426ec9060440160206040518083038186803b15801561121957600080fd5b505afa15801561122d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190613cf5565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190613cf5565b90506112de8183613ef6565b9250505090565b6112fd60008051602061403c83398151915233610fbe565b6113195760405162461bcd60e51b815260040161079990613e69565b6113266014612710613f0e565b6012546113339083613ef6565b11156113765760405162461bcd60e51b81526020600482015260126024820152710c2c8dad2dc40cccaca40e8dede40d0d2ced60731b6044820152606401610799565b60135460408051918252602082018390527f3cc372f330f95ac9540626dc8a25f5bf21ba607215a5d58304cb804d446f104a910160405180910390a1601355565b6113cf60008051602061403c83398151915233610fbe565b6113eb5760405162461bcd60e51b815260040161079990613e69565b6000811161140b5760405162461bcd60e51b815260040161079990613e41565b604051339082156108fc029083906000818181858888f19350505050158015611438573d6000803e3d6000fd5b507f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2860008260405161146b929190613df5565b60405180910390a150565b60008281526005602052604090206001015461149281336120d9565b610c6983836121c3565b6114b460008051602061403c83398151915233610fbe565b6114d05760405162461bcd60e51b815260040161079990613e69565b600a54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561152257600080fd5b505afa158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190613cf5565b6040518363ffffffff1660e01b8152600401611577929190613df5565b602060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613c6b565b50600b54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190613cf5565b6040518363ffffffff1660e01b8152600401611671929190613df5565b602060405180830381600087803b15801561168b57600080fd5b505af115801561169f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c39190613c6b565b50600b54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190613cf5565b6040518363ffffffff1660e01b815260040161176b929190613df5565b602060405180830381600087803b15801561178557600080fd5b505af1158015611799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bd9190613c6b565b50600c54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561181057600080fd5b505afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118489190613cf5565b6040518363ffffffff1660e01b8152600401611865929190613df5565b602060405180830381600087803b15801561187f57600080fd5b505af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b79190613c6b565b50600c54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561190a57600080fd5b505afa15801561191e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119429190613cf5565b6040518363ffffffff1660e01b815260040161195f929190613df5565b602060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b19190613c6b565b506119ba6123ca565b565b60006006546119ca60025490565b6119d49190613f30565b6119dc575090565b6006546002546119ec9084613f30565b61075f9190613f0e565b6000600654611a0460025490565b611a0e9190613f30565b611a1a57506000919050565b6002546006546119ec9084613f30565b611a4260008051602061403c83398151915233610fbe565b611a5e5760405162461bcd60e51b815260040161079990613e69565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b323314611ab95760405162461bcd60e51b81526020600482015260076024820152666f6e6c79454f4160c81b6044820152606401610799565b6000611ac36111c6565b9050601154811015611b105760405162461bcd60e51b815260206004820152601660248201527513525397d513d2d15394d7d513d7d4915253959154d560521b6044820152606401610799565b6008546001600160a01b031615611bf3576008546040516370a0823160e01b81523360048201526803bd913e6c1df40000916001600160a01b0316906370a082319060240160206040518083038186803b158015611b6d57600080fd5b505afa158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba59190613cf5565b1015611bf35760405162461bcd60e51b815260206004820152601860248201527f696e737566666963656e7420415242492062616c616e636500000000000000006044820152606401610799565b611184816127b1565b6001600160a01b038316611c5e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610799565b6001600160a01b038216611cbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610799565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611d845760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610799565b6001600160a01b038216611de65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610799565b6001600160a01b03831660009081526020819052604090205481811015611e5e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610799565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611e95908490613ef6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ee191815260200190565b60405180910390a35b50505050565b60008111611f105760405162461bcd60e51b815260040161079990613e41565b600f54601054604051630ad58d2f60e01b815260048101919091526001600160801b03831660248201523060448201526001600160a01b0390911690630ad58d2f906064015b600060405180830381600087803b158015611f7057600080fd5b505af1158015611f84573d6000803e3d6000fd5b5050505050565b6001600160a01b038216611feb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610799565b6001600160a01b0382166000908152602081905260409020548181101561205f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610799565b6001600160a01b038316600090815260208190526040812083830390556002805484929061208e908490613f4f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6120e38282610fbe565b610c3f576120fb816001600160a01b03166014612d08565b612106836020612d08565b604051602001612117929190613d80565b60408051601f198184030181529082905262461bcd60e51b825261079991600401613e0e565b6121478282610fbe565b610c3f5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561217f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121cd8282610fbe565b15610c3f5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600254600654101561226f5760405162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b6044820152606401610799565b60155460ff161561229a5760006122846111c6565b9050601654811061229857612298816127b1565b505b600a546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156122ec57600080fd5b505af1158015612300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123249190613c6b565b6123665760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c919c9bdb4819985a5b1959606a1b6044820152606401610799565b61236f81612eab565b6123813361237c836119bc565b612f15565b8060065461238f9190613ef6565b60065560405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250565b600d54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613cf5565b6040518363ffffffff1660e01b8152600401612471929190613df5565b602060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c39190613c6b565b50600d54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561251657600080fd5b505afa15801561252a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254e9190613cf5565b6040518363ffffffff1660e01b815260040161256b929190613df5565b602060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190613c6b565b50600e54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561261057600080fd5b505afa158015612624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126489190613cf5565b6040518363ffffffff1660e01b8152600401612665929190613df5565b602060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b79190613c6b565b50600e54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561270a57600080fd5b505afa15801561271e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127429190613cf5565b6040518363ffffffff1660e01b815260040161275f929190613df5565b602060405180830381600087803b15801561277957600080fd5b505af115801561278d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111849190613c6b565b600f54601054604051630c7e663b60e11b815260048101919091523060248201526001600160a01b03909116906318fccc7690604401600060405180830381600087803b15801561280157600080fd5b505af1158015612815573d6000803e3d6000fd5b5050600e546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b15801561285f57600080fd5b505afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128979190613cf5565b9050600a811115612a93576000612710601354836128b59190613f30565b6128bf9190613f0e565b90506000612710601354846128d49190613f30565b6128de9190613f0e565b905081156129ba57600e5460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261291c929116908690600401613df5565b602060405180830381600087803b15801561293657600080fd5b505af115801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190613c6b565b6129ba5760405162461bcd60e51b815260206004820152601a60248201527f61646d696e2066656532207472616e73666572206661696c65640000000000006044820152606401610799565b8015612a9057600e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906129f29033908590600401613df5565b602060405180830381600087803b158015612a0c57600080fd5b505af1158015612a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a449190613c6b565b612a905760405162461bcd60e51b815260206004820152601d60248201527f7265696e766573742066656532207472616e73666572206661696c65640000006044820152606401610799565b50505b600061271060135484612aa69190613f30565b612ab09190613f0e565b90508015612b8c57600d5460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92612aee929116908590600401613df5565b602060405180830381600087803b158015612b0857600080fd5b505af1158015612b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b409190613c6b565b612b8c5760405162461bcd60e51b815260206004820152601960248201527f61646d696e20666565207472616e73666572206661696c6564000000000000006044820152606401610799565b600061271060125485612b9f9190613f30565b612ba99190613f0e565b90508015612c8157600d5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612be39033908590600401613df5565b602060405180830381600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c359190613c6b565b612c815760405162461bcd60e51b815260206004820152601c60248201527f7265696e7665737420666565207472616e73666572206661696c6564000000006044820152606401610799565b6000612ca082612c918588613f4f565b612c9b9190613f4f565b612ff4565b9050612cab81612eab565b80600654612cb99190613ef6565b60068190557fc7606d21ac05cd309191543e409f0845c016120563783d70e4f41419dc0ef23490612ce960025490565b6040805192835260208301919091520160405180910390a15050505050565b60606000612d17836002613f30565b612d22906002613ef6565b67ffffffffffffffff811115612d3a57612d3a614010565b6040519080825280601f01601f191660200182016040528015612d64576020820181803683370190505b509050600360fc1b81600081518110612d7f57612d7f613ffa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dae57612dae613ffa565b60200101906001600160f81b031916908160001a9053506000612dd2846002613f30565b612ddd906001613ef6565b90505b6001811115612e55576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e1157612e11613ffa565b1a60f81b828281518110612e2757612e27613ffa565b60200101906001600160f81b031916908160001a90535060049490941c93612e4e81613f92565b9050612de0565b508315612ea45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610799565b9392505050565b60008111612ecb5760405162461bcd60e51b815260040161079990613e41565b600f54601054604051638dbdbe6d60e01b815260048101919091526001600160801b03831660248201523060448201526001600160a01b0390911690638dbdbe6d90606401611f56565b6001600160a01b038216612f6b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610799565b8060026000828254612f7d9190613ef6565b90915550506001600160a01b03821660009081526020819052604081208054839290612faa908490613ef6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600080613002600284613f0e565b9050600081116130625760405162461bcd60e51b815260206004820152602560248201527f3a3a5f636f6e76657274526577617264546f6b656e73546f4465706f736974546044820152646f6b656e7360d81b6064820152608401610799565b60008061306d613768565b604080516002808252606082018352939550919350600092906020830190803683375050600d5482519293506001600160a01b0316918391506000906130b5576130b5613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561310957600080fd5b505afa15801561311d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131419190613ae3565b8160018151811061315457613154613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528692600092169063d06ca61f906131979085908790600401613e99565b60006040518083038186803b1580156131af57600080fd5b505afa1580156131c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131eb9190810190613ba6565b905080600182516131fc9190613f4f565b8151811061320c5761320c613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed1739906132509089908690889030904290600401613eba565b600060405180830381600087803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132a69190810190613ba6565b506040805160038082526080820190925260009160208201606080368337019050509050836000815181106132dd576132dd613ffa565b6020026020010151816000815181106132f8576132f8613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561334c57600080fd5b505afa158015613360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133849190613ae3565b8160018151811061339757613397613ffa565b6001600160a01b03928316602091820292909201810191909152600a546040805163d21220a760e01b81529051919093169263d21220a7926004808301939192829003018186803b1580156133eb57600080fd5b505afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190613ae3565b8160028151811061343657613436613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528992600092169063d06ca61f906134799085908790600401613e99565b60006040518083038186803b15801561349157600080fd5b505afa1580156134a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134cd9190810190613ba6565b905080600182516134de9190613f4f565b815181106134ee576134ee613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed173990613532908c908690889030904290600401613eba565b600060405180830381600087803b15801561354c57600080fd5b505af1158015613560573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135889190810190613ba6565b50600954600a5460408051630dfe168160e01b815290516000936001600160a01b039081169363e8e3370093911691630dfe168191600480820192602092909190829003018186803b1580156135dd57600080fd5b505afa1580156135f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136159190613ae3565b600a60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369b9190613ae3565b6136a58d8b613ef6565b6136af8d89613ef6565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260006084820181905260a48201523060c48201524260e482015261010401606060405180830381600087803b15801561371e57600080fd5b505af1158015613732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137569190613d0e565b9e9d5050505050505050505050505050565b600e546040516370a0823160e01b81523060048201526000918291600a916001600160a01b0316906370a082319060240160206040518083038186803b1580156137b157600080fd5b505afa1580156137c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e99190613cf5565b1115613abd57600e546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a082319060240160206040518083038186803b15801561383857600080fd5b505afa15801561384c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138709190613cf5565b61387a9190613f0e565b60408051600280825260608201835292935060009290916020830190803683375050600e5482519293506001600160a01b0316918391506000906138c0576138c0613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561391457600080fd5b505afa158015613928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394c9190613ae3565b8160018151811061395f5761395f613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528492600092169063d06ca61f906139a29085908790600401613e99565b60006040518083038186803b1580156139ba57600080fd5b505afa1580156139ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139f69190810190613ba6565b90508060018251613a079190613f4f565b81518110613a1757613a17613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed173990613a5b9087908690889030904290600401613eba565b600060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ab19190810190613ba6565b50929590945092505050565b50600091829150565b600060208284031215613ad857600080fd5b8135612ea481614026565b600060208284031215613af557600080fd5b8151612ea481614026565b60008060408385031215613b1357600080fd5b8235613b1e81614026565b91506020830135613b2e81614026565b809150509250929050565b600080600060608486031215613b4e57600080fd5b8335613b5981614026565b92506020840135613b6981614026565b929592945050506040919091013590565b60008060408385031215613b8d57600080fd5b8235613b9881614026565b946020939093013593505050565b60006020808385031215613bb957600080fd5b825167ffffffffffffffff80821115613bd157600080fd5b818501915085601f830112613be557600080fd5b815181811115613bf757613bf7614010565b8060051b604051601f19603f83011681018181108582111715613c1c57613c1c614010565b604052828152858101935084860182860187018a1015613c3b57600080fd5b600095505b83861015613c5e578051855260019590950194938601938601613c40565b5098975050505050505050565b600060208284031215613c7d57600080fd5b81518015158114612ea457600080fd5b600060208284031215613c9f57600080fd5b5035919050565b60008060408385031215613cb957600080fd5b823591506020830135613b2e81614026565b600060208284031215613cdd57600080fd5b81356001600160e01b031981168114612ea457600080fd5b600060208284031215613d0757600080fd5b5051919050565b600080600060608486031215613d2357600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613d755781516001600160a01b031687529582019590820190600101613d50565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613db8816017850160208801613f66565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613de9816028840160208801613f66565b01602801949350505050565b6001600160a01b03929092168252602082015260400190565b6020815260008251806020840152613e2d816040850160208701613f66565b601f01601f19169190910160400192915050565b6020808252600e908201526d616d6f756e7420746f6f206c6f7760901b604082015260600190565b60208082526016908201527521b0b63632b91034b9903737ba1030b71030b236b4b760511b604082015260600190565b828152604060208201526000613eb26040830184613d3c565b949350505050565b85815284602082015260a060408201526000613ed960a0830186613d3c565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613f0957613f09613fe4565b500190565b600082613f2b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613f4a57613f4a613fe4565b500290565b600082821015613f6157613f61613fe4565b500390565b60005b83811015613f81578181015183820152602001613f69565b83811115611eea5750506000910152565b600081613fa157613fa1613fe4565b506000190190565b600181811c90821680613fbd57607f821691505b60208210811415613fde57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118457600080fdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220aa3007ef15f7c2d78e075ddc32e7a138361f84c703ed0dbb4970a137210bd00264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018417262697320674f484d2f455448204c502053686172657300000000000000000000000000000000000000000000000000000000000000000000000000000012674f484d2f4554482d4c502d5348415245530000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103425760003560e01c806395d89b41116101b8578063d547741f11610104578063eab89a5a116100a2578063f10684541161007c578063f1068454146106f7578063f887ea4014610700578063fbe5323414610713578063fdb5a03e1461072657600080fd5b8063eab89a5a146106be578063edb977b2146106d1578063ee99205c146106e457600080fd5b8063dd62ed3e116100de578063dd62ed3e14610656578063dd8ce4d61461068f578063de53fcd5146106a2578063e20318e1146106b557600080fd5b8063d547741f14610628578063d61a47f11461063b578063dbd9a4d41461064e57600080fd5b8063b9e57b8011610171578063c89039c51161014b578063c89039c5146105dc578063cff1b6ef146105ef578063d21220a714610602578063d33355531461061557600080fd5b8063b9e57b80146105c3578063bd079f55146105cb578063c4b24a46146105d457600080fd5b806395d89b4114610567578063a217fddf1461056f578063a457c2d714610577578063a8ae2b7c1461058a578063a9059cbb1461059d578063b6b55f25146105b057600080fd5b80632f2ff15d1161029257806370a08231116102305780637d8820971161020a5780637d8820971461052f57806381837230146105385780638aff733d1461054b57806391d148541461055457600080fd5b806370a08231146104de57806375b238fc146105075780637ae267731461051c57600080fd5b8063395093511161026c57806339509351146104925780635a8e1b6a146104a55780636e2936ff146104b85780636f28d688146104cb57600080fd5b80632f2ff15d1461045d578063313ce5671461047057806336568abe1461047f57600080fd5b806311451804116102ff578063236aecd5116102d9578063236aecd51461040c57806323b872dd14610414578063248a9ca3146104275780632e1a7d4d1461044a57600080fd5b806311451804146103ee57806313317314146103f757806318160ddd1461040457600080fd5b806301ffc9a71461034757806303f7d9071461036f57806306fdde03146103845780630767711114610399578063095ea7b3146103b05780630dfe1681146103c3575b600080fd5b61035a610355366004613ccb565b61072e565b60405190151581526020015b60405180910390f35b61038261037d366004613c8d565b610765565b005b61038c6107e3565b6040516103669190613e0e565b6103a260135481565b604051908152602001610366565b61035a6103be366004613b7a565b610875565b600b546103d6906001600160a01b031681565b6040516001600160a01b039091168152602001610366565b6103a260165481565b60155461035a9060ff1681565b6002546103a2565b61038261088b565b61035a610422366004613b39565b61090c565b6103a2610435366004613c8d565b60009081526005602052604090206001015490565b610382610458366004613c8d565b6109b6565b61038261046b366004613ca6565b610c43565b60405160128152602001610366565b61038261048d366004613ca6565b610c6e565b61035a6104a0366004613b7a565b610ce8565b6103826104b3366004613c8d565b610d24565b6103826104c6366004613ac6565b610de9565b600d546103d6906001600160a01b031681565b6103a26104ec366004613ac6565b6001600160a01b031660009081526020819052604090205490565b6103a260008051602061403c83398151915281565b61038261052a366004613b00565b610e8b565b6103a260065481565b610382610546366004613c8d565b610f49565b6103a260125481565b61035a610562366004613ca6565b610fbe565b61038c610fe9565b6103a2600081565b61035a610585366004613b7a565b610ff8565b610382610598366004613c8d565b611091565b61035a6105ab366004613b7a565b61116e565b6103826105be366004613c8d565b61117b565b6103a2611187565b6103a260115481565b6103a26111c6565b600a546103d6906001600160a01b031681565b6103826105fd366004613c8d565b6112e5565b600c546103d6906001600160a01b031681565b610382610623366004613c8d565b6113b7565b610382610636366004613ca6565b611476565b600e546103d6906001600160a01b031681565b61038261149c565b6103a2610664366004613b00565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103a261069d366004613c8d565b6119bc565b6007546103d6906001600160a01b031681565b6103a260145481565b6103a26106cc366004613c8d565b6119f6565b6008546103d6906001600160a01b031681565b600f546103d6906001600160a01b031681565b6103a260105481565b6009546103d6906001600160a01b031681565b610382610721366004613ac6565b611a2a565b610382611a80565b60006001600160e01b03198216637965db0b60e01b148061075f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61077d60008051602061403c83398151915233610fbe565b6107a25760405162461bcd60e51b815260040161079990613e69565b60405180910390fd5b60165460408051918252602082018390527fd0f7c999974ac5e720302e1a81f85f0e86835bd50d1cdd4086c839df9c123aab910160405180910390a1601655565b6060600380546107f290613fa9565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613fa9565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b6000610882338484611bfc565b50600192915050565b6108a360008051602061403c83398151915233610fbe565b6108bf5760405162461bcd60e51b815260040161079990613e69565b6015805460ff8082161560ff1990921682179092556040519116151581527fd46852adf64681b12b81a308b01efd0a546667f68ab41ae5855c2bae7756380f9060200160405180910390a1565b6000610919848484611d20565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561099e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610799565b6109ab8533858403611bfc565b506001949350505050565b33600090815260208190526040902054811115610a155760405162461bcd60e51b815260206004820152601f60248201527f696e737566666963656e742062616c616e636520746f207769746864726177006044820152606401610799565b6000610a20826119f6565b90508015610c3f57610a3181611ef0565b60145415610b2c57600061271060145483610a4c9190613f30565b610a569190613f0e565b600a5460075460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92610a8e9216908590600401613df5565b602060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190613c6b565b610b1e5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610799565b610b288183613f4f565b9150505b600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b5e9033908590600401613df5565b602060405180830381600087803b158015610b7857600080fd5b505af1158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190613c6b565b610bee5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610799565b610bf83383611f8b565b80600654610c069190613f4f565b60065560405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25b5050565b600082815260056020526040902060010154610c5f81336120d9565b610c69838361213d565b505050565b6001600160a01b0381163314610cde5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610799565b610c3f82826121c3565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610882918590610d1f908690613ef6565b611bfc565b610d3c60008051602061403c83398151915233610fbe565b610d585760405162461bcd60e51b815260040161079990613e69565b60328110610da85760405162461bcd60e51b815260206004820152601d60248201527f7769746864726177206665652063616e742065786365656420302e35250000006044820152606401610799565b60145460408051918252602082018390527fc8f740efc9743a417853bea994ab415c2814ca81da8cb892208738d64a508377910160405180910390a1601455565b610e0160008051602061403c83398151915233610fbe565b610e1d5760405162461bcd60e51b815260040161079990613e69565b6008546001600160a01b031615610e695760405162461bcd60e51b815260206004820152601060248201526f185c989a48185b1c9958591e481cd95d60821b6044820152606401610799565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b610ea360008051602061403c83398151915233610fbe565b610ebf5760405162461bcd60e51b815260040161079990613e69565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610eee908490600090600401613df5565b602060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190613c6b565b610c3f57600080fd5b610f6160008051602061403c83398151915233610fbe565b610f7d5760405162461bcd60e51b815260040161079990613e69565b60115460408051918252602082018390527f481f79ac3a523b6d6db3c5a720e190e986d1cc1b41adcdf50f9caef849901100910160405180910390a1601155565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546107f290613fa9565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561107a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610799565b6110873385858403611bfc565b5060019392505050565b6110a960008051602061403c83398151915233610fbe565b6110c55760405162461bcd60e51b815260040161079990613e69565b6110d26014612710613f0e565b6013546110df9083613ef6565b111561112d5760405162461bcd60e51b815260206004820152601860248201527f7265696e766573742072657761726420746f6f206869676800000000000000006044820152606401610799565b60125460408051918252602082018390527fe7f97d51d307dc44045597c9978bec0f842e6bb40d19b9444084cfa30d9ed4f2910160405180910390a1601255565b6000610882338484611d20565b6111848161222a565b50565b6000806111926111c6565b905060115481106111be57612710601254826111ae9190613f30565b6111b89190613f0e565b91505090565b600091505090565b600f5460105460405163065509bb60e21b8152600481019190915230602482015260009182916001600160a01b039091169063195426ec9060440160206040518083038186803b15801561121957600080fd5b505afa15801561122d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190613cf5565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190613cf5565b90506112de8183613ef6565b9250505090565b6112fd60008051602061403c83398151915233610fbe565b6113195760405162461bcd60e51b815260040161079990613e69565b6113266014612710613f0e565b6012546113339083613ef6565b11156113765760405162461bcd60e51b81526020600482015260126024820152710c2c8dad2dc40cccaca40e8dede40d0d2ced60731b6044820152606401610799565b60135460408051918252602082018390527f3cc372f330f95ac9540626dc8a25f5bf21ba607215a5d58304cb804d446f104a910160405180910390a1601355565b6113cf60008051602061403c83398151915233610fbe565b6113eb5760405162461bcd60e51b815260040161079990613e69565b6000811161140b5760405162461bcd60e51b815260040161079990613e41565b604051339082156108fc029083906000818181858888f19350505050158015611438573d6000803e3d6000fd5b507f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2860008260405161146b929190613df5565b60405180910390a150565b60008281526005602052604090206001015461149281336120d9565b610c6983836121c3565b6114b460008051602061403c83398151915233610fbe565b6114d05760405162461bcd60e51b815260040161079990613e69565b600a54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561152257600080fd5b505afa158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190613cf5565b6040518363ffffffff1660e01b8152600401611577929190613df5565b602060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613c6b565b50600b54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190613cf5565b6040518363ffffffff1660e01b8152600401611671929190613df5565b602060405180830381600087803b15801561168b57600080fd5b505af115801561169f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c39190613c6b565b50600b54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190613cf5565b6040518363ffffffff1660e01b815260040161176b929190613df5565b602060405180830381600087803b15801561178557600080fd5b505af1158015611799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bd9190613c6b565b50600c54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561181057600080fd5b505afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118489190613cf5565b6040518363ffffffff1660e01b8152600401611865929190613df5565b602060405180830381600087803b15801561187f57600080fd5b505af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b79190613c6b565b50600c54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561190a57600080fd5b505afa15801561191e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119429190613cf5565b6040518363ffffffff1660e01b815260040161195f929190613df5565b602060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b19190613c6b565b506119ba6123ca565b565b60006006546119ca60025490565b6119d49190613f30565b6119dc575090565b6006546002546119ec9084613f30565b61075f9190613f0e565b6000600654611a0460025490565b611a0e9190613f30565b611a1a57506000919050565b6002546006546119ec9084613f30565b611a4260008051602061403c83398151915233610fbe565b611a5e5760405162461bcd60e51b815260040161079990613e69565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b323314611ab95760405162461bcd60e51b81526020600482015260076024820152666f6e6c79454f4160c81b6044820152606401610799565b6000611ac36111c6565b9050601154811015611b105760405162461bcd60e51b815260206004820152601660248201527513525397d513d2d15394d7d513d7d4915253959154d560521b6044820152606401610799565b6008546001600160a01b031615611bf3576008546040516370a0823160e01b81523360048201526803bd913e6c1df40000916001600160a01b0316906370a082319060240160206040518083038186803b158015611b6d57600080fd5b505afa158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba59190613cf5565b1015611bf35760405162461bcd60e51b815260206004820152601860248201527f696e737566666963656e7420415242492062616c616e636500000000000000006044820152606401610799565b611184816127b1565b6001600160a01b038316611c5e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610799565b6001600160a01b038216611cbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610799565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611d845760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610799565b6001600160a01b038216611de65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610799565b6001600160a01b03831660009081526020819052604090205481811015611e5e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610799565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611e95908490613ef6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ee191815260200190565b60405180910390a35b50505050565b60008111611f105760405162461bcd60e51b815260040161079990613e41565b600f54601054604051630ad58d2f60e01b815260048101919091526001600160801b03831660248201523060448201526001600160a01b0390911690630ad58d2f906064015b600060405180830381600087803b158015611f7057600080fd5b505af1158015611f84573d6000803e3d6000fd5b5050505050565b6001600160a01b038216611feb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610799565b6001600160a01b0382166000908152602081905260409020548181101561205f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610799565b6001600160a01b038316600090815260208190526040812083830390556002805484929061208e908490613f4f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6120e38282610fbe565b610c3f576120fb816001600160a01b03166014612d08565b612106836020612d08565b604051602001612117929190613d80565b60408051601f198184030181529082905262461bcd60e51b825261079991600401613e0e565b6121478282610fbe565b610c3f5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561217f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121cd8282610fbe565b15610c3f5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600254600654101561226f5760405162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b6044820152606401610799565b60155460ff161561229a5760006122846111c6565b9050601654811061229857612298816127b1565b505b600a546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156122ec57600080fd5b505af1158015612300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123249190613c6b565b6123665760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c919c9bdb4819985a5b1959606a1b6044820152606401610799565b61236f81612eab565b6123813361237c836119bc565b612f15565b8060065461238f9190613ef6565b60065560405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250565b600d54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613cf5565b6040518363ffffffff1660e01b8152600401612471929190613df5565b602060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c39190613c6b565b50600d54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561251657600080fd5b505afa15801561252a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254e9190613cf5565b6040518363ffffffff1660e01b815260040161256b929190613df5565b602060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190613c6b565b50600e54600f54604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561261057600080fd5b505afa158015612624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126489190613cf5565b6040518363ffffffff1660e01b8152600401612665929190613df5565b602060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b79190613c6b565b50600e54600954604080516318160ddd60e01b815290516001600160a01b039384169363095ea7b393169184916318160ddd91600480820192602092909190829003018186803b15801561270a57600080fd5b505afa15801561271e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127429190613cf5565b6040518363ffffffff1660e01b815260040161275f929190613df5565b602060405180830381600087803b15801561277957600080fd5b505af115801561278d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111849190613c6b565b600f54601054604051630c7e663b60e11b815260048101919091523060248201526001600160a01b03909116906318fccc7690604401600060405180830381600087803b15801561280157600080fd5b505af1158015612815573d6000803e3d6000fd5b5050600e546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b15801561285f57600080fd5b505afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128979190613cf5565b9050600a811115612a93576000612710601354836128b59190613f30565b6128bf9190613f0e565b90506000612710601354846128d49190613f30565b6128de9190613f0e565b905081156129ba57600e5460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261291c929116908690600401613df5565b602060405180830381600087803b15801561293657600080fd5b505af115801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190613c6b565b6129ba5760405162461bcd60e51b815260206004820152601a60248201527f61646d696e2066656532207472616e73666572206661696c65640000000000006044820152606401610799565b8015612a9057600e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906129f29033908590600401613df5565b602060405180830381600087803b158015612a0c57600080fd5b505af1158015612a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a449190613c6b565b612a905760405162461bcd60e51b815260206004820152601d60248201527f7265696e766573742066656532207472616e73666572206661696c65640000006044820152606401610799565b50505b600061271060135484612aa69190613f30565b612ab09190613f0e565b90508015612b8c57600d5460075460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92612aee929116908590600401613df5565b602060405180830381600087803b158015612b0857600080fd5b505af1158015612b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b409190613c6b565b612b8c5760405162461bcd60e51b815260206004820152601960248201527f61646d696e20666565207472616e73666572206661696c6564000000000000006044820152606401610799565b600061271060125485612b9f9190613f30565b612ba99190613f0e565b90508015612c8157600d5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612be39033908590600401613df5565b602060405180830381600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c359190613c6b565b612c815760405162461bcd60e51b815260206004820152601c60248201527f7265696e7665737420666565207472616e73666572206661696c6564000000006044820152606401610799565b6000612ca082612c918588613f4f565b612c9b9190613f4f565b612ff4565b9050612cab81612eab565b80600654612cb99190613ef6565b60068190557fc7606d21ac05cd309191543e409f0845c016120563783d70e4f41419dc0ef23490612ce960025490565b6040805192835260208301919091520160405180910390a15050505050565b60606000612d17836002613f30565b612d22906002613ef6565b67ffffffffffffffff811115612d3a57612d3a614010565b6040519080825280601f01601f191660200182016040528015612d64576020820181803683370190505b509050600360fc1b81600081518110612d7f57612d7f613ffa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dae57612dae613ffa565b60200101906001600160f81b031916908160001a9053506000612dd2846002613f30565b612ddd906001613ef6565b90505b6001811115612e55576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e1157612e11613ffa565b1a60f81b828281518110612e2757612e27613ffa565b60200101906001600160f81b031916908160001a90535060049490941c93612e4e81613f92565b9050612de0565b508315612ea45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610799565b9392505050565b60008111612ecb5760405162461bcd60e51b815260040161079990613e41565b600f54601054604051638dbdbe6d60e01b815260048101919091526001600160801b03831660248201523060448201526001600160a01b0390911690638dbdbe6d90606401611f56565b6001600160a01b038216612f6b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610799565b8060026000828254612f7d9190613ef6565b90915550506001600160a01b03821660009081526020819052604081208054839290612faa908490613ef6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600080613002600284613f0e565b9050600081116130625760405162461bcd60e51b815260206004820152602560248201527f3a3a5f636f6e76657274526577617264546f6b656e73546f4465706f736974546044820152646f6b656e7360d81b6064820152608401610799565b60008061306d613768565b604080516002808252606082018352939550919350600092906020830190803683375050600d5482519293506001600160a01b0316918391506000906130b5576130b5613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561310957600080fd5b505afa15801561311d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131419190613ae3565b8160018151811061315457613154613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528692600092169063d06ca61f906131979085908790600401613e99565b60006040518083038186803b1580156131af57600080fd5b505afa1580156131c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131eb9190810190613ba6565b905080600182516131fc9190613f4f565b8151811061320c5761320c613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed1739906132509089908690889030904290600401613eba565b600060405180830381600087803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132a69190810190613ba6565b506040805160038082526080820190925260009160208201606080368337019050509050836000815181106132dd576132dd613ffa565b6020026020010151816000815181106132f8576132f8613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561334c57600080fd5b505afa158015613360573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133849190613ae3565b8160018151811061339757613397613ffa565b6001600160a01b03928316602091820292909201810191909152600a546040805163d21220a760e01b81529051919093169263d21220a7926004808301939192829003018186803b1580156133eb57600080fd5b505afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190613ae3565b8160028151811061343657613436613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528992600092169063d06ca61f906134799085908790600401613e99565b60006040518083038186803b15801561349157600080fd5b505afa1580156134a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134cd9190810190613ba6565b905080600182516134de9190613f4f565b815181106134ee576134ee613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed173990613532908c908690889030904290600401613eba565b600060405180830381600087803b15801561354c57600080fd5b505af1158015613560573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135889190810190613ba6565b50600954600a5460408051630dfe168160e01b815290516000936001600160a01b039081169363e8e3370093911691630dfe168191600480820192602092909190829003018186803b1580156135dd57600080fd5b505afa1580156135f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136159190613ae3565b600a60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369b9190613ae3565b6136a58d8b613ef6565b6136af8d89613ef6565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260006084820181905260a48201523060c48201524260e482015261010401606060405180830381600087803b15801561371e57600080fd5b505af1158015613732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137569190613d0e565b9e9d5050505050505050505050505050565b600e546040516370a0823160e01b81523060048201526000918291600a916001600160a01b0316906370a082319060240160206040518083038186803b1580156137b157600080fd5b505afa1580156137c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e99190613cf5565b1115613abd57600e546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a082319060240160206040518083038186803b15801561383857600080fd5b505afa15801561384c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138709190613cf5565b61387a9190613f0e565b60408051600280825260608201835292935060009290916020830190803683375050600e5482519293506001600160a01b0316918391506000906138c0576138c0613ffa565b6001600160a01b03928316602091820292909201810191909152600a5460408051630dfe168160e01b815290519190931692630dfe1681926004808301939192829003018186803b15801561391457600080fd5b505afa158015613928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394c9190613ae3565b8160018151811061395f5761395f613ffa565b6001600160a01b03928316602091820292909201015260095460405163d06ca61f60e01b81528492600092169063d06ca61f906139a29085908790600401613e99565b60006040518083038186803b1580156139ba57600080fd5b505afa1580156139ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139f69190810190613ba6565b90508060018251613a079190613f4f565b81518110613a1757613a17613ffa565b60209081029190910101516009546040516338ed173960e01b81529193506001600160a01b0316906338ed173990613a5b9087908690889030904290600401613eba565b600060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ab19190810190613ba6565b50929590945092505050565b50600091829150565b600060208284031215613ad857600080fd5b8135612ea481614026565b600060208284031215613af557600080fd5b8151612ea481614026565b60008060408385031215613b1357600080fd5b8235613b1e81614026565b91506020830135613b2e81614026565b809150509250929050565b600080600060608486031215613b4e57600080fd5b8335613b5981614026565b92506020840135613b6981614026565b929592945050506040919091013590565b60008060408385031215613b8d57600080fd5b8235613b9881614026565b946020939093013593505050565b60006020808385031215613bb957600080fd5b825167ffffffffffffffff80821115613bd157600080fd5b818501915085601f830112613be557600080fd5b815181811115613bf757613bf7614010565b8060051b604051601f19603f83011681018181108582111715613c1c57613c1c614010565b604052828152858101935084860182860187018a1015613c3b57600080fd5b600095505b83861015613c5e578051855260019590950194938601938601613c40565b5098975050505050505050565b600060208284031215613c7d57600080fd5b81518015158114612ea457600080fd5b600060208284031215613c9f57600080fd5b5035919050565b60008060408385031215613cb957600080fd5b823591506020830135613b2e81614026565b600060208284031215613cdd57600080fd5b81356001600160e01b031981168114612ea457600080fd5b600060208284031215613d0757600080fd5b5051919050565b600080600060608486031215613d2357600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613d755781516001600160a01b031687529582019590820190600101613d50565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613db8816017850160208801613f66565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613de9816028840160208801613f66565b01602801949350505050565b6001600160a01b03929092168252602082015260400190565b6020815260008251806020840152613e2d816040850160208701613f66565b601f01601f19169190910160400192915050565b6020808252600e908201526d616d6f756e7420746f6f206c6f7760901b604082015260600190565b60208082526016908201527521b0b63632b91034b9903737ba1030b71030b236b4b760511b604082015260600190565b828152604060208201526000613eb26040830184613d3c565b949350505050565b85815284602082015260a060408201526000613ed960a0830186613d3c565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613f0957613f09613fe4565b500190565b600082613f2b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613f4a57613f4a613fe4565b500290565b600082821015613f6157613f61613fe4565b500390565b60005b83811015613f81578181015183820152602001613f69565b83811115611eea5750506000910152565b600081613fa157613fa1613fe4565b506000190190565b600181811c90821680613fbd57607f821691505b60208210811415613fde57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118457600080fdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220aa3007ef15f7c2d78e075ddc32e7a138361f84c703ed0dbb4970a137210bd00264736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018417262697320674f484d2f455448204c502053686172657300000000000000000000000000000000000000000000000000000000000000000000000000000012674f484d2f4554482d4c502d5348415245530000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Arbis gOHM/ETH LP Shares
Arg [1] : _symbol (string): gOHM/ETH-LP-SHARES
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 417262697320674f484d2f455448204c50205368617265730000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 674f484d2f4554482d4c502d5348415245530000000000000000000000000000
Deployed Bytecode Sourcemap
36339:15509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9858:204;;;;;;:::i;:::-;;:::i;:::-;;;7921:14:1;;7914:22;7896:41;;7884:2;7869:18;9858:204:0;;;;;;;;51298:242;;;;;;:::i;:::-;;:::i;:::-;;19757:100;;;:::i;:::-;;;;;;;:::i;36841:32::-;;;;;;;;;8094:25:1;;;8082:2;8067:18;36841:32:0;7948:177:1;21924:169:0;;;;;;:::i;:::-;;:::i;36556:20::-;;;;;-1:-1:-1;;;;;36556:20:0;;;;;;-1:-1:-1;;;;;6001:32:1;;;5983:51;;5971:2;5956:18;36556:20:0;5837:203:1;37024:54:0;;;;;;36976:43;;;;;;;;;20877:108;20965:12;;20877:108;;50947:223;;;:::i;22575:492::-;;;;;;:::i;:::-;;:::i;11269:123::-;;;;;;:::i;:::-;11335:7;11362:12;;;:6;:12;;;;;:22;;;;11269:123;41496:817;;;;;;:::i;:::-;;:::i;11654:147::-;;;;;;:::i;:::-;;:::i;20719:93::-;;;20802:2;22720:36:1;;22708:2;22693:18;20719:93:0;22578:184:1;12702:218:0;;;;;;:::i;:::-;;:::i;23476:215::-;;;;;;:::i;:::-;;:::i;49819:226::-;;;;;;:::i;:::-;;:::i;38886:193::-;;;;;;:::i;:::-;;:::i;36606:26::-;;;;;-1:-1:-1;;;;;36606:26:0;;;21048:127;;;;;;:::i;:::-;-1:-1:-1;;;;;21149:18:0;21122:7;21149:18;;;;;;;;;;;;21048:127;37694:60;;-1:-1:-1;;;;;;;;;;;37694:60:0;;40421:131;;;;;;:::i;:::-;;:::i;36407:25::-;;;;;;49519:186;;;;;;:::i;:::-;;:::i;36793:37::-;;;;;;10154:139;;;;;;:::i;:::-;;:::i;19976:104::-;;;:::i;9245:49::-;;9290:4;9245:49;;24194:413;;;;;;:::i;:::-;;:::i;50605:262::-;;;;;;:::i;:::-;;:::i;21388:175::-;;;;;;:::i;:::-;;:::i;40675:77::-;;;;;;:::i;:::-;;:::i;43768:262::-;;;:::i;36746:42::-;;;;;;43383:244;;;:::i;36526:25::-;;;;;-1:-1:-1;;;;;36526:25:0;;;50203:238;;;;;;:::i;:::-;;:::i;36581:20::-;;;;;-1:-1:-1;;;;;36581:20:0;;;51659:186;;;;;;:::i;:::-;;:::i;12046:149::-;;;;;;:::i;:::-;;:::i;36644:26::-;;;;;-1:-1:-1;;;;;36644:26:0;;;39455:427;;;:::i;21626:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;21742:18:0;;;21715:7;21742:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21626:151;42595:213;;;;;;:::i;:::-;;:::i;36441:29::-;;;;;-1:-1:-1;;;;;36441:29:0;;;36882:34;;;;;;42968:208;;;;;;:::i;:::-;;:::i;36477:18::-;;;;;-1:-1:-1;;;;;36477:18:0;;;36682:34;;;;;-1:-1:-1;;;;;36682:34:0;;;36721:18;;;;;;36500:21;;;;;-1:-1:-1;;;;;36500:21:0;;;39224:114;;;;;;:::i;:::-;;:::i;44189:392::-;;;:::i;9858:204::-;9943:4;-1:-1:-1;;;;;;9967:47:0;;-1:-1:-1;;;9967:47:0;;:87;;-1:-1:-1;;;;;;;;;;7384:40:0;;;10018:36;9960:94;9858:204;-1:-1:-1;;9858:204:0:o;51298:242::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;;;;;;;;;51431:37:::1;::::0;51392:87:::1;::::0;;21920:25:1;;;21976:2;21961:18;;21954:34;;;51392:87:0::1;::::0;21893:18:1;51392:87:0::1;;;;;;;51486:37;:48:::0;51298:242::o;19757:100::-;19811:13;19844:5;19837:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19757:100;:::o;21924:169::-;22007:4;22024:39;5689:10;22047:7;22056:6;22024:8;:39::i;:::-;-1:-1:-1;22081:4:0;21924:169;;;;:::o;50947:223::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;51054:31:::1;::::0;;::::1;::::0;;::::1;51053:32;-1:-1:-1::0;;51019:66:0;;::::1;::::0;::::1;::::0;;;51097:67:::1;::::0;51132:31;;7921:14:1;7914:22;7896:41;;51097:67:0::1;::::0;7884:2:1;7869:18;51097:67:0::1;;;;;;;50947:223::o:0;22575:492::-;22715:4;22732:36;22742:6;22750:9;22761:6;22732:9;:36::i;:::-;-1:-1:-1;;;;;22808:19:0;;22781:24;22808:19;;;:11;:19;;;;;;;;5689:10;22808:33;;;;;;;;22860:26;;;;22852:79;;;;-1:-1:-1;;;22852:79:0;;14410:2:1;22852:79:0;;;14392:21:1;14449:2;14429:18;;;14422:30;14488:34;14468:18;;;14461:62;-1:-1:-1;;;14539:18:1;;;14532:38;14587:19;;22852:79:0;14208:404:1;22852:79:0;22967:57;22976:6;5689:10;23017:6;22998:16;:25;22967:8;:57::i;:::-;-1:-1:-1;23055:4:0;;22575:492;-1:-1:-1;;;;22575:492:0:o;41496:817::-;41570:10;21122:7;21149:18;;;;;;;;;;;41585:6;-1:-1:-1;41560:31:0;41552:75;;;;-1:-1:-1;;;41552:75:0;;14819:2:1;41552:75:0;;;14801:21:1;14858:2;14838:18;;;14831:30;14897:33;14877:18;;;14870:61;14948:18;;41552:75:0;14617:355:1;41552:75:0;41634:23;41660:33;41686:6;41660:25;:33::i;:::-;41634:59;-1:-1:-1;41704:22:0;;41700:608;;41737:42;41760:18;41737:22;:42::i;:::-;41792:17;;:22;41788:276;;41827:16;36964:5;41868:17;;41847:18;:38;;;;:::i;:::-;41846:55;;;;:::i;:::-;41920:12;;41942:14;;41920:50;;-1:-1:-1;;;41920:50:0;;41827:74;;-1:-1:-1;;;;;;41920:12:0;;;;:21;;:50;;41942:14;;41827:74;;41920:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41912:78;;;;-1:-1:-1;;;41912:78:0;;18880:2:1;41912:78:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:45;18993:18;;41912:78:0;18678:339:1;41912:78:0;42022:32;42043:11;42022:18;:32;:::i;:::-;42001:53;;41816:248;41788:276;42080:12;;:53;;-1:-1:-1;;;42080:53:0;;-1:-1:-1;;;;;42080:12:0;;;;:21;;:53;;42102:10;;42114:18;;42080:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42072:81;;;;-1:-1:-1;;;42072:81:0;;18880:2:1;42072:81:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:45;18993:18;;42072:81:0;18678:339:1;42072:81:0;42162:25;42168:10;42180:6;42162:5;:25::i;:::-;42228:18;42212:13;;:34;;;;:::i;:::-;42196:13;:50;42260:40;;8094:25:1;;;42269:10:0;;42260:40;;8082:2:1;8067:18;42260:40:0;;;;;;;41700:608;41545:768;41496:817;:::o;11654:147::-;11335:7;11362:12;;;:6;:12;;;;;:22;;;9736:30;9747:4;5689:10;9736;:30::i;:::-;11768:25:::1;11779:4;11785:7;11768:10;:25::i;:::-;11654:147:::0;;;:::o;12702:218::-;-1:-1:-1;;;;;12798:23:0;;5689:10;12798:23;12790:83;;;;-1:-1:-1;;;12790:83:0;;19983:2:1;12790:83:0;;;19965:21:1;20022:2;20002:18;;;19995:30;20061:34;20041:18;;;20034:62;-1:-1:-1;;;20112:18:1;;;20105:45;20167:19;;12790:83:0;19781:411:1;12790:83:0;12886:26;12898:4;12904:7;12886:11;:26::i;23476:215::-;5689:10;23564:4;23613:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23613:34:0;;;;;;;;;;23564:4;;23581:80;;23604:7;;23613:47;;23650:10;;23613:47;:::i;:::-;23581:8;:80::i;49819:226::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;49910:2:::1;49899:8;:13;49891:55;;;::::0;-1:-1:-1;;;49891:55:0;;18522:2:1;49891:55:0::1;::::0;::::1;18504:21:1::0;18561:2;18541:18;;;18534:30;18600:31;18580:18;;;18573:59;18649:18;;49891:55:0::1;18320:353:1::0;49891:55:0::1;49976:17;::::0;49958:46:::1;::::0;;21920:25:1;;;21976:2;21961:18;;21954:34;;;49958:46:0::1;::::0;21893:18:1;49958:46:0::1;;;;;;;50011:17;:28:::0;49819:226::o;38886:193::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;38966:4:::1;::::0;-1:-1:-1;;;;;38966:4:0::1;38958:59:::0;38950:88:::1;;;::::0;-1:-1:-1;;;38950:88:0;;13360:2:1;38950:88:0::1;::::0;::::1;13342:21:1::0;13399:2;13379:18;;;13372:30;-1:-1:-1;;;13418:18:1;;;13411:46;13474:18;;38950:88:0::1;13158:340:1::0;38950:88:0::1;39047:4;:26:::0;;-1:-1:-1;;;;;;39047:26:0::1;-1:-1:-1::0;;;;;39047:26:0;;;::::1;::::0;;;::::1;::::0;;38886:193::o;40421:131::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;40512:33:::1;::::0;-1:-1:-1;;;40512:33:0;;-1:-1:-1;;;;;40512:21:0;::::1;::::0;::::1;::::0;:33:::1;::::0;40534:7;;40543:1:::1;::::0;40512:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40504:42;;;::::0;::::1;49519:186:::0;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;49626:22:::1;::::0;49600:59:::1;::::0;;21920:25:1;;;21976:2;21961:18;;21954:34;;;49600:59:0::1;::::0;21893:18:1;49600:59:0::1;;;;;;;49666:22;:33:::0;49519:186::o;10154:139::-;10232:4;10256:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;10256:29:0;;;;;;;;;;;;;;;10154:139::o;19976:104::-;20032:13;20065:7;20058:14;;;;;:::i;24194:413::-;5689:10;24287:4;24331:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24331:34:0;;;;;;;;;;24384:35;;;;24376:85;;;;-1:-1:-1;;;24376:85:0;;19577:2:1;24376:85:0;;;19559:21:1;19616:2;19596:18;;;19589:30;19655:34;19635:18;;;19628:62;-1:-1:-1;;;19706:18:1;;;19699:35;19751:19;;24376:85:0;19375:401:1;24376:85:0;24497:67;5689:10;24520:7;24548:15;24529:16;:34;24497:8;:67::i;:::-;-1:-1:-1;24595:4:0;;24194:413;-1:-1:-1;;;24194:413:0:o;50605:262::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;50713:17:::1;50728:2;36964:5;50713:17;:::i;:::-;50695:14;::::0;50684:25:::1;::::0;:8;:25:::1;:::i;:::-;:46;;50676:83;;;::::0;-1:-1:-1;;;50676:83:0;;19224:2:1;50676:83:0::1;::::0;::::1;19206:21:1::0;19263:2;19243:18;;;19236:30;19302:26;19282:18;;;19275:54;19346:18;;50676:83:0::1;19022:348:1::0;50676:83:0::1;50792:20;::::0;50771:52:::1;::::0;;21920:25:1;;;21976:2;21961:18;;21954:34;;;50771:52:0::1;::::0;21893:18:1;50771:52:0::1;;;;;;;50830:20;:31:::0;50605:262::o;21388:175::-;21474:4;21491:42;5689:10;21515:9;21526:6;21491:9;:42::i;40675:77::-;40730:16;40739:6;40730:8;:16::i;:::-;40675:77;:::o;43768:262::-;43825:4;43838:21;43862:13;:11;:13::i;:::-;43838:37;;43906:22;;43886:16;:42;43882:128;;36964:5;43966:20;;43947:16;:39;;;;:::i;:::-;43946:56;;;;:::i;:::-;43939:63;;;43768:262;:::o;43882:128::-;44023:1;44016:8;;;43768:262;:::o;43383:244::-;43461:15;;43490:3;;43461:48;;-1:-1:-1;;;43461:48:0;;;;;20913:25:1;;;;43503:4:0;20954:18:1;;;20947:60;43427:4:0;;;;-1:-1:-1;;;;;43461:15:0;;;;:28;;20886:18:1;;43461:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43539:12;;:37;;-1:-1:-1;;;43539:37:0;;43570:4;43539:37;;;5983:51:1;43440:69:0;;-1:-1:-1;43516:20:0;;-1:-1:-1;;;;;43539:12:0;;;;:22;;5956:18:1;;43539:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43516:60;-1:-1:-1;43590:31:0;43516:60;43590:13;:31;:::i;:::-;43583:38;;;;43383:244;:::o;50203:238::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;50311:17:::1;50326:2;36964:5;50311:17;:::i;:::-;50287:20;::::0;50276:31:::1;::::0;:8;:31:::1;:::i;:::-;:52;;50268:83;;;::::0;-1:-1:-1;;;50268:83:0;;15929:2:1;50268:83:0::1;::::0;::::1;15911:21:1::0;15968:2;15948:18;;;15941:30;-1:-1:-1;;;15987:18:1;;;15980:48;16045:18;;50268:83:0::1;15727:342:1::0;50268:83:0::1;50378:14;::::0;50363:40:::1;::::0;;21920:25:1;;;21976:2;21961:18;;21954:34;;;50363:40:0::1;::::0;21893:18:1;50363:40:0::1;;;;;;;50410:14;:25:::0;50203:238::o;51659:186::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;51735:1:::1;51726:6;:10;51718:37;;;;-1:-1:-1::0;;;51718:37:0::1;;;;;;;:::i;:::-;51762:36;::::0;51770:10:::1;::::0;51762:36;::::1;;;::::0;51791:6;;51762:36:::1;::::0;;;51791:6;51770:10;51762:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51810:29;51828:1;51832:6;51810:29;;;;;;;:::i;:::-;;;;;;;;51659:186:::0;:::o;12046:149::-;11335:7;11362:12;;;:6;:12;;;;;:22;;;9736:30;9747:4;5689:10;9736;:30::i;:::-;12161:26:::1;12173:4;12179:7;12161:11;:26::i;39455:427::-:0;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;39504:12:::1;::::0;39533:15:::1;::::0;39551:26:::1;::::0;;-1:-1:-1;;;39551:26:0;;;;-1:-1:-1;;;;;39504:12:0;;::::1;::::0;:20:::1;::::0;39533:15:::1;::::0;39504:12;;39551:24:::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;39504:12;39551:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39504:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39591:6:0::1;::::0;39614:15:::1;::::0;39632:20:::1;::::0;;-1:-1:-1;;;39632:20:0;;;;-1:-1:-1;;;;;39591:6:0;;::::1;::::0;:14:::1;::::0;39614:15:::1;::::0;39591:6;;39632:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;39591:6;39632:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39591:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39660:6:0::1;::::0;39683::::1;::::0;39692:20:::1;::::0;;-1:-1:-1;;;39692:20:0;;;;-1:-1:-1;;;;;39660:6:0;;::::1;::::0;:14:::1;::::0;39683:6:::1;::::0;39660;;39692:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;39660:6;39692:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39660:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39726:6:0::1;::::0;39749:15:::1;::::0;39767:20:::1;::::0;;-1:-1:-1;;;39767:20:0;;;;-1:-1:-1;;;;;39726:6:0;;::::1;::::0;:14:::1;::::0;39749:15:::1;::::0;39726:6;;39767:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;39726:6;39767:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39726:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39795:6:0::1;::::0;39818::::1;::::0;39827:20:::1;::::0;;-1:-1:-1;;;39827:20:0;;;;-1:-1:-1;;;;;39795:6:0;;::::1;::::0;:14:::1;::::0;39818:6:::1;::::0;39795;;39827:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;39795:6;39827:20;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39795:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39855:21;:19;:21::i;:::-;39455:427::o:0;42595:213::-;42664:4;42698:13;;42682;20965:12;;;20877:108;42682:13;:29;;;;:::i;:::-;42677:72;;-1:-1:-1;42735:6:0;42595:213::o;42677:72::-;42789:13;;20965:12;;42763:22;;:6;:22;:::i;:::-;42762:40;;;;:::i;42968:208::-;43037:4;43071:13;;43055;20965:12;;;20877:108;43055:13;:29;;;;:::i;:::-;43050:67;;-1:-1:-1;43108:1:0;;42968:208;-1:-1:-1;42968:208:0:o;43050:67::-;20965:12;;43140:13;;43131:22;;:6;:22;:::i;39224:114::-;37795:31;-1:-1:-1;;;;;;;;;;;37815:10:0;37795:7;:31::i;:::-;37787:66;;;;-1:-1:-1;;;37787:66:0;;;;;;;:::i;:::-;39301:14:::1;:31:::0;;-1:-1:-1;;;;;;39301:31:0::1;-1:-1:-1::0;;;;;39301:31:0;;;::::1;::::0;;;::::1;::::0;;39224:114::o;44189:392::-;38823:9;38836:10;38823:23;38815:43;;;;-1:-1:-1;;;38815:43:0;;17844:2:1;38815:43:0;;;17826:21:1;17883:1;17863:18;;;17856:29;-1:-1:-1;;;17901:18:1;;;17894:37;17948:18;;38815:43:0;17642:330:1;38815:43:0;44242:21:::1;44266:13;:11;:13::i;:::-;44242:37;;44314:22;;44294:16;:42;;44286:77;;;::::0;-1:-1:-1;;;44286:77:0;;13705:2:1;44286:77:0::1;::::0;::::1;13687:21:1::0;13744:2;13724:18;;;13717:30;-1:-1:-1;;;13763:18:1;;;13756:52;13825:18;;44286:77:0::1;13503:346:1::0;44286:77:0::1;44383:4;::::0;-1:-1:-1;;;;;44383:4:0::1;44375:59:::0;44371:171:::1;;44455:4;::::0;:26:::1;::::0;-1:-1:-1;;;44455:26:0;;44470:10:::1;44455:26;::::0;::::1;5983:51:1::0;44485:20:0::1;::::0;-1:-1:-1;;;;;44455:4:0::1;::::0;:14:::1;::::0;5956:18:1;;44455:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;44447:87;;;::::0;-1:-1:-1;;;44447:87:0;;12295:2:1;44447:87:0::1;::::0;::::1;12277:21:1::0;12334:2;12314:18;;;12307:30;12373:26;12353:18;;;12346:54;12417:18;;44447:87:0::1;12093:348:1::0;44447:87:0::1;44548:27;44558:16;44548:9;:27::i;27878:380::-:0;-1:-1:-1;;;;;28014:19:0;;28006:68;;;;-1:-1:-1;;;28006:68:0;;17033:2:1;28006:68:0;;;17015:21:1;17072:2;17052:18;;;17045:30;17111:34;17091:18;;;17084:62;-1:-1:-1;;;17162:18:1;;;17155:34;17206:19;;28006:68:0;16831:400:1;28006:68:0;-1:-1:-1;;;;;28093:21:0;;28085:68;;;;-1:-1:-1;;;28085:68:0;;11142:2:1;28085:68:0;;;11124:21:1;11181:2;11161:18;;;11154:30;11220:34;11200:18;;;11193:62;-1:-1:-1;;;11271:18:1;;;11264:32;11313:19;;28085:68:0;10940:398:1;28085:68:0;-1:-1:-1;;;;;28166:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28218:32;;8094:25:1;;;28218:32:0;;8067:18:1;28218:32:0;;;;;;;27878:380;;;:::o;25097:733::-;-1:-1:-1;;;;;25237:20:0;;25229:70;;;;-1:-1:-1;;;25229:70:0;;16276:2:1;25229:70:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;-1:-1:-1;;;16405:18:1;;;16398:35;16450:19;;25229:70:0;16074:401:1;25229:70:0;-1:-1:-1;;;;;25318:23:0;;25310:71;;;;-1:-1:-1;;;25310:71:0;;9977:2:1;25310:71:0;;;9959:21:1;10016:2;9996:18;;;9989:30;10055:34;10035:18;;;10028:62;-1:-1:-1;;;10106:18:1;;;10099:33;10149:19;;25310:71:0;9775:399:1;25310:71:0;-1:-1:-1;;;;;25478:17:0;;25454:21;25478:17;;;;;;;;;;;25514:23;;;;25506:74;;;;-1:-1:-1;;;25506:74:0;;11545:2:1;25506:74:0;;;11527:21:1;11584:2;11564:18;;;11557:30;11623:34;11603:18;;;11596:62;-1:-1:-1;;;11674:18:1;;;11667:36;11720:19;;25506:74:0;11343:402:1;25506:74:0;-1:-1:-1;;;;;25616:17:0;;;:9;:17;;;;;;;;;;;25636:22;;;25616:42;;25680:20;;;;;;;;:30;;25652:6;;25616:9;25680:30;;25652:6;;25680:30;:::i;:::-;;;;;;;;25745:9;-1:-1:-1;;;;;25728:35:0;25737:6;-1:-1:-1;;;;;25728:35:0;;25756:6;25728:35;;;;8094:25:1;;8082:2;8067:18;;7948:177;25728:35:0;;;;;;;;25776:46;25218:612;25097:733;;;:::o;49215:172::-;49293:1;49284:6;:10;49276:37;;;;-1:-1:-1;;;49276:37:0;;;;;;;:::i;:::-;49320:15;;49345:3;;49320:61;;-1:-1:-1;;;49320:61:0;;;;;21557:25:1;;;;-1:-1:-1;;;;;21618:47:1;;21598:18;;;21591:75;49375:4:0;21682:18:1;;;21675:60;-1:-1:-1;;;;;49320:15:0;;;;:24;;21530:18:1;;49320:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49215:172;:::o;26849:591::-;-1:-1:-1;;;;;26933:21:0;;26925:67;;;;-1:-1:-1;;;26925:67:0;;15527:2:1;26925:67:0;;;15509:21:1;15566:2;15546:18;;;15539:30;15605:34;15585:18;;;15578:62;-1:-1:-1;;;15656:18:1;;;15649:31;15697:19;;26925:67:0;15325:397:1;26925:67:0;-1:-1:-1;;;;;27092:18:0;;27067:22;27092:18;;;;;;;;;;;27129:24;;;;27121:71;;;;-1:-1:-1;;;27121:71:0;;10381:2:1;27121:71:0;;;10363:21:1;10420:2;10400:18;;;10393:30;10459:34;10439:18;;;10432:62;-1:-1:-1;;;10510:18:1;;;10503:32;10552:19;;27121:71:0;10179:398:1;27121:71:0;-1:-1:-1;;;;;27228:18:0;;:9;:18;;;;;;;;;;27249:23;;;27228:44;;27294:12;:22;;27266:6;;27228:9;27294:22;;27266:6;;27294:22;:::i;:::-;;;;-1:-1:-1;;27334:37:0;;8094:25:1;;;27360:1:0;;-1:-1:-1;;;;;27334:37:0;;;;;8082:2:1;8067:18;27334:37:0;;;;;;;11654:147;;;:::o;10583:497::-;10664:22;10672:4;10678:7;10664;:22::i;:::-;10659:414;;10852:41;10880:7;-1:-1:-1;;;;;10852:41:0;10890:2;10852:19;:41::i;:::-;10966:38;10994:4;11001:2;10966:19;:38::i;:::-;10757:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10757:270:0;;;;;;;;;;-1:-1:-1;;;10703:358:0;;;;;;;:::i;14006:229::-;14081:22;14089:4;14095:7;14081;:22::i;:::-;14076:152;;14120:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14120:29:0;;;;;;;;;:36;;-1:-1:-1;;14120:36:0;14152:4;14120:36;;;14203:12;5689:10;;5609:98;14203:12;-1:-1:-1;;;;;14176:40:0;14194:7;-1:-1:-1;;;;;14176:40:0;14188:4;14176:40;;;;;;;;;;14006:229;;:::o;14243:230::-;14318:22;14326:4;14332:7;14318;:22::i;:::-;14314:152;;;14389:5;14357:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14357:29:0;;;;;;;;;;:37;;-1:-1:-1;;14357:37:0;;;14414:40;5689:10;;14357:12;;14414:40;;14389:5;14414:40;14243:230;;:::o;40758:602::-;20965:12;;40813:13;;:30;;40805:57;;;;-1:-1:-1;;;40805:57:0;;18179:2:1;40805:57:0;;;18161:21:1;18218:2;18198:18;;;18191:30;-1:-1:-1;;;18237:18:1;;;18230:44;18291:18;;40805:57:0;17977:338:1;40805:57:0;40873:31;;;;40869:210;;;40915:21;40939:13;:11;:13::i;:::-;40915:37;;40985;;40965:16;:57;40961:111;;41035:27;41045:16;41035:9;:27::i;:::-;40906:173;40869:210;41093:12;;:60;;-1:-1:-1;;;41093:60:0;;41119:10;41093:60;;;6285:34:1;41139:4:0;6335:18:1;;;6328:43;6387:18;;;6380:34;;;-1:-1:-1;;;;;41093:12:0;;;;:25;;6220:18:1;;41093:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41085:92;;;;-1:-1:-1;;;41085:92:0;;15179:2:1;41085:92:0;;;15161:21:1;15218:2;15198:18;;;15191:30;-1:-1:-1;;;15237:18:1;;;15230:49;15296:18;;41085:92:0;14977:343:1;41085:92:0;41184:27;41204:6;41184:19;:27::i;:::-;41218:52;41224:10;41236:33;41262:6;41236:25;:33::i;:::-;41218:5;:52::i;:::-;41309:6;41293:13;;:22;;;;:::i;:::-;41277:13;:38;41327:27;;8094:25:1;;;41335:10:0;;41327:27;;8082:2:1;8067:18;41327:27:0;;;;;;;40758:602;:::o;39890:365::-;39944:12;;39973:15;;39991:26;;;-1:-1:-1;;;39991:26:0;;;;-1:-1:-1;;;;;39944:12:0;;;;:20;;39973:15;;39944:12;;39991:24;;:26;;;;;;;;;;;;;;;39944:12;39991:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39944:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40025:12:0;;40054:6;;40063:26;;;-1:-1:-1;;;40063:26:0;;;;-1:-1:-1;;;;;40025:12:0;;;;:20;;40054:6;;40025:12;;40063:24;;:26;;;;;;;;;;;;;;;40025:12;40063:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40025:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40103:12:0;;40132:15;;40150:26;;;-1:-1:-1;;;40150:26:0;;;;-1:-1:-1;;;;;40103:12:0;;;;:20;;40132:15;;40103:12;;40150:24;;:26;;;;;;;;;;;;;;;40103:12;40150:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40103:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40184:12:0;;40213:6;;40222:26;;;-1:-1:-1;;;40222:26:0;;;;-1:-1:-1;;;;;40184:12:0;;;;:20;;40213:6;;40184:12;;40222:24;;:26;;;;;;;;;;;;;;;40184:12;40222:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40184:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44749:1321::-;44797:15;;44821:3;;44797:43;;-1:-1:-1;;;44797:43:0;;;;;20913:25:1;;;;44834:4:0;20954:18:1;;;20947:60;-1:-1:-1;;;;;44797:15:0;;;;:23;;20886:18:1;;44797:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44876:12:0;;:37;;-1:-1:-1;;;44876:37:0;;44907:4;44876:37;;;5983:51:1;44853:19:0;;-1:-1:-1;;;;;;44876:12:0;;;;-1:-1:-1;44876:22:0;;5956:18:1;;44876:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44853:61;;44939:2;44925:11;:16;44921:500;;;44954:21;36964:5;44993:14;;44979:11;:28;;;;:::i;:::-;44978:45;;;;:::i;:::-;44954:69;;45034:24;36964:5;45076:14;;45062:11;:28;;;;:::i;:::-;45061:45;;;;:::i;:::-;45034:72;-1:-1:-1;45121:17:0;;45117:141;;45163:12;;45185:14;;45163:52;;-1:-1:-1;;;45163:52:0;;-1:-1:-1;;;;;45163:12:0;;;;:21;;:52;;45185:14;;;45201:13;;45163:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45155:91;;;;-1:-1:-1;;;45155:91:0;;12648:2:1;45155:91:0;;;12630:21:1;12687:2;12667:18;;;12660:30;12726:28;12706:18;;;12699:56;12772:18;;45155:91:0;12446:350:1;45155:91:0;45272:20;;45268:146;;45317:12;;:51;;-1:-1:-1;;;45317:51:0;;-1:-1:-1;;;;;45317:12:0;;;;:21;;:51;;45339:10;;45351:16;;45317:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45309:93;;;;-1:-1:-1;;;45309:93:0;;10784:2:1;45309:93:0;;;10766:21:1;10823:2;10803:18;;;10796:30;10862:31;10842:18;;;10835:59;10911:18;;45309:93:0;10582:353:1;45309:93:0;44943:478;;44921:500;45429:13;36964:5;45455:14;;45446:6;:23;;;;:::i;:::-;45445:40;;;;:::i;:::-;45429:56;-1:-1:-1;45496:12:0;;45492:121;;45527:12;;45549:14;;45527:47;;-1:-1:-1;;;45527:47:0;;-1:-1:-1;;;;;45527:12:0;;;;:21;;:47;;45549:14;;;45565:8;;45527:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45519:85;;;;-1:-1:-1;;;45519:85:0;;14056:2:1;45519:85:0;;;14038:21:1;14095:2;14075:18;;;14068:30;14134:27;14114:18;;;14107:55;14179:18;;45519:85:0;13854:349:1;45519:85:0;45621:16;36964:5;45650:20;;45641:6;:29;;;;:::i;:::-;45640:46;;;;:::i;:::-;45621:65;-1:-1:-1;45697:15:0;;45693:125;;45731:12;;:46;;-1:-1:-1;;;45731:46:0;;-1:-1:-1;;;;;45731:12:0;;;;:21;;:46;;45753:10;;45765:11;;45731:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45723:87;;;;-1:-1:-1;;;45723:87:0;;13003:2:1;45723:87:0;;;12985:21:1;13042:2;13022:18;;;13015:30;13081;13061:18;;;13054:58;13129:18;;45723:87:0;12801:352:1;45723:87:0;45826:18;45847:70;45905:11;45884:17;45893:8;45884:6;:17;:::i;:::-;45883:33;;;;:::i;:::-;45847:35;:70::i;:::-;45826:91;;45926:34;45946:13;45926:19;:34::i;:::-;45999:13;45983;;:29;;;;:::i;:::-;45967:13;:45;;;46026:38;;46050:13;20965:12;;;20877:108;46050:13;46026:38;;;21920:25:1;;;21976:2;21961:18;;21954:34;;;;21893:18;46026:38:0;;;;;;;44790:1280;;;;44749:1321;:::o;4613:451::-;4688:13;4714:19;4746:10;4750:6;4746:1;:10;:::i;:::-;:14;;4759:1;4746:14;:::i;:::-;4736:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4736:25:0;;4714:47;;-1:-1:-1;;;4772:6:0;4779:1;4772:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4772:15:0;;;;;;;;;-1:-1:-1;;;4798:6:0;4805:1;4798:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4798:15:0;;;;;;;;-1:-1:-1;4829:9:0;4841:10;4845:6;4841:1;:10;:::i;:::-;:14;;4854:1;4841:14;:::i;:::-;4829:26;;4824:135;4861:1;4857;:5;4824:135;;;-1:-1:-1;;;4909:5:0;4917:3;4909:11;4896:25;;;;;;;:::i;:::-;;;;4884:6;4891:1;4884:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4884:37:0;;;;;;;;-1:-1:-1;4946:1:0;4936:11;;;;;4864:3;;;:::i;:::-;;;4824:135;;;-1:-1:-1;4977:10:0;;4969:55;;;;-1:-1:-1;;;4969:55:0;;9616:2:1;4969:55:0;;;9598:21:1;;;9635:18;;;9628:30;9694:34;9674:18;;;9667:62;9746:18;;4969:55:0;9414:356:1;4969:55:0;5049:6;4613:451;-1:-1:-1;;;4613:451:0:o;48810:168::-;48885:1;48876:6;:10;48868:37;;;;-1:-1:-1;;;48868:37:0;;;;;;;:::i;:::-;48912:15;;48936:3;;48912:60;;-1:-1:-1;;;48912:60:0;;;;;21557:25:1;;;;-1:-1:-1;;;;;21618:47:1;;21598:18;;;21591:75;48966:4:0;21682:18:1;;;21675:60;-1:-1:-1;;;;;48912:15:0;;;;:23;;21530:18:1;;48912:60:0;21355:386:1;26117:399:0;-1:-1:-1;;;;;26201:21:0;;26193:65;;;;-1:-1:-1;;;26193:65:0;;20399:2:1;26193:65:0;;;20381:21:1;20438:2;20418:18;;;20411:30;20477:33;20457:18;;;20450:61;20528:18;;26193:65:0;20197:355:1;26193:65:0;26349:6;26333:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;26366:18:0;;:9;:18;;;;;;;;;;:28;;26388:6;;26366:9;:28;;26388:6;;26366:28;:::i;:::-;;;;-1:-1:-1;;26410:37:0;;8094:25:1;;;-1:-1:-1;;;;;26410:37:0;;;26427:1;;26410:37;;8082:2:1;8067:18;26410:37:0;;;;;;;41545:768;41496:817;:::o;46264:1631::-;46339:4;;46368:10;46377:1;46368:6;:10;:::i;:::-;46352:26;;46404:1;46393:8;:12;46385:62;;;;-1:-1:-1;;;46385:62:0;;17438:2:1;46385:62:0;;;17420:21:1;17477:2;17457:18;;;17450:30;17516:34;17496:18;;;17489:62;-1:-1:-1;;;17567:18:1;;;17560:35;17612:19;;46385:62:0;17236:401:1;46385:62:0;46529:21;46552;46577:14;:12;:14::i;:::-;46662:16;;;46676:1;46662:16;;;;;;;;46528:63;;-1:-1:-1;46528:63:0;;-1:-1:-1;46637:22:0;;46676:1;46662:16;;;;;;;;-1:-1:-1;;46704:12:0;;46685:8;;;;-1:-1:-1;;;;;;46704:12:0;;46685:8;;-1:-1:-1;46704:12:0;;46685:8;;;;:::i;:::-;-1:-1:-1;;;;;46685:32:0;;;:8;;;;;;;;;;:32;;;;46735:12;;:21;;;-1:-1:-1;;;46735:21:0;;;;:12;;;;;:19;;:21;;;;;46685:8;;46735:21;;;;;:12;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46724:5;46730:1;46724:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46724:32:0;;;:8;;;;;;;;;:32;46842:6;;:37;;-1:-1:-1;;;46842:37:0;;46794:8;;46771:20;;46842:6;;:20;;:37;;46794:8;;46873:5;;46842:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46842:37:0;;;;;;;;;;;;:::i;:::-;46809:70;;46904:16;46947:1;46921:16;:23;:27;;;;:::i;:::-;46904:45;;;;;;;;:::i;:::-;;;;;;;;;;;46956:6;;:97;;-1:-1:-1;;;46956:97:0;;46904:45;;-1:-1:-1;;;;;;46956:6:0;;:31;;:97;;46988:8;;46904:45;;47015:5;;47030:4;;47037:15;;46956:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46956:97:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47134:16:0;;;47148:1;47134:16;;;;;;;;;47109:22;;47134:16;;;;;;;;;;-1:-1:-1;47134:16:0;47109:41;;47168:5;47174:1;47168:8;;;;;;;;:::i;:::-;;;;;;;47157:5;47163:1;47157:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47157:19:0;;;:8;;;;;;;;;;:19;;;;47208:12;;47194:37;;;-1:-1:-1;;;47194:37:0;;;;47208:12;;;;;47194:35;;:37;;;;;47157:8;;47194:37;;;;;47208:12;47194:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47183:5;47189:1;47183:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47183:48:0;;;:8;;;;;;;;;;:48;;;;47269:12;;47255:37;;;-1:-1:-1;;;47255:37:0;;;;47269:12;;;;;47255:35;;:37;;;;;47183:8;;47255:37;;;;;47269:12;47255:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47244:5;47250:1;47244:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47244:48:0;;;:8;;;;;;;;;:48;47378:6;;:37;;-1:-1:-1;;;47378:37:0;;47330:8;;47307:20;;47378:6;;:20;;:37;;47330:8;;47409:5;;47378:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47378:37:0;;;;;;;;;;;;:::i;:::-;47345:70;;47440:16;47483:1;47457:16;:23;:27;;;;:::i;:::-;47440:45;;;;;;;;:::i;:::-;;;;;;;;;;;47492:6;;:97;;-1:-1:-1;;;47492:97:0;;47440:45;;-1:-1:-1;;;;;;47492:6:0;;:31;;:97;;47524:8;;47440:45;;47551:5;;47566:4;;47573:15;;47492:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47492:97:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47625:6:0;;47667:12;;47653:37;;;-1:-1:-1;;;47653:37:0;;;;47607:14;;-1:-1:-1;;;;;47625:6:0;;;;:19;;47667:12;;;47653:35;;:37;;;;;;;;;;;;;;;47667:12;47653:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47706:12;;;;;;;;;-1:-1:-1;;;;;47706:12:0;-1:-1:-1;;;;;47692:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47738:29;47754:13;47738:15;:29;:::i;:::-;47769;47785:13;47769:15;:29;:::i;:::-;47625:239;;-1:-1:-1;;;;;;47625:239:0;;;;;;;-1:-1:-1;;;;;6840:15:1;;;47625:239:0;;;6822:34:1;6892:15;;;;6872:18;;;6865:43;6924:18;;;6917:34;6967:18;;;6960:34;47807:1:0;7010:19:1;;;7003:35;;;7054:19;;;7047:35;47828:4:0;7098:19:1;;;7091:44;47842:15:0;7151:19:1;;;7144:35;6756:19;;47625:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47604:260;46264:1631;-1:-1:-1;;;;;;;;;;;;;;46264:1631:0:o;47920:770::-;47991:12;;:37;;-1:-1:-1;;;47991:37:0;;48022:4;47991:37;;;5983:51:1;47962:7:0;;;;48031:2;;-1:-1:-1;;;;;47991:12:0;;:22;;5956:18:1;;47991:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;47987:698;;;48061:12;;:37;;-1:-1:-1;;;48061:37:0;;48092:4;48061:37;;;5983:51:1;48044:14:0;;48101:1;;-1:-1:-1;;;;;48061:12:0;;;;:22;;5956:18:1;;48061:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;48177:16;;;48191:1;48177:16;;;;;;;;48044:58;;-1:-1:-1;48152:22:0;;48177:16;;;;;;;;;;-1:-1:-1;;48221:12:0;;48202:8;;;;-1:-1:-1;;;;;;48221:12:0;;48202:8;;-1:-1:-1;48221:12:0;;48202:8;;;;:::i;:::-;-1:-1:-1;;;;;48202:32:0;;;:8;;;;;;;;;;:32;;;;48260:12;;:21;;;-1:-1:-1;;;48260:21:0;;;;:12;;;;;:19;;:21;;;;;48202:8;;48260:21;;;;;:12;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48249:5;48255:1;48249:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48249:32:0;;;:8;;;;;;;;;:32;48376:6;;:38;;-1:-1:-1;;;48376:38:0;;48325:9;;48298:24;;48376:6;;:20;;:38;;48325:9;;48408:5;;48376:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48376:38:0;;;;;;;;;;;;:::i;:::-;48343:71;;48442:16;48485:1;48459:16;:23;:27;;;;:::i;:::-;48442:45;;;;;;;;:::i;:::-;;;;;;;;;;;48496:6;;:99;;-1:-1:-1;;;48496:99:0;;48442:45;;-1:-1:-1;;;;;;48496:6:0;;:31;;:99;;48528:9;;48442:45;;48557:5;;48572:4;;48579:15;;48496:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48496:99:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;48614:9:0;;48625:16;;-1:-1:-1;47920:770:0;-1:-1:-1;;;47920:770:0:o;47987:698::-;-1:-1:-1;48673:1:0;;;;-1:-1:-1;47920:770:0:o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:1116::-;1791:6;1822:2;1865;1853:9;1844:7;1840:23;1836:32;1833:52;;;1881:1;1878;1871:12;1833:52;1914:9;1908:16;1943:18;1984:2;1976:6;1973:14;1970:34;;;2000:1;1997;1990:12;1970:34;2038:6;2027:9;2023:22;2013:32;;2083:7;2076:4;2072:2;2068:13;2064:27;2054:55;;2105:1;2102;2095:12;2054:55;2134:2;2128:9;2156:2;2152;2149:10;2146:36;;;2162:18;;:::i;:::-;2208:2;2205:1;2201:10;2240:2;2234:9;2303:2;2299:7;2294:2;2290;2286:11;2282:25;2274:6;2270:38;2358:6;2346:10;2343:22;2338:2;2326:10;2323:18;2320:46;2317:72;;;2369:18;;:::i;:::-;2405:2;2398:22;2455:18;;;2489:15;;;;-1:-1:-1;2524:11:1;;;2554;;;2550:20;;2547:33;-1:-1:-1;2544:53:1;;;2593:1;2590;2583:12;2544:53;2615:1;2606:10;;2625:156;2639:2;2636:1;2633:9;2625:156;;;2696:10;;2684:23;;2657:1;2650:9;;;;;2727:12;;;;2759;;2625:156;;;-1:-1:-1;2800:6:1;1696:1116;-1:-1:-1;;;;;;;;1696:1116:1:o;2817:277::-;2884:6;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2985:9;2979:16;3038:5;3031:13;3024:21;3017:5;3014:32;3004:60;;3060:1;3057;3050:12;3099:180;3158:6;3211:2;3199:9;3190:7;3186:23;3182:32;3179:52;;;3227:1;3224;3217:12;3179:52;-1:-1:-1;3250:23:1;;3099:180;-1:-1:-1;3099:180:1:o;3284:315::-;3352:6;3360;3413:2;3401:9;3392:7;3388:23;3384:32;3381:52;;;3429:1;3426;3419:12;3381:52;3465:9;3452:23;3442:33;;3525:2;3514:9;3510:18;3497:32;3538:31;3563:5;3538:31;:::i;3604:286::-;3662:6;3715:2;3703:9;3694:7;3690:23;3686:32;3683:52;;;3731:1;3728;3721:12;3683:52;3757:23;;-1:-1:-1;;;;;;3809:32:1;;3799:43;;3789:71;;3856:1;3853;3846:12;4080:184;4150:6;4203:2;4191:9;4182:7;4178:23;4174:32;4171:52;;;4219:1;4216;4209:12;4171:52;-1:-1:-1;4242:16:1;;4080:184;-1:-1:-1;4080:184:1:o;4269:306::-;4357:6;4365;4373;4426:2;4414:9;4405:7;4401:23;4397:32;4394:52;;;4442:1;4439;4432:12;4394:52;4471:9;4465:16;4455:26;;4521:2;4510:9;4506:18;4500:25;4490:35;;4565:2;4554:9;4550:18;4544:25;4534:35;;4269:306;;;;;:::o;4580:461::-;4633:3;4671:5;4665:12;4698:6;4693:3;4686:19;4724:4;4753:2;4748:3;4744:12;4737:19;;4790:2;4783:5;4779:14;4811:1;4821:195;4835:6;4832:1;4829:13;4821:195;;;4900:13;;-1:-1:-1;;;;;4896:39:1;4884:52;;4956:12;;;;4991:15;;;;4932:1;4850:9;4821:195;;;-1:-1:-1;5032:3:1;;4580:461;-1:-1:-1;;;;;4580:461:1:o;5046:786::-;5457:25;5452:3;5445:38;5427:3;5512:6;5506:13;5528:62;5583:6;5578:2;5573:3;5569:12;5562:4;5554:6;5550:17;5528:62;:::i;:::-;-1:-1:-1;;;5649:2:1;5609:16;;;5641:11;;;5634:40;5699:13;;5721:63;5699:13;5770:2;5762:11;;5755:4;5743:17;;5721:63;:::i;:::-;5804:17;5823:2;5800:26;;5046:786;-1:-1:-1;;;;5046:786:1:o;7190:282::-;-1:-1:-1;;;;;7390:32:1;;;;7372:51;;7454:2;7439:18;;7432:34;7360:2;7345:18;;7190:282::o;9026:383::-;9175:2;9164:9;9157:21;9138:4;9207:6;9201:13;9250:6;9245:2;9234:9;9230:18;9223:34;9266:66;9325:6;9320:2;9309:9;9305:18;9300:2;9292:6;9288:15;9266:66;:::i;:::-;9393:2;9372:15;-1:-1:-1;;9368:29:1;9353:45;;;;9400:2;9349:54;;9026:383;-1:-1:-1;;9026:383:1:o;11750:338::-;11952:2;11934:21;;;11991:2;11971:18;;;11964:30;-1:-1:-1;;;12025:2:1;12010:18;;12003:44;12079:2;12064:18;;11750:338::o;16480:346::-;16682:2;16664:21;;;16721:2;16701:18;;;16694:30;-1:-1:-1;;;16755:2:1;16740:18;;16733:52;16817:2;16802:18;;16480:346::o;21018:332::-;21225:6;21214:9;21207:25;21268:2;21263;21252:9;21248:18;21241:30;21188:4;21288:56;21340:2;21329:9;21325:18;21317:6;21288:56;:::i;:::-;21280:64;21018:332;-1:-1:-1;;;;21018:332:1:o;21999:574::-;22290:6;22279:9;22272:25;22333:6;22328:2;22317:9;22313:18;22306:34;22376:3;22371:2;22360:9;22356:18;22349:31;22253:4;22397:57;22449:3;22438:9;22434:19;22426:6;22397:57;:::i;:::-;-1:-1:-1;;;;;22490:32:1;;;;22485:2;22470:18;;22463:60;-1:-1:-1;22554:3:1;22539:19;22532:35;22389:65;21999:574;-1:-1:-1;;;21999:574:1:o;22767:128::-;22807:3;22838:1;22834:6;22831:1;22828:13;22825:39;;;22844:18;;:::i;:::-;-1:-1:-1;22880:9:1;;22767:128::o;22900:217::-;22940:1;22966;22956:132;;23010:10;23005:3;23001:20;22998:1;22991:31;23045:4;23042:1;23035:15;23073:4;23070:1;23063:15;22956:132;-1:-1:-1;23102:9:1;;22900:217::o;23122:168::-;23162:7;23228:1;23224;23220:6;23216:14;23213:1;23210:21;23205:1;23198:9;23191:17;23187:45;23184:71;;;23235:18;;:::i;:::-;-1:-1:-1;23275:9:1;;23122:168::o;23295:125::-;23335:4;23363:1;23360;23357:8;23354:34;;;23368:18;;:::i;:::-;-1:-1:-1;23405:9:1;;23295:125::o;23425:258::-;23497:1;23507:113;23521:6;23518:1;23515:13;23507:113;;;23597:11;;;23591:18;23578:11;;;23571:39;23543:2;23536:10;23507:113;;;23638:6;23635:1;23632:13;23629:48;;;-1:-1:-1;;23673:1:1;23655:16;;23648:27;23425:258::o;23688:136::-;23727:3;23755:5;23745:39;;23764:18;;:::i;:::-;-1:-1:-1;;;23800:18:1;;23688:136::o;23829:380::-;23908:1;23904:12;;;;23951;;;23972:61;;24026:4;24018:6;24014:17;24004:27;;23972:61;24079:2;24071:6;24068:14;24048:18;24045:38;24042:161;;;24125:10;24120:3;24116:20;24113:1;24106:31;24160:4;24157:1;24150:15;24188:4;24185:1;24178:15;24042:161;;23829:380;;;:::o;24214:127::-;24275:10;24270:3;24266:20;24263:1;24256:31;24306:4;24303:1;24296:15;24330:4;24327:1;24320:15;24346:127;24407:10;24402:3;24398:20;24395:1;24388:31;24438:4;24435:1;24428:15;24462:4;24459:1;24452:15;24478:127;24539:10;24534:3;24530:20;24527:1;24520:31;24570:4;24567:1;24560:15;24594:4;24591:1;24584:15;24610:131;-1:-1:-1;;;;;24685:31:1;;24675:42;;24665:70;;24731:1;24728;24721:12
Swarm Source
ipfs://aa3007ef15f7c2d78e075ddc32e7a138361f84c703ed0dbb4970a137210bd002
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$2,234.48
Net Worth in ETH
0.953132
Token Allocations
WETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | $2,338.95 | 0.9553 | $2,234.48 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.