Latest 25 from a total of 855 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 388544852 | 55 days ago | IN | 0 ETH | 0.00000128 | ||||
| Withdraw | 386724376 | 60 days ago | IN | 0 ETH | 0.00000148 | ||||
| Withdraw | 386723849 | 60 days ago | IN | 0 ETH | 0.00000172 | ||||
| Withdraw | 378989984 | 82 days ago | IN | 0 ETH | 0.00000111 | ||||
| Get Reward | 378989668 | 82 days ago | IN | 0 ETH | 0.00000109 | ||||
| Withdraw | 374238360 | 96 days ago | IN | 0 ETH | 0.00000126 | ||||
| Withdraw | 367999809 | 114 days ago | IN | 0 ETH | 0.00000267 | ||||
| Withdraw | 367999782 | 114 days ago | IN | 0 ETH | 0.00000348 | ||||
| Withdraw | 367979567 | 114 days ago | IN | 0 ETH | 0.00000087 | ||||
| Withdraw | 367979533 | 114 days ago | IN | 0 ETH | 0.00000138 | ||||
| Withdraw | 367135889 | 116 days ago | IN | 0 ETH | 0.00000137 | ||||
| Withdraw | 346098440 | 177 days ago | IN | 0 ETH | 0.0000013 | ||||
| Withdraw | 325125598 | 238 days ago | IN | 0 ETH | 0.00000162 | ||||
| Withdraw | 320459511 | 252 days ago | IN | 0 ETH | 0.00000189 | ||||
| Withdraw | 282545076 | 362 days ago | IN | 0 ETH | 0.00000171 | ||||
| Withdraw | 282491161 | 362 days ago | IN | 0 ETH | 0.00000241 | ||||
| Withdraw | 280009608 | 370 days ago | IN | 0 ETH | 0.00000212 | ||||
| Withdraw | 267243815 | 407 days ago | IN | 0 ETH | 0.00000223 | ||||
| Withdraw | 263297839 | 418 days ago | IN | 0 ETH | 0.00000153 | ||||
| Withdraw | 235635888 | 499 days ago | IN | 0 ETH | 0.00000138 | ||||
| Withdraw | 227585611 | 522 days ago | IN | 0 ETH | 0.0000015 | ||||
| Stake | 227414379 | 523 days ago | IN | 0 ETH | 0.00000205 | ||||
| Withdraw | 225247802 | 529 days ago | IN | 0 ETH | 0.00000179 | ||||
| Withdraw | 223946380 | 533 days ago | IN | 0 ETH | 0.00000136 | ||||
| Withdraw | 223927054 | 533 days ago | IN | 0 ETH | 0.00000131 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 72051838 | 990 days ago | 0 ETH | ||||
| 72051838 | 990 days ago | 0 ETH | ||||
| 72051838 | 990 days ago | 0 ETH | ||||
| 71829579 | 991 days ago | 0 ETH | ||||
| 71023617 | 993 days ago | 0 ETH | ||||
| 70669040 | 994 days ago | 0 ETH | ||||
| 70669040 | 994 days ago | 0 ETH | ||||
| 70668072 | 994 days ago | 0 ETH | ||||
| 70529162 | 995 days ago | 0 ETH | ||||
| 70529162 | 995 days ago | 0 ETH | ||||
| 70529162 | 995 days ago | 0 ETH | ||||
| 70529162 | 995 days ago | 0 ETH | ||||
| 69550259 | 998 days ago | 0 ETH | ||||
| 68778615 | 1000 days ago | 0 ETH | ||||
| 68778615 | 1000 days ago | 0 ETH | ||||
| 68778615 | 1000 days ago | 0 ETH | ||||
| 68778615 | 1000 days ago | 0 ETH | ||||
| 68718317 | 1000 days ago | 0 ETH | ||||
| 68718317 | 1000 days ago | 0 ETH | ||||
| 68718317 | 1000 days ago | 0 ETH | ||||
| 68718317 | 1000 days ago | 0 ETH | ||||
| 67400870 | 1005 days ago | 0 ETH | ||||
| 67230117 | 1005 days ago | 0 ETH | ||||
| 67228999 | 1005 days ago | 0 ETH | ||||
| 67228999 | 1005 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MultiFeeDistribution2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2021-09-14
*/
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
// SPDX-License-Identifier: UNLICENSED
/**
* @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 Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
interface IMintableToken is IERC20 {
function mint(address _receiver, uint256 _amount) external returns (bool);
}
// EPS Staking contract for http://ellipsis.finance/
// EPS staked within this contact entitles stakers to a portion of the admin fees generated by Ellipsis' AMM contracts
// Based on SNX MultiRewards by iamdefinitelyahuman - https://github.com/iamdefinitelyahuman/multi-rewards
contract MultiFeeDistribution2 is ReentrancyGuard, Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using SafeERC20 for IMintableToken;
/* ========== STATE VARIABLES ========== */
struct Reward {
uint256 periodFinish;
uint256 rewardRate;
uint256 lastUpdateTime;
uint256 rewardPerTokenStored;
}
struct Balances {
uint256 total;
uint256 unlocked;
uint256 locked;
uint256 earned;
}
struct LockedBalance {
uint256 amount;
uint256 unlockTime;
}
struct RewardData {
address token;
uint256 amount;
}
IMintableToken public stakingToken;
address[] public rewardTokens;
mapping(address => Reward) public rewardData;
// Duration that rewards are streamed over
uint256 public constant rewardsDuration = 86400 * 7;
// Duration of lock/earned penalty period
uint256 public constant lockDuration = rewardsDuration * 13;
// Addresses approved to call mint
mapping(address => bool) public minters;
// reward token -> distributor -> is approved to add rewards
mapping(address=> mapping(address => bool)) public rewardDistributors;
// Addresses approved to lock stakes
mapping(address => bool) public lockedStakeWhitelist;
// user -> reward token -> amount
mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;
mapping(address => mapping(address => uint256)) public rewards;
uint256 public totalSupply;
uint256 public lockedSupply;
// Private mappings for balance data
mapping(address => Balances) balances;
mapping(address => LockedBalance[]) userLocks;
mapping(address => LockedBalance[]) userEarnings;
/* ========== CONSTRUCTOR ========== */
constructor(
address _stakingToken,
address[] memory _minters
) public Ownable() {
stakingToken = IMintableToken(_stakingToken);
for (uint i; i < _minters.length; i++) {
minters[_minters[i]] = true;
}
// First reward MUST be the staking token or things will break
// related to the 50% penalty and distribution to locked balances
rewardTokens.push(_stakingToken);
rewardData[_stakingToken].lastUpdateTime = block.timestamp;
}
/* ========== ADMIN CONFIGURATION ========== */
// Add a new reward token to be distributed to stakers
function addReward(
address _rewardsToken,
address _distributor
)
public
onlyOwner
{
require(rewardData[_rewardsToken].lastUpdateTime == 0);
rewardTokens.push(_rewardsToken);
rewardData[_rewardsToken].lastUpdateTime = block.timestamp;
rewardDistributors[_rewardsToken][_distributor] = true;
}
// Modify approval for an address to call notifyRewardAmount
function approveRewardDistributor(
address _rewardsToken,
address _distributor,
bool _approved
) external onlyOwner {
require(rewardData[_rewardsToken].lastUpdateTime > 0);
rewardDistributors[_rewardsToken][_distributor] = _approved;
}
function setLockedStakeContract(
address _address,
bool _approved
)
public
onlyOwner
{
lockedStakeWhitelist[_address] = _approved;
}
/* ========== VIEWS ========== */
function _rewardPerToken(address _rewardsToken, uint256 _supply) internal view returns (uint256) {
if (_supply == 0) {
return rewardData[_rewardsToken].rewardPerTokenStored;
}
return
rewardData[_rewardsToken].rewardPerTokenStored.add(
lastTimeRewardApplicable(_rewardsToken).sub(
rewardData[_rewardsToken].lastUpdateTime).mul(
rewardData[_rewardsToken].rewardRate).mul(1e18).div(_supply)
);
}
function _earned(
address _user,
address _rewardsToken,
uint256 _balance,
uint256 supply
) internal view returns (uint256) {
return _balance.mul(
_rewardPerToken(_rewardsToken, supply).sub(userRewardPerTokenPaid[_user][_rewardsToken])
).div(1e18).add(rewards[_user][_rewardsToken]);
}
function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) {
return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish);
}
function rewardPerToken(address _rewardsToken) external view returns (uint256) {
uint256 supply = _rewardsToken == address(stakingToken) ? lockedSupply : totalSupply;
return _rewardPerToken(_rewardsToken, supply);
}
function getRewardForDuration(address _rewardsToken) external view returns (uint256) {
return rewardData[_rewardsToken].rewardRate.mul(rewardsDuration);
}
// Address and claimable amount of all reward tokens for the given account
function claimableRewards(address account) external view returns (RewardData[] memory rewards) {
rewards = new RewardData[](rewardTokens.length);
for (uint256 i = 0; i < rewards.length; i++) {
// If i == 0 this is the stakingReward, distribution is based on locked balances
uint256 balance = i == 0 ? balances[account].locked : balances[account].total;
uint256 supply = i == 0 ? lockedSupply : totalSupply;
rewards[i].token = rewardTokens[i];
rewards[i].amount = _earned(account, rewards[i].token, balance, supply);
}
return rewards;
}
// Total balance of an account, including unlocked, locked and earned tokens
function totalBalance(address user) view external returns (uint256 amount) {
return balances[user].total;
}
// Total withdrawable balance for an account to which no penalty is applied
function unlockedBalance(address user) view external returns (uint256 amount) {
amount = balances[user].unlocked;
LockedBalance[] storage earnings = userEarnings[msg.sender];
for (uint i = 0; i < earnings.length; i++) {
if (earnings[i].unlockTime > block.timestamp) {
break;
}
amount = amount.add(earnings[i].amount);
}
return amount;
}
// Information on the "earned" balances of a user
// Earned balances may be withdrawn immediately for a 50% penalty
function earnedBalances(
address user
) view external returns (
uint256 total,
LockedBalance[] memory earningsData
) {
LockedBalance[] storage earnings = userEarnings[user];
uint256 idx;
for (uint i = 0; i < earnings.length; i++) {
if (earnings[i].unlockTime > block.timestamp) {
if (idx == 0) {
earningsData = new LockedBalance[](earnings.length - i);
}
earningsData[idx] = earnings[i];
idx++;
total = total.add(earnings[i].amount);
}
}
return (total, earningsData);
}
// Information on a user's locked balances
function lockedBalances(
address user
) view external returns (
uint256 total,
uint256 unlockable,
uint256 locked,
LockedBalance[] memory lockData
) {
LockedBalance[] storage locks = userLocks[user];
uint256 idx;
for (uint i = 0; i < locks.length; i++) {
if (locks[i].unlockTime > block.timestamp) {
if (idx == 0) {
lockData = new LockedBalance[](locks.length - i);
}
lockData[idx] = locks[i];
idx++;
locked = locked.add(locks[i].amount);
} else {
unlockable = unlockable.add(locks[i].amount);
}
}
return (balances[user].locked, unlockable, locked, lockData);
}
// Final balance received and penalty balance paid by user upon calling exit
function withdrawableBalance(
address user
) view public returns (
uint256 amount,
uint256 penaltyAmount
) {
Balances storage bal = balances[user];
if (bal.earned > 0) {
uint256 amountWithoutPenalty;
uint256 length = userEarnings[user].length;
for (uint i = 0; i < length; i++) {
uint256 earnedAmount = userEarnings[user][i].amount;
if (earnedAmount == 0) continue;
if (userEarnings[user][i].unlockTime > block.timestamp) {
break;
}
amountWithoutPenalty = amountWithoutPenalty.add(earnedAmount);
}
penaltyAmount = bal.earned.sub(amountWithoutPenalty).div(2);
}
amount = bal.unlocked.add(bal.earned).sub(penaltyAmount);
return (amount, penaltyAmount);
}
/* ========== MUTATIVE FUNCTIONS ========== */
//same function signature as original `stake` function for compatibility with original ABI
function stake(uint256 amount, bool ignored) external {
_stake(amount, false);
}
function stakeLocked(uint256 amount) external {
// Only allow approved contracts to stake locked, since an external contract will be used to handle locked stakes
require(lockedStakeWhitelist[msg.sender], "not whitelisted");
_stake(amount, true);
}
// Stake tokens to receive rewards
// Locked tokens cannot be withdrawn for lockDuration and are eligible to receive stakingReward rewards
function _stake(uint256 amount, bool lock) internal nonReentrant updateReward(msg.sender) {
require(amount > 0, "Cannot stake 0");
totalSupply = totalSupply.add(amount);
Balances storage bal = balances[msg.sender];
bal.total = bal.total.add(amount);
if (lock) {
lockedSupply = lockedSupply.add(amount);
bal.locked = bal.locked.add(amount);
uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration);
uint256 idx = userLocks[msg.sender].length;
if (idx == 0 || userLocks[msg.sender][idx-1].unlockTime < unlockTime) {
userLocks[msg.sender].push(LockedBalance({amount: amount, unlockTime: unlockTime}));
} else {
userLocks[msg.sender][idx-1].amount = userLocks[msg.sender][idx-1].amount.add(amount);
}
} else {
bal.unlocked = bal.unlocked.add(amount);
}
stakingToken.safeTransferFrom(msg.sender, address(this), amount);
emit Staked(msg.sender, amount);
}
// Mint new tokens
// Minted tokens receive rewards normally but incur a 50% penalty when
// withdrawn before lockDuration has passed.
function mint(address user, uint256 amount) external updateReward(user) {
require(minters[msg.sender], "not minter");
totalSupply = totalSupply.add(amount);
Balances storage bal = balances[user];
bal.total = bal.total.add(amount);
bal.earned = bal.earned.add(amount);
uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration);
LockedBalance[] storage earnings = userEarnings[user];
uint256 idx = earnings.length;
if (idx == 0 || earnings[idx-1].unlockTime < unlockTime) {
earnings.push(LockedBalance({amount: amount, unlockTime: unlockTime}));
} else {
earnings[idx-1].amount = earnings[idx-1].amount.add(amount);
}
stakingToken.mint(address(this), amount);
emit Staked(user, amount);
}
// Withdraw staked tokens
// First withdraws unlocked tokens, then earned tokens. Withdrawing earned tokens
// incurs a 50% penalty which is distributed based on locked balances.
function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
require(amount > 0, "Cannot withdraw 0");
Balances storage bal = balances[msg.sender];
uint256 penaltyAmount;
if (amount <= bal.unlocked) {
bal.unlocked = bal.unlocked.sub(amount);
} else {
uint256 remaining = amount.sub(bal.unlocked);
require(bal.earned >= remaining, "Insufficient unlocked balance");
bal.unlocked = 0;
bal.earned = bal.earned.sub(remaining);
for (uint i = 0; ; i++) {
uint256 earnedAmount = userEarnings[msg.sender][i].amount;
if (earnedAmount == 0) continue;
if (penaltyAmount == 0 && userEarnings[msg.sender][i].unlockTime > block.timestamp) {
penaltyAmount = remaining;
require(bal.earned >= remaining, "Insufficient balance after penalty");
bal.earned = bal.earned.sub(remaining);
if (bal.earned == 0) {
delete userEarnings[msg.sender];
break;
}
remaining = remaining.mul(2);
}
if (remaining <= earnedAmount) {
userEarnings[msg.sender][i].amount = earnedAmount.sub(remaining);
break;
} else {
delete userEarnings[msg.sender][i];
remaining = remaining.sub(earnedAmount);
}
}
}
uint256 adjustedAmount = amount.add(penaltyAmount);
bal.total = bal.total.sub(adjustedAmount);
totalSupply = totalSupply.sub(adjustedAmount);
stakingToken.safeTransfer(msg.sender, amount);
if (penaltyAmount > 0) {
_notifyReward(address(stakingToken), penaltyAmount);
}
emit Withdrawn(msg.sender, amount);
}
// Claim all pending staking rewards
function getReward() public nonReentrant updateReward(msg.sender) {
for (uint i; i < rewardTokens.length; i++) {
address _rewardsToken = rewardTokens[i];
uint256 reward = rewards[msg.sender][_rewardsToken];
if (reward > 0) {
rewards[msg.sender][_rewardsToken] = 0;
IERC20(_rewardsToken).safeTransfer(msg.sender, reward);
emit RewardPaid(msg.sender, _rewardsToken, reward);
}
}
}
// Withdraw full unlocked balance and claim pending rewards
function exit() external updateReward(msg.sender) {
(uint256 amount, uint256 penaltyAmount) = withdrawableBalance(msg.sender);
delete userEarnings[msg.sender];
Balances storage bal = balances[msg.sender];
bal.total = bal.total.sub(bal.unlocked).sub(bal.earned);
bal.unlocked = 0;
bal.earned = 0;
totalSupply = totalSupply.sub(amount.add(penaltyAmount));
stakingToken.safeTransfer(msg.sender, amount);
if (penaltyAmount > 0) {
_notifyReward(address(stakingToken), penaltyAmount);
}
getReward();
}
// Withdraw all currently locked tokens where the unlock time has passed
function withdrawExpiredLocks() external {
LockedBalance[] storage locks = userLocks[msg.sender];
Balances storage bal = balances[msg.sender];
uint256 amount;
uint256 length = locks.length;
if (locks[length-1].unlockTime <= block.timestamp) { //Certik: length is guaranteed to be >= 1
amount = bal.locked;
delete userLocks[msg.sender];
} else {
for (uint i = 0; i < length; i++) {
if (locks[i].unlockTime > block.timestamp) break;
amount = amount.add(locks[i].amount);
delete locks[i];
}
}
bal.locked = bal.locked.sub(amount);
bal.total = bal.total.sub(amount);
totalSupply = totalSupply.sub(amount);
lockedSupply = lockedSupply.sub(amount);
stakingToken.safeTransfer(msg.sender, amount);
}
/* ========== RESTRICTED FUNCTIONS ========== */
function _notifyReward(address _rewardsToken, uint256 reward) internal {
if (block.timestamp >= rewardData[_rewardsToken].periodFinish) {
rewardData[_rewardsToken].rewardRate = reward.div(rewardsDuration);
} else {
uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp);
uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate);
rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(rewardsDuration);
}
rewardData[_rewardsToken].lastUpdateTime = block.timestamp;
rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardsDuration);
}
function notifyRewardAmount(address _rewardsToken, uint256 reward) external updateReward(address(0)) {
require(rewardDistributors[_rewardsToken][msg.sender], "Not reward distributor");
require(reward > 0, "No reward");
// handle the transfer of reward tokens via `transferFrom` to reduce the number
// of transactions required and ensure correctness of the reward amount
IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), reward);
_notifyReward(_rewardsToken, reward);
emit RewardAdded(reward);
}
// Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
require(tokenAddress != address(stakingToken), "Cannot withdraw staking token");
require(rewardData[tokenAddress].lastUpdateTime == 0, "Cannot withdraw reward token");
IERC20(tokenAddress).safeTransfer(owner(), tokenAmount);
emit Recovered(tokenAddress, tokenAmount);
}
/* ========== MODIFIERS ========== */
modifier updateReward(address account) {
address token = address(stakingToken);
uint256 balance;
uint256 supply = lockedSupply;
rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply);
rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token);
if (account != address(0)) {
// Special case, use the locked balances and supply for stakingReward rewards
rewards[account][token] = _earned(account, token, balances[account].locked, supply);
userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored;
balance = balances[account].total;
}
supply = totalSupply;
for (uint i = 1; i < rewardTokens.length; i++) {
token = rewardTokens[i];
rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply);
rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token);
if (account != address(0)) {
rewards[account][token] = _earned(account, token, balance, supply);
userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored;
}
}
_;
}
/* ========== EVENTS ========== */
event RewardAdded(uint256 reward);
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event RewardPaid(address indexed user, address indexed rewardsToken, uint256 reward);
event RewardsDurationUpdated(address token, uint256 newDuration);
event Recovered(address token, uint256 amount);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"approveRewardDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableRewards","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.RewardData[]","name":"rewards","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"earnedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.LockedBalance[]","name":"earningsData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct MultiFeeDistribution2.LockedBalance[]","name":"lockData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedStakeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewardDistributors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setLockedStakeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ignored","type":"bool"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IMintableToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockedBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawExpiredLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"withdrawableBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200379138038062003791833981016040819052620000349162000192565b600160009081556200004562000170565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b0319166001600160a01b03841617905560005b81518110156200010957600160056000848481518110620000ce57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620000b1565b505060038054600181019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b039092166001600160a01b03199092168217905560009081526004602052604090204260029091015562000286565b3390565b80516001600160a01b03811681146200018c57600080fd5b92915050565b60008060408385031215620001a5578182fd5b620001b1848462000174565b602084810151919350906001600160401b0380821115620001d0578384fd5b818601915086601f830112620001e4578384fd5b815181811115620001f3578485fd5b8381029150620002058483016200025f565b8181528481019084860184860187018b101562000220578788fd5b8795505b838610156200024e57620002398b8262000174565b83526001959095019491860191860162000224565b508096505050505050509250929050565b6040518181016001600160401b03811182821017156200027e57600080fd5b604052919050565b6134fb80620002966000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80637035ab9811610125578063bcd11014116100ad578063e70b9e271161007c578063e70b9e2714610486578063e9fad8ee14610499578063f1229777146104a1578063f2fde38b146104b4578063f46eccc4146104c75761021c565b8063bcd110141461042a578063ca5c7b911461043d578063dc01f60d14610445578063df379876146104655761021c565b80638980f11f116100f45780638980f11f146103e15780638da5cb5b146103f4578063a01c77bc146103fc578063abe50f1914610404578063b66503cf146104175761021c565b80637035ab981461039e578063715018a6146103b157806372f702f3146103b95780637bb7bed1146103ce5761021c565b806340b47e1a116101a85780635e0fac2e116101775780635e0fac2e1461033f57806362cc445c14610352578063638634ee146103655780636724c910146103785780636eacd3981461038b5761021c565b806340b47e1a146102e357806340c10f19146102f657806348e5d9f814610309578063590b3f811461032c5761021c565b80631ace1dd8116101ef5780631ace1dd81461028b5780632e1a7d4d146102ab578063386a9525146102c057806339fc9713146102c85780633d18b912146102db5761021c565b806302b6293814610221578063045544431461024b5780630483a7f61461026057806318160ddd14610283575b600080fd5b61023461022f366004612d29565b6104da565b60405161024292919061341e565b60405180910390f35b610253610619565b60405161024291906133fc565b61027361026e366004612d29565b610620565b604051610242949392919061342c565b6102536107ae565b61029e610299366004612d29565b6107b4565b6040516102429190612f85565b6102be6102b9366004612e3f565b6107c9565b005b610253610cb3565b61029e6102d6366004612d44565b610cba565b6102be610cda565b6102be6102f1366004612d44565b610fc7565b6102be610304366004612df9565b6110b0565b61031c610317366004612d29565b6114d5565b604051610242949392919061345b565b6102be61033a366004612dc2565b6114fc565b61025361034d366004612d29565b611566565b6102be610360366004612e3f565b6115fd565b610253610373366004612d29565b61163a565b6102be610386366004612d78565b611664565b610253610399366004612d29565b611702565b6102536103ac366004612d44565b61171d565b6102be61173a565b6103c16117c3565b6040516102429190612edc565b6103c16103dc366004612e3f565b6117d2565b6102be6103ef366004612df9565b6117f9565b6103c16118f8565b6102be611907565b6102be610412366004612e57565b611a47565b6102be610425366004612df9565b611a56565b610253610438366004612d29565b611cf4565b610253611d1d565b610458610453366004612d29565b611d23565b6040516102429190612f2d565b610478610473366004612d29565b611e8b565b604051610242929190613405565b610253610494366004612d44565b611faf565b6102be611fcc565b6102536104af366004612d29565b61226b565b6102be6104c2366004612d29565b6122a4565b61029e6104d5366004612d29565b612365565b6001600160a01b0381166000908152600c602052604081206003810154829190156105ec576001600160a01b0384166000908152600e6020526040812054815b818110156105c4576001600160a01b0387166000908152600e6020526040812080548390811061054657fe5b9060005260206000209060020201600001549050806000141561056957506105bc565b6001600160a01b0388166000908152600e6020526040902080544291908490811061059057fe5b90600052602060002090600202016001015411156105ae57506105c4565b6105b8848261237a565b9350505b60010161051a565b506105e760026105e184866003015461239f90919063ffffffff16565b906123c7565b935050505b6106118261060b8360030154846001015461237a90919063ffffffff16565b9061239f565b925050915091565b6277f88081565b6001600160a01b0381166000908152600d602052604081208190819060609082805b8254811015610786574283828154811061065857fe5b906000526020600020906002020160010154111561075457816106ce57825481900367ffffffffffffffff8111801561069057600080fd5b506040519080825280602002602001820160405280156106ca57816020015b6106b7612ca1565b8152602001906001900390816106af5790505b5093505b8281815481106106da57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061071357fe5b6020026020010181905250818060010192505061074d83828154811061073557fe5b6000918252602090912060029091020154869061237a565b945061077e565b61077b83828154811061076357fe5b6000918252602090912060029091020154879061237a565b95505b600101610642565b5050506001600160a01b0385166000908152600c602052604090206002015493509193509193565b600a5481565b60076020526000908152604090205460ff1681565b600260005414156107f55760405162461bcd60e51b81526004016107ec906133c5565b60405180910390fd5b600260008181559054600b5433926001600160a01b03909216919061081a83826123f9565b6001600160a01b03841660009081526004602052604090206003015561083f8361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156108eb576001600160a01b0384166000908152600c602052604090206002015461089090859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156109d7576003818154811061090957fe5b6000918252602090912001546001600160a01b0316935061092a84836123f9565b6001600160a01b03851660009081526004602052604090206003015561094f8461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156109cf576109828585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016108f2565b50600085116109f85760405162461bcd60e51b81526004016107ec90613181565b336000908152600c6020526040812060018101549091908711610a2e576001820154610a24908861239f565b6001830155610c03565b6000610a4783600101548961239f90919063ffffffff16565b90508083600301541015610a6d5760405162461bcd60e51b81526004016107ec906132ad565b600060018401556003830154610a83908261239f565b600384015560005b336000908152600e60205260408120805483908110610aa657fe5b90600052602060002090600202016000015490508060001415610ac95750610bf8565b83158015610b045750336000908152600e60205260409020805442919084908110610af057fe5b906000526020600020906002020160010154115b15610b76578293508285600301541015610b305760405162461bcd60e51b81526004016107ec90613068565b6003850154610b3f908461239f565b60038601819055610b6857336000908152600e60205260408120610b6291612cbb565b50610c00565b610b73836002612500565b92505b808311610bb957610b87818461239f565b336000908152600e60205260409020805484908110610ba257fe5b600091825260209091206002909102015550610c00565b336000908152600e60205260409020805483908110610bd457fe5b60009182526020822060029091020181815560010155610bf4838261239f565b9250505b600101610a8b565b50505b6000610c0f888361237a565b8354909150610c1e908261239f565b8355600a54610c2d908261239f565b600a55600254610c47906001600160a01b0316338a61253a565b8115610c6357600254610c63906001600160a01b031683612595565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d589604051610c9c91906133fc565b60405180910390a250506001600055505050505050565b62093a8081565b600660209081526000928352604080842090915290825290205460ff1681565b60026000541415610cfd5760405162461bcd60e51b81526004016107ec906133c5565b600260008181559054600b5433926001600160a01b039092169190610d2283826123f9565b6001600160a01b038416600090815260046020526040902060030155610d478361163a565b6001600160a01b03808516600090815260046020526040902060020191909155841615610df3576001600160a01b0384166000908152600c6020526040902060020154610d9890859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015610edf5760038181548110610e1157fe5b6000918252602090912001546001600160a01b03169350610e3284836123f9565b6001600160a01b038516600090815260046020526040902060030155610e578461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615610ed757610e8a8585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101610dfa565b5060005b600354811015610fbb57600060038281548110610efc57fe5b60009182526020808320909101543383526009825260408084206001600160a01b03909216808552919092529120549091508015610fb1573360008181526009602090815260408083206001600160a01b0387168085529252822091909155610f65918361253a565b816001600160a01b0316336001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610fa891906133fc565b60405180910390a35b5050600101610ee3565b50506001600055505050565b610fcf6126b0565b6001600160a01b0316610fe06118f8565b6001600160a01b0316146110065760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0382166000908152600460205260409020600201541561102c57600080fd5b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b039485169081179091556000908152600460209081526040808320426002909101556006825280832094909516825292909252919020805460ff19169091179055565b600254600b5483916001600160a01b0316906000906110cf83826123f9565b6001600160a01b0384166000908152600460205260409020600301556110f48361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156111a0576001600160a01b0384166000908152600c602052604090206002015461114590859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b60035481101561128c57600381815481106111be57fe5b6000918252602090912001546001600160a01b031693506111df84836123f9565b6001600160a01b0385166000908152600460205260409020600301556112048461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615611284576112378585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016111a7565b503360009081526005602052604090205460ff166112bc5760405162461bcd60e51b81526004016107ec90613289565b600a546112c9908661237a565b600a556001600160a01b0386166000908152600c6020526040902080546112f0908761237a565b81556003810154611301908761237a565b6003820155600061132c6277f88061132662093a8061132042826123c7565b90612500565b9061237a565b6001600160a01b0389166000908152600e6020526040902080549192509080158061137657508282600183038154811061136257fe5b906000526020600020906002020160010154105b156113b8576040805180820190915289815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155611403565b6113e2898360018403815481106113cb57fe5b60009182526020909120600290910201549061237a565b8260018303815481106113f157fe5b60009182526020909120600290910201555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906114359030908d90600401612f14565b602060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190612e23565b50896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a6040516114c191906133fc565b60405180910390a250505050505050505050565b60046020526000908152604090208054600182015460028301546003909301549192909184565b6115046126b0565b6001600160a01b03166115156118f8565b6001600160a01b03161461153b5760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600c6020908152604080832060010154338452600e909252822090915b81548110156115f657428282815481106115a857fe5b90600052602060002090600202016001015411156115c5576115f6565b6115ec8282815481106115d457fe5b6000918252602090912060029091020154849061237a565b9250600101611592565b5050919050565b3360009081526007602052604090205460ff1661162c5760405162461bcd60e51b81526004016107ec9061331b565b6116378160016126b4565b50565b6001600160a01b03811660009081526004602052604081205461165e904290612ac4565b92915050565b61166c6126b0565b6001600160a01b031661167d6118f8565b6001600160a01b0316146116a35760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0383166000908152600460205260409020600201546116c857600080fd5b6001600160a01b03928316600090815260066020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6001600160a01b03166000908152600c602052604090205490565b600860209081526000928352604080842090915290825290205481565b6117426126b0565b6001600160a01b03166117536118f8565b6001600160a01b0316146117795760405162461bcd60e51b81526004016107ec906131ed565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6002546001600160a01b031681565b600381815481106117df57fe5b6000918252602090912001546001600160a01b0316905081565b6118016126b0565b6001600160a01b03166118126118f8565b6001600160a01b0316146118385760405162461bcd60e51b81526004016107ec906131ed565b6002546001600160a01b03838116911614156118665760405162461bcd60e51b81526004016107ec90613252565b6001600160a01b0382166000908152600460205260409020600201541561189f5760405162461bcd60e51b81526004016107ec9061338e565b6118bb6118aa6118f8565b6001600160a01b038416908361253a565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882826040516118ec929190612f14565b60405180910390a15050565b6001546001600160a01b031690565b336000908152600d60209081526040808320600c90925282208154919290914284600019830183811061193657fe5b90600052602060002090600202016001015411611973576002830154336000908152600d6020526040812091935061196e9190612cbb565b6119e8565b60005b818110156119e6574285828154811061198b57fe5b90600052602060002090600202016001015411156119a8576119e6565b6119b78582815481106115d457fe5b92508481815481106119c557fe5b60009182526020822060029091020181815560019081019190915501611976565b505b60028301546119f7908361239f565b60028401558254611a08908361239f565b8355600a54611a17908361239f565b600a55600b54611a27908361239f565b600b55600254611a41906001600160a01b0316338461253a565b50505050565b611a528260006126b4565b5050565b600254600b546000916001600160a01b0316908290611a7583826123f9565b6001600160a01b038416600090815260046020526040902060030155611a9a8361163a565b6001600160a01b03808516600090815260046020526040902060020191909155841615611b46576001600160a01b0384166000908152600c6020526040902060020154611aeb90859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015611c325760038181548110611b6457fe5b6000918252602090912001546001600160a01b03169350611b8584836123f9565b6001600160a01b038516600090815260046020526040902060030155611baa8461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615611c2a57611bdd8585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611b4d565b506001600160a01b038616600090815260066020908152604080832033845290915290205460ff16611c765760405162461bcd60e51b81526004016107ec90613222565b60008511611c965760405162461bcd60e51b81526004016107ec9061315e565b611cab6001600160a01b038716333088612ada565b611cb58686612595565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d85604051611ce491906133fc565b60405180910390a1505050505050565b6001600160a01b03811660009081526004602052604081206001015461165e9062093a80612500565b600b5481565b60035460609067ffffffffffffffff81118015611d3f57600080fd5b50604051908082528060200260200182016040528015611d7957816020015b611d66612cdc565b815260200190600190039081611d5e5790505b50905060005b8151811015611e855760008115611dae576001600160a01b0384166000908152600c6020526040902054611dcb565b6001600160a01b0384166000908152600c60205260409020600201545b905060008215611ddd57600a54611de1565b600b545b905060038381548110611df057fe5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110611e1a57fe5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050611e6185858581518110611e4e57fe5b602002602001015160000151848461248e565b848481518110611e6d57fe5b60209081029190910181015101525050600101611d7f565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611fa75742838281548110611ebf57fe5b9060005260206000209060020201600101541115611f9f5781611f3557825481900367ffffffffffffffff81118015611ef757600080fd5b50604051908082528060200260200182016040528015611f3157816020015b611f1e612ca1565b815260200190600190039081611f165790505b5093505b828181548110611f4157fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050848381518110611f7a57fe5b60200260200101819052508180600101925050611f9c83828154811061073557fe5b94505b600101611ea9565b505050915091565b600960209081526000928352604080842090915290825290205481565b600254600b5433916001600160a01b031690600090611feb83826123f9565b6001600160a01b0384166000908152600460205260409020600301556120108361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156120bc576001600160a01b0384166000908152600c602052604090206002015461206190859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156121a857600381815481106120da57fe5b6000918252602090912001546001600160a01b031693506120fb84836123f9565b6001600160a01b0385166000908152600460205260409020600301556121208461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156121a0576121538585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016120c3565b506000806121b5336104da565b336000908152600e602052604081209294509092506121d49190612cbb565b336000908152600c602052604090206003810154600182015482546121fe929161060b919061239f565b8155600060018201819055600382015561222461221b848461237a565b600a549061239f565b600a5560025461223e906001600160a01b0316338561253a565b811561225a5760025461225a906001600160a01b031683612595565b612262610cda565b50505050505050565b60025460009081906001600160a01b0384811691161461228d57600a54612291565b600b545b905061229d83826123f9565b9392505050565b6122ac6126b0565b6001600160a01b03166122bd6118f8565b6001600160a01b0316146122e35760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0381166123095760405162461bcd60e51b81526004016107ec90612fc3565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b60008282018381101561229d5760405162461bcd60e51b81526004016107ec90613031565b6000828211156123c15760405162461bcd60e51b81526004016107ec906130aa565b50900390565b60008082116123e85760405162461bcd60e51b81526004016107ec90613127565b8183816123f157fe5b049392505050565b60008161242257506001600160a01b03821660009081526004602052604090206003015461165e565b6001600160a01b0383166000908152600460205260409020600181015460029091015461229d9161246c9185916105e191670de0b6b3a76400009161132091829061060b8c61163a565b6001600160a01b0385166000908152600460205260409020600301549061237a565b6001600160a01b0380851660008181526009602090815260408083209488168084529482528083205493835260088252808320948352939052918220546124f7919061132690670de0b6b3a7640000906105e1906124f09061060b8b8a6123f9565b8890612500565b95945050505050565b60008261250f5750600061165e565b8282028284828161251c57fe5b041461229d5760405162461bcd60e51b81526004016107ec906131ac565b6125908363a9059cbb60e01b8484604051602401612559929190612f14565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612afb565b505050565b6001600160a01b03821660009081526004602052604090205442106125e2576125c18162093a806123c7565b6001600160a01b038316600090815260046020526040902060010155612662565b6001600160a01b038216600090815260046020526040812054612605904261239f565b6001600160a01b03841660009081526004602052604081206001015491925090612630908390612500565b905061264362093a806105e1858461237a565b6001600160a01b03851660009081526004602052604090206001015550505b6001600160a01b03821660009081526004602052604090204260029091018190556126909062093a8061237a565b6001600160a01b0390921660009081526004602052604090209190915550565b3390565b600260005414156126d75760405162461bcd60e51b81526004016107ec906133c5565b600260008181559054600b5433926001600160a01b0390921691906126fc83826123f9565b6001600160a01b0384166000908152600460205260409020600301556127218361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156127cd576001600160a01b0384166000908152600c602052604090206002015461277290859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156128b957600381815481106127eb57fe5b6000918252602090912001546001600160a01b0316935061280c84836123f9565b6001600160a01b0385166000908152600460205260409020600301556128318461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156128b1576128648585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016127d4565b50600086116128da5760405162461bcd60e51b81526004016107ec90613009565b600a546128e7908761237a565b600a55336000908152600c602052604090208054612905908861237a565b81558515612a4857600b5461291a908861237a565b600b55600281015461292c908861237a565b6002820155600061294b6277f88061132662093a8061132042826123c7565b336000908152600d602052604090205490915080158061299c5750336000908152600d602052604090208054839190600019840190811061298857fe5b906000526020600020906002020160010154105b156129eb57336000908152600d6020908152604080832081518083019092528c825281830186815281546001818101845592865293909420915160029093029091019182559151910155612a41565b336000908152600d602052604090208054612a10918b9160001985019081106113cb57fe5b336000908152600d6020526040902080546000198401908110612a2f57fe5b60009182526020909120600290910201555b5050612a5d565b6001810154612a57908861237a565b60018201555b600254612a75906001600160a01b031633308a612ada565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d88604051612aae91906133fc565b60405180910390a2505060016000555050505050565b6000818310612ad3578161229d565b5090919050565b611a41846323b872dd60e01b85858560405160240161255993929190612ef0565b6060612b50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b8a9092919063ffffffff16565b8051909150156125905780806020019051810190612b6e9190612e23565b6125905760405162461bcd60e51b81526004016107ec90613344565b6060612b998484600085612ba1565b949350505050565b606082471015612bc35760405162461bcd60e51b81526004016107ec906130e1565b612bcc85612c62565b612be85760405162461bcd60e51b81526004016107ec906132e4565b60006060866001600160a01b03168587604051612c059190612ec0565b60006040518083038185875af1925050503d8060008114612c42576040519150601f19603f3d011682016040523d82523d6000602084013e612c47565b606091505b5091509150612c57828286612c68565b979650505050505050565b3b151590565b60608315612c7757508161229d565b825115612c875782518084602001fd5b8160405162461bcd60e51b81526004016107ec9190612f90565b604051806040016040528060008152602001600081525090565b50805460008255600202906000526020600020908101906116379190612cf3565b604080518082019091526000808252602082015290565b5b80821115612d0e5760008082556001820155600201612cf4565b5090565b80356001600160a01b038116811461165e57600080fd5b600060208284031215612d3a578081fd5b61229d8383612d12565b60008060408385031215612d56578081fd5b612d608484612d12565b9150612d6f8460208501612d12565b90509250929050565b600080600060608486031215612d8c578081fd5b8335612d97816134a2565b92506020840135612da7816134a2565b91506040840135612db7816134b7565b809150509250925092565b60008060408385031215612dd4578182fd5b612dde8484612d12565b91506020830135612dee816134b7565b809150509250929050565b60008060408385031215612e0b578182fd5b612e158484612d12565b946020939093013593505050565b600060208284031215612e34578081fd5b815161229d816134b7565b600060208284031215612e50578081fd5b5035919050565b60008060408385031215612e69578182fd5b823591506020830135612dee816134b7565b6000815180845260208085019450808401835b83811015612eb5578151805188528301518388015260409096019590820190600101612e8e565b509495945050505050565b60008251612ed2818460208701613476565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612f7857815180516001600160a01b03168552860151868501529284019290850190600101612f4a565b5091979650505050505050565b901515815260200190565b6000602082528251806020840152612faf816040850160208701613476565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526022908201527f496e73756666696369656e742062616c616e63652061667465722070656e616c604082015261747960f01b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152752737ba103932bbb0b932103234b9ba3934b13aba37b960511b604082015260600190565b6020808252601d908201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604082015260600190565b6020808252600a90820152693737ba1036b4b73a32b960b11b604082015260600190565b6020808252601d908201527f496e73756666696369656e7420756e6c6f636b65642062616c616e6365000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b600083825260406020830152612b996040830184612e7b565b918252602082015260400190565b6000858252846020830152836040830152608060608301526134516080830184612e7b565b9695505050505050565b93845260208401929092526040830152606082015260800190565b60005b83811015613491578181015183820152602001613479565b83811115611a415750506000910152565b6001600160a01b038116811461163757600080fd5b801515811461163757600080fdfea264697066735822122015122e078b49712b731404fc10d39d617e4dfa88e55acabeb8e8f6019e78717c64736f6c634300060c003300000000000000000000000009ad12552ec45f82be90b38dfe7b06332a6808640000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000047d3dcad6e47c519238cbe50da43e6a53c49cfc2
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80637035ab9811610125578063bcd11014116100ad578063e70b9e271161007c578063e70b9e2714610486578063e9fad8ee14610499578063f1229777146104a1578063f2fde38b146104b4578063f46eccc4146104c75761021c565b8063bcd110141461042a578063ca5c7b911461043d578063dc01f60d14610445578063df379876146104655761021c565b80638980f11f116100f45780638980f11f146103e15780638da5cb5b146103f4578063a01c77bc146103fc578063abe50f1914610404578063b66503cf146104175761021c565b80637035ab981461039e578063715018a6146103b157806372f702f3146103b95780637bb7bed1146103ce5761021c565b806340b47e1a116101a85780635e0fac2e116101775780635e0fac2e1461033f57806362cc445c14610352578063638634ee146103655780636724c910146103785780636eacd3981461038b5761021c565b806340b47e1a146102e357806340c10f19146102f657806348e5d9f814610309578063590b3f811461032c5761021c565b80631ace1dd8116101ef5780631ace1dd81461028b5780632e1a7d4d146102ab578063386a9525146102c057806339fc9713146102c85780633d18b912146102db5761021c565b806302b6293814610221578063045544431461024b5780630483a7f61461026057806318160ddd14610283575b600080fd5b61023461022f366004612d29565b6104da565b60405161024292919061341e565b60405180910390f35b610253610619565b60405161024291906133fc565b61027361026e366004612d29565b610620565b604051610242949392919061342c565b6102536107ae565b61029e610299366004612d29565b6107b4565b6040516102429190612f85565b6102be6102b9366004612e3f565b6107c9565b005b610253610cb3565b61029e6102d6366004612d44565b610cba565b6102be610cda565b6102be6102f1366004612d44565b610fc7565b6102be610304366004612df9565b6110b0565b61031c610317366004612d29565b6114d5565b604051610242949392919061345b565b6102be61033a366004612dc2565b6114fc565b61025361034d366004612d29565b611566565b6102be610360366004612e3f565b6115fd565b610253610373366004612d29565b61163a565b6102be610386366004612d78565b611664565b610253610399366004612d29565b611702565b6102536103ac366004612d44565b61171d565b6102be61173a565b6103c16117c3565b6040516102429190612edc565b6103c16103dc366004612e3f565b6117d2565b6102be6103ef366004612df9565b6117f9565b6103c16118f8565b6102be611907565b6102be610412366004612e57565b611a47565b6102be610425366004612df9565b611a56565b610253610438366004612d29565b611cf4565b610253611d1d565b610458610453366004612d29565b611d23565b6040516102429190612f2d565b610478610473366004612d29565b611e8b565b604051610242929190613405565b610253610494366004612d44565b611faf565b6102be611fcc565b6102536104af366004612d29565b61226b565b6102be6104c2366004612d29565b6122a4565b61029e6104d5366004612d29565b612365565b6001600160a01b0381166000908152600c602052604081206003810154829190156105ec576001600160a01b0384166000908152600e6020526040812054815b818110156105c4576001600160a01b0387166000908152600e6020526040812080548390811061054657fe5b9060005260206000209060020201600001549050806000141561056957506105bc565b6001600160a01b0388166000908152600e6020526040902080544291908490811061059057fe5b90600052602060002090600202016001015411156105ae57506105c4565b6105b8848261237a565b9350505b60010161051a565b506105e760026105e184866003015461239f90919063ffffffff16565b906123c7565b935050505b6106118261060b8360030154846001015461237a90919063ffffffff16565b9061239f565b925050915091565b6277f88081565b6001600160a01b0381166000908152600d602052604081208190819060609082805b8254811015610786574283828154811061065857fe5b906000526020600020906002020160010154111561075457816106ce57825481900367ffffffffffffffff8111801561069057600080fd5b506040519080825280602002602001820160405280156106ca57816020015b6106b7612ca1565b8152602001906001900390816106af5790505b5093505b8281815481106106da57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061071357fe5b6020026020010181905250818060010192505061074d83828154811061073557fe5b6000918252602090912060029091020154869061237a565b945061077e565b61077b83828154811061076357fe5b6000918252602090912060029091020154879061237a565b95505b600101610642565b5050506001600160a01b0385166000908152600c602052604090206002015493509193509193565b600a5481565b60076020526000908152604090205460ff1681565b600260005414156107f55760405162461bcd60e51b81526004016107ec906133c5565b60405180910390fd5b600260008181559054600b5433926001600160a01b03909216919061081a83826123f9565b6001600160a01b03841660009081526004602052604090206003015561083f8361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156108eb576001600160a01b0384166000908152600c602052604090206002015461089090859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156109d7576003818154811061090957fe5b6000918252602090912001546001600160a01b0316935061092a84836123f9565b6001600160a01b03851660009081526004602052604090206003015561094f8461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156109cf576109828585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016108f2565b50600085116109f85760405162461bcd60e51b81526004016107ec90613181565b336000908152600c6020526040812060018101549091908711610a2e576001820154610a24908861239f565b6001830155610c03565b6000610a4783600101548961239f90919063ffffffff16565b90508083600301541015610a6d5760405162461bcd60e51b81526004016107ec906132ad565b600060018401556003830154610a83908261239f565b600384015560005b336000908152600e60205260408120805483908110610aa657fe5b90600052602060002090600202016000015490508060001415610ac95750610bf8565b83158015610b045750336000908152600e60205260409020805442919084908110610af057fe5b906000526020600020906002020160010154115b15610b76578293508285600301541015610b305760405162461bcd60e51b81526004016107ec90613068565b6003850154610b3f908461239f565b60038601819055610b6857336000908152600e60205260408120610b6291612cbb565b50610c00565b610b73836002612500565b92505b808311610bb957610b87818461239f565b336000908152600e60205260409020805484908110610ba257fe5b600091825260209091206002909102015550610c00565b336000908152600e60205260409020805483908110610bd457fe5b60009182526020822060029091020181815560010155610bf4838261239f565b9250505b600101610a8b565b50505b6000610c0f888361237a565b8354909150610c1e908261239f565b8355600a54610c2d908261239f565b600a55600254610c47906001600160a01b0316338a61253a565b8115610c6357600254610c63906001600160a01b031683612595565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d589604051610c9c91906133fc565b60405180910390a250506001600055505050505050565b62093a8081565b600660209081526000928352604080842090915290825290205460ff1681565b60026000541415610cfd5760405162461bcd60e51b81526004016107ec906133c5565b600260008181559054600b5433926001600160a01b039092169190610d2283826123f9565b6001600160a01b038416600090815260046020526040902060030155610d478361163a565b6001600160a01b03808516600090815260046020526040902060020191909155841615610df3576001600160a01b0384166000908152600c6020526040902060020154610d9890859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015610edf5760038181548110610e1157fe5b6000918252602090912001546001600160a01b03169350610e3284836123f9565b6001600160a01b038516600090815260046020526040902060030155610e578461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615610ed757610e8a8585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101610dfa565b5060005b600354811015610fbb57600060038281548110610efc57fe5b60009182526020808320909101543383526009825260408084206001600160a01b03909216808552919092529120549091508015610fb1573360008181526009602090815260408083206001600160a01b0387168085529252822091909155610f65918361253a565b816001600160a01b0316336001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610fa891906133fc565b60405180910390a35b5050600101610ee3565b50506001600055505050565b610fcf6126b0565b6001600160a01b0316610fe06118f8565b6001600160a01b0316146110065760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0382166000908152600460205260409020600201541561102c57600080fd5b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b039485169081179091556000908152600460209081526040808320426002909101556006825280832094909516825292909252919020805460ff19169091179055565b600254600b5483916001600160a01b0316906000906110cf83826123f9565b6001600160a01b0384166000908152600460205260409020600301556110f48361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156111a0576001600160a01b0384166000908152600c602052604090206002015461114590859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b60035481101561128c57600381815481106111be57fe5b6000918252602090912001546001600160a01b031693506111df84836123f9565b6001600160a01b0385166000908152600460205260409020600301556112048461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615611284576112378585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016111a7565b503360009081526005602052604090205460ff166112bc5760405162461bcd60e51b81526004016107ec90613289565b600a546112c9908661237a565b600a556001600160a01b0386166000908152600c6020526040902080546112f0908761237a565b81556003810154611301908761237a565b6003820155600061132c6277f88061132662093a8061132042826123c7565b90612500565b9061237a565b6001600160a01b0389166000908152600e6020526040902080549192509080158061137657508282600183038154811061136257fe5b906000526020600020906002020160010154105b156113b8576040805180820190915289815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155611403565b6113e2898360018403815481106113cb57fe5b60009182526020909120600290910201549061237a565b8260018303815481106113f157fe5b60009182526020909120600290910201555b6002546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906114359030908d90600401612f14565b602060405180830381600087803b15801561144f57600080fd5b505af1158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190612e23565b50896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a6040516114c191906133fc565b60405180910390a250505050505050505050565b60046020526000908152604090208054600182015460028301546003909301549192909184565b6115046126b0565b6001600160a01b03166115156118f8565b6001600160a01b03161461153b5760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600c6020908152604080832060010154338452600e909252822090915b81548110156115f657428282815481106115a857fe5b90600052602060002090600202016001015411156115c5576115f6565b6115ec8282815481106115d457fe5b6000918252602090912060029091020154849061237a565b9250600101611592565b5050919050565b3360009081526007602052604090205460ff1661162c5760405162461bcd60e51b81526004016107ec9061331b565b6116378160016126b4565b50565b6001600160a01b03811660009081526004602052604081205461165e904290612ac4565b92915050565b61166c6126b0565b6001600160a01b031661167d6118f8565b6001600160a01b0316146116a35760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0383166000908152600460205260409020600201546116c857600080fd5b6001600160a01b03928316600090815260066020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6001600160a01b03166000908152600c602052604090205490565b600860209081526000928352604080842090915290825290205481565b6117426126b0565b6001600160a01b03166117536118f8565b6001600160a01b0316146117795760405162461bcd60e51b81526004016107ec906131ed565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6002546001600160a01b031681565b600381815481106117df57fe5b6000918252602090912001546001600160a01b0316905081565b6118016126b0565b6001600160a01b03166118126118f8565b6001600160a01b0316146118385760405162461bcd60e51b81526004016107ec906131ed565b6002546001600160a01b03838116911614156118665760405162461bcd60e51b81526004016107ec90613252565b6001600160a01b0382166000908152600460205260409020600201541561189f5760405162461bcd60e51b81526004016107ec9061338e565b6118bb6118aa6118f8565b6001600160a01b038416908361253a565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882826040516118ec929190612f14565b60405180910390a15050565b6001546001600160a01b031690565b336000908152600d60209081526040808320600c90925282208154919290914284600019830183811061193657fe5b90600052602060002090600202016001015411611973576002830154336000908152600d6020526040812091935061196e9190612cbb565b6119e8565b60005b818110156119e6574285828154811061198b57fe5b90600052602060002090600202016001015411156119a8576119e6565b6119b78582815481106115d457fe5b92508481815481106119c557fe5b60009182526020822060029091020181815560019081019190915501611976565b505b60028301546119f7908361239f565b60028401558254611a08908361239f565b8355600a54611a17908361239f565b600a55600b54611a27908361239f565b600b55600254611a41906001600160a01b0316338461253a565b50505050565b611a528260006126b4565b5050565b600254600b546000916001600160a01b0316908290611a7583826123f9565b6001600160a01b038416600090815260046020526040902060030155611a9a8361163a565b6001600160a01b03808516600090815260046020526040902060020191909155841615611b46576001600160a01b0384166000908152600c6020526040902060020154611aeb90859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b600354811015611c325760038181548110611b6457fe5b6000918252602090912001546001600160a01b03169350611b8584836123f9565b6001600160a01b038516600090815260046020526040902060030155611baa8461163a565b6001600160a01b03808616600090815260046020526040902060020191909155851615611c2a57611bdd8585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b600101611b4d565b506001600160a01b038616600090815260066020908152604080832033845290915290205460ff16611c765760405162461bcd60e51b81526004016107ec90613222565b60008511611c965760405162461bcd60e51b81526004016107ec9061315e565b611cab6001600160a01b038716333088612ada565b611cb58686612595565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d85604051611ce491906133fc565b60405180910390a1505050505050565b6001600160a01b03811660009081526004602052604081206001015461165e9062093a80612500565b600b5481565b60035460609067ffffffffffffffff81118015611d3f57600080fd5b50604051908082528060200260200182016040528015611d7957816020015b611d66612cdc565b815260200190600190039081611d5e5790505b50905060005b8151811015611e855760008115611dae576001600160a01b0384166000908152600c6020526040902054611dcb565b6001600160a01b0384166000908152600c60205260409020600201545b905060008215611ddd57600a54611de1565b600b545b905060038381548110611df057fe5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110611e1a57fe5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050611e6185858581518110611e4e57fe5b602002602001015160000151848461248e565b848481518110611e6d57fe5b60209081029190910181015101525050600101611d7f565b50919050565b6001600160a01b0381166000908152600e6020526040812060609082805b8254811015611fa75742838281548110611ebf57fe5b9060005260206000209060020201600101541115611f9f5781611f3557825481900367ffffffffffffffff81118015611ef757600080fd5b50604051908082528060200260200182016040528015611f3157816020015b611f1e612ca1565b815260200190600190039081611f165790505b5093505b828181548110611f4157fe5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050848381518110611f7a57fe5b60200260200101819052508180600101925050611f9c83828154811061073557fe5b94505b600101611ea9565b505050915091565b600960209081526000928352604080842090915290825290205481565b600254600b5433916001600160a01b031690600090611feb83826123f9565b6001600160a01b0384166000908152600460205260409020600301556120108361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156120bc576001600160a01b0384166000908152600c602052604090206002015461206190859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156121a857600381815481106120da57fe5b6000918252602090912001546001600160a01b031693506120fb84836123f9565b6001600160a01b0385166000908152600460205260409020600301556121208461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156121a0576121538585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016120c3565b506000806121b5336104da565b336000908152600e602052604081209294509092506121d49190612cbb565b336000908152600c602052604090206003810154600182015482546121fe929161060b919061239f565b8155600060018201819055600382015561222461221b848461237a565b600a549061239f565b600a5560025461223e906001600160a01b0316338561253a565b811561225a5760025461225a906001600160a01b031683612595565b612262610cda565b50505050505050565b60025460009081906001600160a01b0384811691161461228d57600a54612291565b600b545b905061229d83826123f9565b9392505050565b6122ac6126b0565b6001600160a01b03166122bd6118f8565b6001600160a01b0316146122e35760405162461bcd60e51b81526004016107ec906131ed565b6001600160a01b0381166123095760405162461bcd60e51b81526004016107ec90612fc3565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b60008282018381101561229d5760405162461bcd60e51b81526004016107ec90613031565b6000828211156123c15760405162461bcd60e51b81526004016107ec906130aa565b50900390565b60008082116123e85760405162461bcd60e51b81526004016107ec90613127565b8183816123f157fe5b049392505050565b60008161242257506001600160a01b03821660009081526004602052604090206003015461165e565b6001600160a01b0383166000908152600460205260409020600181015460029091015461229d9161246c9185916105e191670de0b6b3a76400009161132091829061060b8c61163a565b6001600160a01b0385166000908152600460205260409020600301549061237a565b6001600160a01b0380851660008181526009602090815260408083209488168084529482528083205493835260088252808320948352939052918220546124f7919061132690670de0b6b3a7640000906105e1906124f09061060b8b8a6123f9565b8890612500565b95945050505050565b60008261250f5750600061165e565b8282028284828161251c57fe5b041461229d5760405162461bcd60e51b81526004016107ec906131ac565b6125908363a9059cbb60e01b8484604051602401612559929190612f14565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612afb565b505050565b6001600160a01b03821660009081526004602052604090205442106125e2576125c18162093a806123c7565b6001600160a01b038316600090815260046020526040902060010155612662565b6001600160a01b038216600090815260046020526040812054612605904261239f565b6001600160a01b03841660009081526004602052604081206001015491925090612630908390612500565b905061264362093a806105e1858461237a565b6001600160a01b03851660009081526004602052604090206001015550505b6001600160a01b03821660009081526004602052604090204260029091018190556126909062093a8061237a565b6001600160a01b0390921660009081526004602052604090209190915550565b3390565b600260005414156126d75760405162461bcd60e51b81526004016107ec906133c5565b600260008181559054600b5433926001600160a01b0390921691906126fc83826123f9565b6001600160a01b0384166000908152600460205260409020600301556127218361163a565b6001600160a01b038085166000908152600460205260409020600201919091558416156127cd576001600160a01b0384166000908152600c602052604090206002015461277290859085908461248e565b6001600160a01b0380861660008181526009602090815260408083209489168084529482528083209590955560048152848220600301548383526008825285832094835293815284822093909355908152600c909152205491505b50600a5460015b6003548110156128b957600381815481106127eb57fe5b6000918252602090912001546001600160a01b0316935061280c84836123f9565b6001600160a01b0385166000908152600460205260409020600301556128318461163a565b6001600160a01b038086166000908152600460205260409020600201919091558516156128b1576128648585858561248e565b6001600160a01b038087166000818152600960209081526040808320948a168084529482528083209590955560048152848220600301549282526008815284822093825292909252919020555b6001016127d4565b50600086116128da5760405162461bcd60e51b81526004016107ec90613009565b600a546128e7908761237a565b600a55336000908152600c602052604090208054612905908861237a565b81558515612a4857600b5461291a908861237a565b600b55600281015461292c908861237a565b6002820155600061294b6277f88061132662093a8061132042826123c7565b336000908152600d602052604090205490915080158061299c5750336000908152600d602052604090208054839190600019840190811061298857fe5b906000526020600020906002020160010154105b156129eb57336000908152600d6020908152604080832081518083019092528c825281830186815281546001818101845592865293909420915160029093029091019182559151910155612a41565b336000908152600d602052604090208054612a10918b9160001985019081106113cb57fe5b336000908152600d6020526040902080546000198401908110612a2f57fe5b60009182526020909120600290910201555b5050612a5d565b6001810154612a57908861237a565b60018201555b600254612a75906001600160a01b031633308a612ada565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d88604051612aae91906133fc565b60405180910390a2505060016000555050505050565b6000818310612ad3578161229d565b5090919050565b611a41846323b872dd60e01b85858560405160240161255993929190612ef0565b6060612b50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b8a9092919063ffffffff16565b8051909150156125905780806020019051810190612b6e9190612e23565b6125905760405162461bcd60e51b81526004016107ec90613344565b6060612b998484600085612ba1565b949350505050565b606082471015612bc35760405162461bcd60e51b81526004016107ec906130e1565b612bcc85612c62565b612be85760405162461bcd60e51b81526004016107ec906132e4565b60006060866001600160a01b03168587604051612c059190612ec0565b60006040518083038185875af1925050503d8060008114612c42576040519150601f19603f3d011682016040523d82523d6000602084013e612c47565b606091505b5091509150612c57828286612c68565b979650505050505050565b3b151590565b60608315612c7757508161229d565b825115612c875782518084602001fd5b8160405162461bcd60e51b81526004016107ec9190612f90565b604051806040016040528060008152602001600081525090565b50805460008255600202906000526020600020908101906116379190612cf3565b604080518082019091526000808252602082015290565b5b80821115612d0e5760008082556001820155600201612cf4565b5090565b80356001600160a01b038116811461165e57600080fd5b600060208284031215612d3a578081fd5b61229d8383612d12565b60008060408385031215612d56578081fd5b612d608484612d12565b9150612d6f8460208501612d12565b90509250929050565b600080600060608486031215612d8c578081fd5b8335612d97816134a2565b92506020840135612da7816134a2565b91506040840135612db7816134b7565b809150509250925092565b60008060408385031215612dd4578182fd5b612dde8484612d12565b91506020830135612dee816134b7565b809150509250929050565b60008060408385031215612e0b578182fd5b612e158484612d12565b946020939093013593505050565b600060208284031215612e34578081fd5b815161229d816134b7565b600060208284031215612e50578081fd5b5035919050565b60008060408385031215612e69578182fd5b823591506020830135612dee816134b7565b6000815180845260208085019450808401835b83811015612eb5578151805188528301518388015260409096019590820190600101612e8e565b509495945050505050565b60008251612ed2818460208701613476565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612f7857815180516001600160a01b03168552860151868501529284019290850190600101612f4a565b5091979650505050505050565b901515815260200190565b6000602082528251806020840152612faf816040850160208701613476565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526022908201527f496e73756666696369656e742062616c616e63652061667465722070656e616c604082015261747960f01b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152752737ba103932bbb0b932103234b9ba3934b13aba37b960511b604082015260600190565b6020808252601d908201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604082015260600190565b6020808252600a90820152693737ba1036b4b73a32b960b11b604082015260600190565b6020808252601d908201527f496e73756666696369656e7420756e6c6f636b65642062616c616e6365000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e1b9bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b600083825260406020830152612b996040830184612e7b565b918252602082015260400190565b6000858252846020830152836040830152608060608301526134516080830184612e7b565b9695505050505050565b93845260208401929092526040830152606082015260800190565b60005b83811015613491578181015183820152602001613479565b83811115611a415750506000910152565b6001600160a01b038116811461163757600080fd5b801515811461163757600080fdfea264697066735822122015122e078b49712b731404fc10d39d617e4dfa88e55acabeb8e8f6019e78717c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000009ad12552ec45f82be90b38dfe7b06332a6808640000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000047d3dcad6e47c519238cbe50da43e6a53c49cfc2
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x09ad12552ec45f82bE90B38dFE7b06332A680864
Arg [1] : _minters (address[]): 0x47D3DCaD6e47C519238Cbe50DA43e6a53C49CFC2
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000009ad12552ec45f82be90b38dfe7b06332a680864
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000047d3dcad6e47c519238cbe50da43e6a53c49cfc2
Deployed Bytecode Sourcemap
28683:20071:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36979:912;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29659:59;;;:::i;:::-;;;;;;;:::i;36061:828::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30252:26::-;;;:::i;29997:52::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40935:1995::-;;;;;;:::i;:::-;;:::i;:::-;;29552:51;;;:::i;29879:69::-;;;;;;:::i;:::-;;:::i;42980:504::-;;;:::i;31215:379::-;;;;;;:::i;:::-;;:::i;39858:875::-;;;;;;:::i;:::-;;:::i;29451:44::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;31966:192::-;;;;;;:::i;:::-;;:::i;34741:442::-;;;;;;:::i;:::-;;:::i;38151:279::-;;;;;;:::i;:::-;;:::i;33110:178::-;;;;;;:::i;:::-;;:::i;31668:290::-;;;;;;:::i;:::-;;:::i;34531:121::-;;;;;;:::i;:::-;;:::i;30097:77::-;;;;;;:::i;:::-;;:::i;25112:148::-;;;:::i;29374:34::-;;;:::i;:::-;;;;;;;:::i;29415:29::-;;;;;;:::i;:::-;;:::i;46627:396::-;;;;;;:::i;:::-;;:::i;24461:87::-;;;:::i;44257:906::-;;;:::i;38049:94::-;;;;;;:::i;:::-;;:::i;45933:579::-;;;;;;:::i;:::-;;:::i;33544:168::-;;;;;;:::i;:::-;;:::i;30285:27::-;;;:::i;33800:641::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35317:688::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30181:62::-;;;;;;:::i;:::-;;:::i;43557:614::-;;;:::i;33296:240::-;;;;;;:::i;:::-;;:::i;25415:244::-;;;;;;:::i;:::-;;:::i;29767:39::-;;;;;;:::i;:::-;;:::i;36979:912::-;-1:-1:-1;;;;;37157:14:0;;37069;37157;;;:8;:14;;;;;37186:10;;;;37069:14;;37157;37186;37182:594;;-1:-1:-1;;;;;37277:18:0;;37217:28;37277:18;;;:12;:18;;;;;:25;37217:28;37317:372;37338:6;37334:1;:10;37317:372;;;-1:-1:-1;;;;;37393:18:0;;37370:20;37393:18;;;:12;:18;;;;;:21;;37412:1;;37393:21;;;;;;;;;;;;;;;;:28;;;37370:51;;37444:12;37460:1;37444:17;37440:31;;;37463:8;;;37440:31;-1:-1:-1;;;;;37494:18:0;;;;;;:12;:18;;;;;:21;;37529:15;;37494:18;37513:1;;37494:21;;;;;;;;;;;;;;;;:32;;;:50;37490:104;;;37569:5;;;37490:104;37635:38;:20;37660:12;37635:24;:38::i;:::-;37612:61;;37317:372;;37346:3;;37317:372;;;;37721:43;37762:1;37721:36;37736:20;37721:3;:10;;;:14;;:36;;;;:::i;:::-;:40;;:43::i;:::-;37705:59;;37182:594;;;37795:47;37828:13;37795:28;37812:3;:10;;;37795:3;:12;;;:16;;:28;;;;:::i;:::-;:32;;:47::i;:::-;37786:56;;37853:30;36979:912;;;:::o;29659:59::-;29698:20;29659:59;:::o;36061:828::-;-1:-1:-1;;;;;36308:15:0;;36148:13;36308:15;;;:9;:15;;;;;36148:13;;;;36226:31;;36148:13;;36356:455;36377:12;;36373:16;;36356:455;;;36437:15;36415:5;36421:1;36415:8;;;;;;;;;;;;;;;;;;:19;;;:37;36411:389;;;36477:8;36473:105;;36541:12;;:16;;;36521:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36510:48;;36473:105;36612:5;36618:1;36612:8;;;;;;;;;;;;;;;;;;36596:24;;;;;;;;;;;;;;;;;;;;;;;;;:8;36605:3;36596:13;;;;;;;;;;;;;:24;;;;36639:5;;;;;;;36672:27;36683:5;36689:1;36683:8;;;;;;;;;;;;;;;;;;;;;:15;36672:6;;:10;:27::i;:::-;36663:36;;36411:389;;;36753:31;36768:5;36774:1;36768:8;;;;;;;;;;;;;;;;;;;;;:15;36753:10;;:14;:31::i;:::-;36740:44;;36411:389;36391:3;;36356:455;;;-1:-1:-1;;;;;;;;36829:14:0;;;;;;:8;:14;;;;;:21;;;;-1:-1:-1;36061:828:0;;;;;:::o;30252:26::-;;;;:::o;29997:52::-;;;;;;;;;;;;;;;:::o;40935:1995::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;;;;;;;;;27319:1;28058:7;:18;;;47150:12;;47217::::1;::::0;41002:10:::1;::::0;-1:-1:-1;;;;;47150:12:0;;::::1;::::0;28058:7;47281:30:::1;47150:12:::0;47217;47281:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47240:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47357:31:::1;47251:5:::0;47357:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47322:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47403:21;::::1;::::0;47399:370:::1;;-1:-1:-1::0;;;;;47582:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;47558:57:::1;::::0;47566:7;;47575:5;;47608:6;47558:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;47532:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;47671:10:::1;:17:::0;;;;;:38:::1;;::::0;47630:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;47399:370:0::1;-1:-1:-1::0;47790:11:0::1;::::0;47826:1:::1;47812:504;47833:12;:19:::0;47829:23;::::1;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47882:15:0::1;::::0;-1:-1:-1;47953:30:0::1;47882:15:::0;47976:6;47953:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47912:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;48033:31:::1;47923:5:::0;48033:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47998:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;48083:21;::::1;::::0;48079:226:::1;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1::0;;;;;48125:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;48251:10:::1;:17:::0;;;;;:38:::1;;::::0;48210:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;48079:226:::1;47854:3;;47812:504;;;;41042:1:::2;41033:6;:10;41025:40;;;;-1:-1:-1::0;;;41025:40:0::2;;;;;;;:::i;:::-;41108:10;41076:20;41099::::0;;;:8:::2;:20;::::0;;;;41178:12:::2;::::0;::::2;::::0;41099:20;;41076;41168:22;::::2;41164:1376;;41222:12;::::0;::::2;::::0;:24:::2;::::0;41239:6;41222:16:::2;:24::i;:::-;41207:12;::::0;::::2;:39:::0;41164:1376:::2;;;41279:17;41299:24;41310:3;:12;;;41299:6;:10;;:24;;;;:::i;:::-;41279:44;;41360:9;41346:3;:10;;;:23;;41338:65;;;;-1:-1:-1::0;;;41338:65:0::2;;;;;;;:::i;:::-;41433:1;41418:12;::::0;::::2;:16:::0;41462:10:::2;::::0;::::2;::::0;:25:::2;::::0;41477:9;41462:14:::2;:25::i;:::-;41449:10;::::0;::::2;:38:::0;41507:6:::2;41502:1027;41581:10;41545:20;41568:24:::0;;;:12:::2;:24;::::0;;;;:27;;41593:1;;41568:27;::::2;;;;;;;;;;;;;;;:34;;;41545:57;;41625:12;41641:1;41625:17;41621:31;;;41644:8;;;41621:31;41675:18:::0;;:78;::::2;;;-1:-1:-1::0;41710:10:0::2;41697:24;::::0;;;:12:::2;:24;::::0;;;;:27;;41738:15:::2;::::0;41697:24;41722:1;;41697:27;::::2;;;;;;;;;;;;;;;:38;;;:56;41675:78;41671:514;;;41794:9;41778:25;;41848:9;41834:3;:10;;;:23;;41826:70;;;;-1:-1:-1::0;;;41826:70:0::2;;;;;;;:::i;:::-;41932:10;::::0;::::2;::::0;:25:::2;::::0;41947:9;41932:14:::2;:25::i;:::-;41919:10;::::0;::::2;:38:::0;;;41980:135:::2;;42048:10;42035:24;::::0;;;:12:::2;:24;::::0;;;;42028:31:::2;::::0;::::2;:::i;:::-;42086:5;;;41980:135;42149:16;:9:::0;42163:1:::2;42149:13;:16::i;:::-;42137:28;;41671:514;42220:12;42207:9;:25;42203:311;;42294:27;:12:::0;42311:9;42294:16:::2;:27::i;:::-;42270:10;42257:24;::::0;;;:12:::2;:24;::::0;;;;:27;;42282:1;;42257:27;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:64:::0;-1:-1:-1;42344:5:0::2;;42203:311;42418:10;42405:24;::::0;;;:12:::2;:24;::::0;;;;:27;;42430:1;;42405:27;::::2;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;42398:34:::0;;;::::2;;::::0;42467:27:::2;:9:::0;42481:12;42467:13:::2;:27::i;:::-;42455:39;;41502:1027;;41521:3;;41502:1027;;;;41164:1376;;42552:22;42577:25;:6:::0;42588:13;42577:10:::2;:25::i;:::-;42625:9:::0;;42552:50;;-1:-1:-1;42625:29:0::2;::::0;42552:50;42625:13:::2;:29::i;:::-;42613:41:::0;;42679:11:::2;::::0;:31:::2;::::0;42695:14;42679:15:::2;:31::i;:::-;42665:11;:45:::0;42721:12:::2;::::0;:45:::2;::::0;-1:-1:-1;;;;;42721:12:0::2;42747:10;42759:6:::0;42721:25:::2;:45::i;:::-;42781:17:::0;;42777:101:::2;;42837:12;::::0;42815:51:::2;::::0;-1:-1:-1;;;;;42837:12:0::2;42852:13:::0;42815::::2;:51::i;:::-;42903:10;-1:-1:-1::0;;;;;42893:29:0::2;;42915:6;42893:29;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;;;;40935:1995:0:o;29552:51::-;29594:9;29552:51;:::o;29879:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42980:504::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;27319:1;28058:7;:18;;;47150:12;;47217::::1;::::0;43034:10:::1;::::0;-1:-1:-1;;;;;47150:12:0;;::::1;::::0;28058:7;47281:30:::1;47150:12:::0;47217;47281:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47240:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47357:31:::1;47251:5:::0;47357:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47322:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47403:21;::::1;::::0;47399:370:::1;;-1:-1:-1::0;;;;;47582:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;47558:57:::1;::::0;47566:7;;47575:5;;47608:6;47558:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;47532:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;47671:10:::1;:17:::0;;;;;:38:::1;;::::0;47630:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;47399:370:0::1;-1:-1:-1::0;47790:11:0::1;::::0;47826:1:::1;47812:504;47833:12;:19:::0;47829:23;::::1;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47882:15:0::1;::::0;-1:-1:-1;47953:30:0::1;47882:15:::0;47976:6;47953:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47912:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;48033:31:::1;47923:5:::0;48033:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47998:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;48083:21;::::1;::::0;48079:226:::1;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1::0;;;;;48125:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;48251:10:::1;:17:::0;;;;;:38:::1;;::::0;48210:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;48079:226:::1;47854:3;;47812:504;;;;43062:6:::2;43057:420;43074:12;:19:::0;43070:23;::::2;43057:420;;;43115:21;43139:12;43152:1;43139:15;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;43194:10:::2;43186:19:::0;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;43139:15:0;;::::2;43186:34:::0;;;;;;;;;;43139:15;;-1:-1:-1;43239:10:0;;43235:231:::2;;43278:10;43307:1;43270:19:::0;;;:7:::2;:19;::::0;;;;;;;-1:-1:-1;;;;;43270:34:0;::::2;::::0;;;;;;;:38;;;;43327:54:::2;::::0;43374:6;43327:34:::2;:54::i;:::-;43428:13;-1:-1:-1::0;;;;;43405:45:0::2;43416:10;-1:-1:-1::0;;;;;43405:45:0::2;;43443:6;43405:45;;;;;;:::i;:::-;;;;;;;;43235:231;-1:-1:-1::0;;43095:3:0::2;;43057:420;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;42980:504:0:o;31215:379::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31363:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;:45;31355:54:::1;;;::::0;::::1;;31420:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;31420:32:0::1;-1:-1:-1::0;;;;;31420:32:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;31463:25:0;;;:10:::1;31420:32;31463:25:::0;;;;;;;31506:15:::1;31463:40;::::0;;::::1;:58:::0;31532:18:::1;:33:::0;;;;;:47;;;::::1;::::0;;;;;;;;;:54;;-1:-1:-1;;31532:54:0::1;::::0;;::::1;::::0;;31215:379::o;39858:875::-;47150:12;;47217;;39924:4;;-1:-1:-1;;;;;47150:12:0;;47126:13;;47281:30;47150:12;47217;47281:15;:30::i;:::-;-1:-1:-1;;;;;47240:17:0;;;;;;:10;:17;;;;;:38;;:71;47357:31;47251:5;47357:24;:31::i;:::-;-1:-1:-1;;;;;47322:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;47403:21;;;47399:370;;-1:-1:-1;;;;;47582:17:0;;;;;;:8;:17;;;;;:24;;;47558:57;;47566:7;;47575:5;;47608:6;47558:7;:57::i;:::-;-1:-1:-1;;;;;47532:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;47671:10;:17;;;;;:38;;;47630:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8;:17;;;;:23;;-1:-1:-1;47399:370:0;-1:-1:-1;47790:11:0;;47826:1;47812:504;47833:12;:19;47829:23;;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47882:15:0;;-1:-1:-1;47953:30:0;47882:15;47976:6;47953:15;:30::i;:::-;-1:-1:-1;;;;;47912:17:0;;;;;;:10;:17;;;;;:38;;:71;48033:31;47923:5;48033:24;:31::i;:::-;-1:-1:-1;;;;;47998:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;48083:21;;;48079:226;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1;;;;;48125:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;48251:10;:17;;;;;:38;;;48210:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;48079:226;47854:3;;47812:504;;;-1:-1:-1;39957:10:0::1;39949:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;39941:42;;;;-1:-1:-1::0;;;39941:42:0::1;;;;;;;:::i;:::-;40008:11;::::0;:23:::1;::::0;40024:6;40008:15:::1;:23::i;:::-;39994:11;:37:::0;-1:-1:-1;;;;;40065:14:0;::::1;40042:20;40065:14:::0;;;:8:::1;:14;::::0;;;;40102:9;;:21:::1;::::0;40116:6;40102:13:::1;:21::i;:::-;40090:33:::0;;40147:10:::1;::::0;::::1;::::0;:22:::1;::::0;40162:6;40147:14:::1;:22::i;:::-;40134:10;::::0;::::1;:35:::0;40180:18:::1;40201:75;29698:20:::0;40201:57:::1;29594:9;40201:36;:15;29594:9:::0;40201:19:::1;:36::i;:::-;:40:::0;::::1;:57::i;:::-;:61:::0;::::1;:75::i;:::-;-1:-1:-1::0;;;;;40322:18:0;::::1;40287:32;40322:18:::0;;;:12:::1;:18;::::0;;;;40365:15;;40180:96;;-1:-1:-1;40322:18:0;40397:8;;;:51:::1;;;40438:10;40409:8;40422:1;40418:3;:5;40409:15;;;;;;;;;;;;;;;;;;:26;;;:39;40397:51;40393:246;;;40479:55;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;40465:70;;::::1;::::0;;::::1;::::0;;-1:-1:-1;40465:70:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;40393:246:::1;;;40593:34;40620:6;40593:8;40606:1;40602:3;:5;40593:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:22:::0;;:26:::1;:34::i;:::-;40568:8;40581:1;40577:3;:5;40568:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:59:::0;40393:246:::1;40649:12;::::0;:40:::1;::::0;-1:-1:-1;;;40649:40:0;;-1:-1:-1;;;;;40649:12:0;;::::1;::::0;:17:::1;::::0;:40:::1;::::0;40675:4:::1;::::0;40682:6;;40649:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40712:4;-1:-1:-1::0;;;;;40705:20:0::1;;40718:6;40705:20;;;;;;:::i;:::-;;;;;;;;48326:1;;;;39858:875:::0;;;;;;:::o;29451:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31966:192::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32108:30:0;;;::::1;;::::0;;;:20:::1;:30;::::0;;;;:42;;-1:-1:-1;;32108:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31966:192::o;34741:442::-;-1:-1:-1;;;;;34839:14:0;;34803;34839;;;:8;:14;;;;;;;;:23;;;34921:10;34908:24;;:12;:24;;;;;34839:23;;34943:209;34964:15;;34960:19;;34943:209;;;35030:15;35005:8;35014:1;35005:11;;;;;;;;;;;;;;;;;;:22;;;:40;35001:86;;;35066:5;;35001:86;35110:30;35121:8;35130:1;35121:11;;;;;;;;;;;;;;;;;;;;;:18;35110:6;;:10;:30::i;:::-;35101:39;-1:-1:-1;34981:3:0;;34943:209;;;;35162:13;34741:442;;;:::o;38151:279::-;38360:10;38339:32;;;;:20;:32;;;;;;;;38331:60;;;;-1:-1:-1;;;38331:60:0;;;;;;;:::i;:::-;38402:20;38409:6;38417:4;38402:6;:20::i;:::-;38151:279;:::o;33110:178::-;-1:-1:-1;;;;;33241:25:0;;33188:7;33241:25;;;:10;:25;;;;;:38;33215:65;;33224:15;;33215:8;:65::i;:::-;33208:72;33110:178;-1:-1:-1;;33110:178:0:o;31668:290::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31835:25:0;::::1;31878:1;31835:25:::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;31827:53:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;31891:33:0;;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;:47;;;::::1;::::0;;;;;;;;;:59;;-1:-1:-1;;31891:59:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31668:290::o;34531:121::-;-1:-1:-1;;;;;34624:14:0;34590;34624;;;:8;:14;;;;;:20;;34531:121::o;30097:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25112:148::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;25203:6:::1;::::0;25182:40:::1;::::0;25219:1:::1;::::0;-1:-1:-1;;;;;25203:6:0::1;::::0;25182:40:::1;::::0;25219:1;;25182:40:::1;25233:6;:19:::0;;-1:-1:-1;;;;;;25233:19:0::1;::::0;;25112:148::o;29374:34::-;;;-1:-1:-1;;;;;29374:34:0;;:::o;29415:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29415:29:0;;-1:-1:-1;29415:29:0;:::o;46627:396::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;46754:12:::1;::::0;-1:-1:-1;;;;;46730:37:0;;::::1;46754:12:::0;::::1;46730:37;;46722:79;;;;-1:-1:-1::0;;;46722:79:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46820:24:0;::::1;;::::0;;;:10:::1;:24;::::0;;;;:39:::1;;::::0;:44;46812:85:::1;;;;-1:-1:-1::0;;;46812:85:0::1;;;;;;;:::i;:::-;46908:55;46942:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;46908:33:0;::::1;::::0;46951:11;46908:33:::1;:55::i;:::-;46979:36;46989:12;47003:11;46979:36;;;;;;;:::i;:::-;;;;;;;;46627:396:::0;;:::o;24461:87::-;24534:6;;-1:-1:-1;;;;;24534:6:0;24461:87;:::o;44257:906::-;44351:10;44309:29;44341:21;;;:9;:21;;;;;;;;44396:8;:20;;;;;44469:12;;44341:21;;44396:20;;44526:15;44341:21;-1:-1:-1;;44502:8:0;;44496:15;;;;;;;;;;;;;;;;;:26;;;:45;44492:420;;44609:10;;;;44651;44641:21;;;;:9;:21;;;;;44609:10;;-1:-1:-1;44634:28:0;;44641:21;44634:28;:::i;:::-;44492:420;;;44700:6;44695:206;44716:6;44712:1;:10;44695:206;;;44774:15;44752:5;44758:1;44752:8;;;;;;;;;;;;;;;;;;:19;;;:37;44748:48;;;44791:5;;44748:48;44824:27;44835:5;44841:1;44835:8;;;;;;;44824:27;44815:36;;44877:5;44883:1;44877:8;;;;;;;;;;;;;;;;;;;;44870:15;;;;;;;;;;;44724:3;44695:206;;;;44492:420;44935:10;;;;:22;;44950:6;44935:14;:22::i;:::-;44922:10;;;:35;44980:9;;:21;;44994:6;44980:13;:21::i;:::-;44968:33;;45026:11;;:23;;45042:6;45026:15;:23::i;:::-;45012:11;:37;45075:12;;:24;;45092:6;45075:16;:24::i;:::-;45060:12;:39;45110:12;;:45;;-1:-1:-1;;;;;45110:12:0;45136:10;45148:6;45110:25;:45::i;:::-;44257:906;;;;:::o;38049:94::-;38114:21;38121:6;38129:5;38114:6;:21::i;:::-;38049:94;;:::o;45933:579::-;47150:12;;47217;;46030:1;;-1:-1:-1;;;;;47150:12:0;;46030:1;;47281:30;47150:12;47217;47281:15;:30::i;:::-;-1:-1:-1;;;;;47240:17:0;;;;;;:10;:17;;;;;:38;;:71;47357:31;47251:5;47357:24;:31::i;:::-;-1:-1:-1;;;;;47322:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;47403:21;;;47399:370;;-1:-1:-1;;;;;47582:17:0;;;;;;:8;:17;;;;;:24;;;47558:57;;47566:7;;47575:5;;47608:6;47558:7;:57::i;:::-;-1:-1:-1;;;;;47532:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;47671:10;:17;;;;;:38;;;47630:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8;:17;;;;:23;;-1:-1:-1;47399:370:0;-1:-1:-1;47790:11:0;;47826:1;47812:504;47833:12;:19;47829:23;;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47882:15:0;;-1:-1:-1;47953:30:0;47882:15;47976:6;47953:15;:30::i;:::-;-1:-1:-1;;;;;47912:17:0;;;;;;:10;:17;;;;;:38;;:71;48033:31;47923:5;48033:24;:31::i;:::-;-1:-1:-1;;;;;47998:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;48083:21;;;48079:226;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1;;;;;48125:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;48251:10;:17;;;;;:38;;;48210:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;48079:226;47854:3;;47812:504;;;-1:-1:-1;;;;;;46053:33:0;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;46087:10:::1;46053:45:::0;;;;;;;;::::1;;46045:80;;;;-1:-1:-1::0;;;46045:80:0::1;;;;;;;:::i;:::-;46153:1;46144:6;:10;46136:32;;;;-1:-1:-1::0;;;46136:32:0::1;;;;;;;:::i;:::-;46349:73;-1:-1:-1::0;;;;;46349:38:0;::::1;46388:10;46408:4;46415:6:::0;46349:38:::1;:73::i;:::-;46433:36;46447:13;46462:6;46433:13;:36::i;:::-;46485:19;46497:6;46485:19;;;;;;:::i;:::-;;;;;;;;45933:579:::0;;;;;;:::o;33544:168::-;-1:-1:-1;;;;;33647:25:0;;33620:7;33647:25;;;:10;:25;;;;;:36;;;:57;;29594:9;33647:40;:57::i;30285:27::-;;;;:::o;33800:641::-;33933:12;:19;33866:27;;33916:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;33906:47;;33969:9;33964:445;33988:7;:14;33984:1;:18;33964:445;;;34118:15;34136:6;;:59;;-1:-1:-1;;;;;34172:17:0;;;;;;:8;:17;;;;;:23;34136:59;;;-1:-1:-1;;;;;34145:17:0;;;;;;:8;:17;;;;;:24;;;34136:59;34118:77;-1:-1:-1;34210:14:0;34227:6;;:35;;34251:11;;34227:35;;;34236:12;;34227:35;34210:52;;34296:12;34309:1;34296:15;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34296:15:0;34277:7;34285:1;34277:10;;;;;;;;;;;;;;:16;;:34;-1:-1:-1;;;;;34277:34:0;;;-1:-1:-1;;;;;34277:34:0;;;;;34346:51;34354:7;34363;34371:1;34363:10;;;;;;;;;;;;;;:16;;;34381:7;34390:6;34346:7;:51::i;:::-;34326:7;34334:1;34326:10;;;;;;;;;;;;;;;;;;;:17;:71;-1:-1:-1;;34004:3:0;;33964:445;;;;33800:641;;;:::o;35317:688::-;-1:-1:-1;;;;;35517:18:0;;35404:13;35517:18;;;:12;:18;;;;;35428:35;;35404:13;;35568:391;35589:15;;35585:19;;35568:391;;;35655:15;35630:8;35639:1;35630:11;;;;;;;;;;;;;;;;;;:22;;;:40;35626:322;;;35695:8;35691:112;;35763:15;;:19;;;35743:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;35728:55;;35691:112;35841:8;35850:1;35841:11;;;;;;;;;;;;;;;;;;35821:31;;;;;;;;;;;;;;;;;;;;;;;;;:12;35834:3;35821:17;;;;;;;;;;;;;:31;;;;35871:5;;;;;;;35903:29;35913:8;35922:1;35913:11;;;;;;;35903:29;35895:37;;35626:322;35606:3;;35568:391;;;;35969:28;;35317:688;;;:::o;30181:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;43557:614::-;47150:12;;47217;;43595:10;;-1:-1:-1;;;;;47150:12:0;;47126:13;;47281:30;47150:12;47217;47281:15;:30::i;:::-;-1:-1:-1;;;;;47240:17:0;;;;;;:10;:17;;;;;:38;;:71;47357:31;47251:5;47357:24;:31::i;:::-;-1:-1:-1;;;;;47322:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;47403:21;;;47399:370;;-1:-1:-1;;;;;47582:17:0;;;;;;:8;:17;;;;;:24;;;47558:57;;47566:7;;47575:5;;47608:6;47558:7;:57::i;:::-;-1:-1:-1;;;;;47532:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;47671:10;:17;;;;;:38;;;47630:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8;:17;;;;:23;;-1:-1:-1;47399:370:0;-1:-1:-1;47790:11:0;;47826:1;47812:504;47833:12;:19;47829:23;;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47882:15:0;;-1:-1:-1;47953:30:0;47882:15;47976:6;47953:15;:30::i;:::-;-1:-1:-1;;;;;47912:17:0;;;;;;:10;:17;;;;;:38;;:71;48033:31;47923:5;48033:24;:31::i;:::-;-1:-1:-1;;;;;47998:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;48083:21;;;48079:226;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1;;;;;48125:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;48251:10;:17;;;;;:38;;;48210:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;48079:226;47854:3;;47812:504;;;;43619:14:::1;43635:21:::0;43660:31:::1;43680:10;43660:19;:31::i;:::-;43722:10;43709:24;::::0;;;:12:::1;:24;::::0;;;;43618:73;;-1:-1:-1;43618:73:0;;-1:-1:-1;43702:31:0::1;::::0;43709:24;43702:31:::1;:::i;:::-;43776:10;43744:20;43767::::0;;;:8:::1;:20;::::0;;;;43842:10:::1;::::0;::::1;::::0;43824:12:::1;::::0;::::1;::::0;43810:9;;:43:::1;::::0;43842:10;43810:27:::1;::::0;:9;:13:::1;:27::i;:43::-;43798:55:::0;;:9:::1;43864:12;::::0;::::1;:16:::0;;;43891:10:::1;::::0;::::1;:14:::0;43932:42:::1;43948:25;:6:::0;43959:13;43948:10:::1;:25::i;:::-;43932:11;::::0;;:15:::1;:42::i;:::-;43918:11;:56:::0;43985:12:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;43985:12:0::1;44011:10;44023:6:::0;43985:25:::1;:45::i;:::-;44045:17:::0;;44041:101:::1;;44101:12;::::0;44079:51:::1;::::0;-1:-1:-1;;;;;44101:12:0::1;44116:13:::0;44079::::1;:51::i;:::-;44152:11;:9;:11::i;:::-;48326:1;;;43557:614:::0;;;;:::o;33296:240::-;33428:12;;33366:7;;;;-1:-1:-1;;;;;33403:38:0;;;33428:12;;33403:38;:67;;33459:11;;33403:67;;;33444:12;;33403:67;33386:84;;33488:38;33504:13;33519:6;33488:15;:38::i;:::-;33481:45;33296:240;-1:-1:-1;;;33296:240:0:o;25415:244::-;24692:12;:10;:12::i;:::-;-1:-1:-1;;;;;24681:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24681:23:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25504:22:0;::::1;25496:73;;;;-1:-1:-1::0;;;25496:73:0::1;;;;;;;:::i;:::-;25606:6;::::0;25585:38:::1;::::0;-1:-1:-1;;;;;25585:38:0;;::::1;::::0;25606:6:::1;::::0;25585:38:::1;::::0;25606:6:::1;::::0;25585:38:::1;25634:6;:17:::0;;-1:-1:-1;;;;;;25634:17:0::1;-1:-1:-1::0;;;;;25634:17:0;;;::::1;::::0;;;::::1;::::0;;25415:244::o;29767:39::-;;;;;;;;;;;;;;;:::o;5524:179::-;5582:7;5614:5;;;5638:6;;;;5630:46;;;;-1:-1:-1;;;5630:46:0;;;;;;;:::i;5986:158::-;6044:7;6077:1;6072;:6;;6064:49;;;;-1:-1:-1;;;6064:49:0;;;;;;;:::i;:::-;-1:-1:-1;6131:5:0;;;5986:158::o;7101:153::-;7159:7;7191:1;7187;:5;7179:44;;;;-1:-1:-1;;;7179:44:0;;;;;;;:::i;:::-;7245:1;7241;:5;;;;;;;7101:153;-1:-1:-1;;;7101:153:0:o;32207:526::-;32295:7;32319:12;32315:98;;-1:-1:-1;;;;;;32355:25:0;;;;;;:10;:25;;;;;:46;;;32348:53;;32315:98;-1:-1:-1;;;;;32650:25:0;;;;;;:10;:25;;;;;:36;;;;32578:40;;;;;32443:282;;32512:198;;32702:7;;32512:185;;32692:4;;32512:175;;;;:39;32661:13;32512:24;:39::i;:198::-;-1:-1:-1;;;;;32443:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:282::i;32741:361::-;-1:-1:-1;;;;;33064:14:0;;;32896:7;33064:14;;;:7;:14;;;;;;;;:29;;;;;;;;;;;;;32993;;;:22;:29;;;;;:44;;;;;;;;;;32923:171;;33064:29;32923:136;;33054:4;;32923:126;;32950:88;;:38;33079:13;32981:6;32950:15;:38::i;:88::-;32923:8;;:12;:126::i;:171::-;32916:178;32741:361;-1:-1:-1;;;;;32741:361:0:o;6403:220::-;6461:7;6485:6;6481:20;;-1:-1:-1;6500:1:0;6493:8;;6481:20;6524:5;;;6528:1;6524;:5;:1;6548:5;;;;;:10;6540:56;;;;-1:-1:-1;;;6540:56:0;;;;;;;:::i;18696:177::-;18779:86;18799:5;18829:23;;;18854:2;18858:5;18806:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18806:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18806:58:0;-1:-1:-1;;;;;;18806:58:0;;;;;;;;;;18779:19;:86::i;:::-;18696:177;;;:::o;45227:698::-;-1:-1:-1;;;;;45332:25:0;;;;;;:10;:25;;;;;:38;45313:15;:57;45309:448;;45426:27;:6;29594:9;45426:10;:27::i;:::-;-1:-1:-1;;;;;45387:25:0;;;;;;:10;:25;;;;;:36;;:66;45309:448;;;-1:-1:-1;;;;;45506:25:0;;45486:17;45506:25;;;:10;:25;;;;;:38;:59;;45549:15;45506:42;:59::i;:::-;-1:-1:-1;;;;;45613:25:0;;45580:16;45613:25;;;:10;:25;;;;;:36;;;45486:79;;-1:-1:-1;45580:16:0;45599:51;;45486:79;;45599:13;:51::i;:::-;45580:70;-1:-1:-1;45704:41:0;29594:9;45704:20;:6;45580:70;45704:10;:20::i;:41::-;-1:-1:-1;;;;;45665:25:0;;;;;;:10;:25;;;;;:36;;:80;-1:-1:-1;;45309:448:0;-1:-1:-1;;;;;45769:25:0;;;;;;:10;:25;;;;;45812:15;45769:40;;;;:58;;;45879:36;;29594:9;45879:19;:36::i;:::-;-1:-1:-1;;;;;45838:25:0;;;;;;;:10;:25;;;;;:77;;;;-1:-1:-1;45227:698:0:o;23088:106::-;23176:10;23088:106;:::o;38587:1113::-;27319:1;27925:7;;:19;;27917:63;;;;-1:-1:-1;;;27917:63:0;;;;;;;:::i;:::-;27319:1;28058:7;:18;;;47150:12;;47217::::1;::::0;38665:10:::1;::::0;-1:-1:-1;;;;;47150:12:0;;::::1;::::0;28058:7;47281:30:::1;47150:12:::0;47217;47281:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47240:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;47357:31:::1;47251:5:::0;47357:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47322:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;47403:21;::::1;::::0;47399:370:::1;;-1:-1:-1::0;;;;;47582:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;47558:57:::1;::::0;47566:7;;47575:5;;47608:6;47558:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;47532:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;47671:10:::1;:17:::0;;;;;:38:::1;;::::0;47630:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;47734:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;47399:370:0::1;-1:-1:-1::0;47790:11:0::1;::::0;47826:1:::1;47812:504;47833:12;:19:::0;47829:23;::::1;47812:504;;;47882:12;47895:1;47882:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47882:15:0::1;::::0;-1:-1:-1;47953:30:0::1;47882:15:::0;47976:6;47953:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;47912:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;48033:31:::1;47923:5:::0;48033:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;47998:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;48083:21;::::1;::::0;48079:226:::1;;48151:40;48159:7;48168:5;48175:7;48184:6;48151:7;:40::i;:::-;-1:-1:-1::0;;;;;48125:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;48251:10:::1;:17:::0;;;;;:38:::1;;::::0;48210:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;48079:226:::1;47854:3;;47812:504;;;;38705:1:::2;38696:6;:10;38688:37;;;;-1:-1:-1::0;;;38688:37:0::2;;;;;;;:::i;:::-;38750:11;::::0;:23:::2;::::0;38766:6;38750:15:::2;:23::i;:::-;38736:11;:37:::0;38816:10:::2;38784:20;38807::::0;;;:8:::2;:20;::::0;;;;38850:9;;:21:::2;::::0;38864:6;38850:13:::2;:21::i;:::-;38838:33:::0;;38882:694;::::2;;;38922:12;::::0;:24:::2;::::0;38939:6;38922:16:::2;:24::i;:::-;38907:12;:39:::0;38974:10:::2;::::0;::::2;::::0;:22:::2;::::0;38989:6;38974:14:::2;:22::i;:::-;38961:10;::::0;::::2;:35:::0;39011:18:::2;39032:75;29698:20:::0;39032:57:::2;29594:9;39032:36;:15;29594:9:::0;39032:19:::2;:36::i;:75::-;39146:10;39122:11;39136:21:::0;;;:9:::2;:21;::::0;;;;:28;39011:96;;-1:-1:-1;39183:8:0;;;:64:::2;;-1:-1:-1::0;39205:10:0::2;39195:21;::::0;;;:9:::2;:21;::::0;;;;:28;;39237:10;;39195:21;-1:-1:-1;;39217:5:0;;;39195:28;::::2;;;;;;;;;;;;;;;:39;;;:52;39183:64;39179:314;;;39278:10;39268:21;::::0;;;:9:::2;:21;::::0;;;;;;;39295:55;;;;::::2;::::0;;;;;;;;::::2;::::0;;;39268:83;;::::2;::::0;;::::2;::::0;;;;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;39179:314:::2;;;39440:10;39430:21;::::0;;;:9:::2;:21;::::0;;;;:28;;:47:::2;::::0;39470:6;;-1:-1:-1;;39452:5:0;;;39430:28;::::2;;;;:47;39402:10;39392:21;::::0;;;:9:::2;:21;::::0;;;;:28;;-1:-1:-1;;39414:5:0;;;39392:28;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:85:::0;39179:314:::2;38882:694;;;;;39540:12;::::0;::::2;::::0;:24:::2;::::0;39557:6;39540:16:::2;:24::i;:::-;39525:12;::::0;::::2;:39:::0;38882:694:::2;39586:12;::::0;:64:::2;::::0;-1:-1:-1;;;;;39586:12:0::2;39616:10;39636:4;39643:6:::0;39586:29:::2;:64::i;:::-;39673:10;-1:-1:-1::0;;;;;39666:26:0::2;;39685:6;39666:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;27275:1:0;28237:7;:22;-1:-1:-1;;;;;38587:1113:0:o;22118:106::-;22176:7;22207:1;22203;:5;:13;;22215:1;22203:13;;;-1:-1:-1;22211:1:0;;22118:106;-1:-1:-1;22118:106:0:o;18881:205::-;18982:96;19002:5;19032:27;;;19061:4;19067:2;19071:5;19009:68;;;;;;;;;;:::i;21001:761::-;21425:23;21451:69;21479:4;21451:69;;;;;;;;;;;;;;;;;21459:5;-1:-1:-1;;;;;21451:27:0;;;:69;;;;;:::i;:::-;21535:17;;21425:95;;-1:-1:-1;21535:21:0;21531:224;;21677:10;21666:30;;;;;;;;;;;;:::i;:::-;21658:85;;;;-1:-1:-1;;;21658:85:0;;;;;;;:::i;13792:195::-;13895:12;13927:52;13949:6;13957:4;13963:1;13966:12;13927:21;:52::i;:::-;13920:59;13792:195;-1:-1:-1;;;;13792:195:0:o;14844:530::-;14971:12;15029:5;15004:21;:30;;14996:81;;;;-1:-1:-1;;;14996:81:0;;;;;;;:::i;:::-;15096:18;15107:6;15096:10;:18::i;:::-;15088:60;;;;-1:-1:-1;;;15088:60:0;;;;;;;:::i;:::-;15222:12;15236:23;15263:6;-1:-1:-1;;;;;15263:11:0;15283:5;15291:4;15263:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221:75;;;;15314:52;15332:7;15341:10;15353:12;15314:17;:52::i;:::-;15307:59;14844:530;-1:-1:-1;;;;;;;14844:530:0:o;10874:422::-;11241:20;11280:8;;;10874:422::o;17384:742::-;17499:12;17528:7;17524:595;;;-1:-1:-1;17559:10:0;17552:17;;17524:595;17673:17;;:21;17669:439;;17936:10;17930:17;17997:15;17984:10;17980:2;17976:19;17969:44;17884:148;18079:12;18072:20;;-1:-1:-1;;;18072:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;31377:54;;32275:35;;32265:2;;32324:1;;32314:12;545:241;;649:2;637:9;628:7;624:23;620:32;617:2;;;-1:-1;;655:12;617:2;717:53;762:7;738:22;717:53;:::i;793:366::-;;;914:2;902:9;893:7;889:23;885:32;882:2;;;-1:-1;;920:12;882:2;982:53;1027:7;1003:22;982:53;:::i;:::-;972:63;;1090:53;1135:7;1072:2;1115:9;1111:22;1090:53;:::i;:::-;1080:63;;876:283;;;;;:::o;1166:485::-;;;;1301:2;1289:9;1280:7;1276:23;1272:32;1269:2;;;-1:-1;;1307:12;1269:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1359:63;-1:-1;1459:2;1498:22;;72:20;97:33;72:20;97:33;:::i;:::-;1467:63;-1:-1;1567:2;1603:22;;206:20;231:30;206:20;231:30;:::i;:::-;1575:60;;;;1263:388;;;;;:::o;1658:360::-;;;1776:2;1764:9;1755:7;1751:23;1747:32;1744:2;;;-1:-1;;1782:12;1744:2;1844:53;1889:7;1865:22;1844:53;:::i;:::-;1834:63;;1934:2;1974:9;1970:22;206:20;231:30;255:5;231:30;:::i;:::-;1942:60;;;;1738:280;;;;;:::o;2025:366::-;;;2146:2;2134:9;2125:7;2121:23;2117:32;2114:2;;;-1:-1;;2152:12;2114:2;2214:53;2259:7;2235:22;2214:53;:::i;:::-;2204:63;2304:2;2343:22;;;;475:20;;-1:-1;;;2108:283::o;2398:257::-;;2510:2;2498:9;2489:7;2485:23;2481:32;2478:2;;;-1:-1;;2516:12;2478:2;354:6;348:13;366:30;390:5;366:30;:::i;2662:241::-;;2766:2;2754:9;2745:7;2741:23;2737:32;2734:2;;;-1:-1;;2772:12;2734:2;-1:-1;475:20;;2728:175;-1:-1;2728:175::o;2910:360::-;;;3028:2;3016:9;3007:7;3003:23;2999:32;2996:2;;;-1:-1;;3034:12;2996:2;488:6;475:20;3086:63;;3186:2;3226:9;3222:22;206:20;231:30;255:5;231:30;:::i;4208:938::-;;4494:5;29608:12;30529:6;30524:3;30517:19;30566:4;;30561:3;30557:14;4506:124;;30566:4;4732:5;29245:14;-1:-1;4771:353;4796:6;4793:1;4790:13;4771:353;;;4857:13;;14383:23;;15295:37;;14549:16;;14543:23;14620:14;;;15295:37;3564:4;3555:14;;;;30198;;;;4818:1;4811:9;4771:353;;;-1:-1;5130:10;;4394:752;-1:-1;;;;;4394:752::o;15464:271::-;;6442:5;29608:12;6553:52;6598:6;6593:3;6586:4;6579:5;6575:16;6553:52;:::i;:::-;6617:16;;;;;15598:137;-1:-1;;15598:137::o;15742:222::-;-1:-1;;;;;31377:54;;;;3938:37;;15869:2;15854:18;;15840:124::o;15971:444::-;-1:-1;;;;;31377:54;;;3938:37;;31377:54;;;;16318:2;16303:18;;3938:37;16401:2;16386:18;;15295:37;;;;16154:2;16139:18;;16125:290::o;16422:333::-;-1:-1;;;;;31377:54;;;;3938:37;;16741:2;16726:18;;15295:37;16577:2;16562:18;;16548:207::o;16762:482::-;16995:2;17009:47;;;29608:12;;16980:18;;;30517:19;;;16762:482;;16995:2;30557:14;;;;;;29245;;;16762:482;5797:344;5822:6;5819:1;5816:13;5797:344;;;5883:13;;14958:23;;-1:-1;;;;;31377:54;3938:37;;15120:16;;15114:23;15191:14;;;15295:37;3849:14;;;;30198;;;;31388:42;5837:9;5797:344;;;-1:-1;17062:172;;16966:278;-1:-1;;;;;;;16966:278::o;17251:210::-;31289:13;;31282:21;6236:34;;17372:2;17357:18;;17343:118::o;17743:310::-;;17890:2;17911:17;17904:47;6969:5;29608:12;30529:6;17890:2;17879:9;17875:18;30517:19;7063:52;7108:6;30557:14;17879:9;30557:14;17890:2;7089:5;7085:16;7063:52;:::i;:::-;32195:7;32179:14;-1:-1;;32175:28;7127:39;;;;30557:14;7127:39;;17861:192;-1:-1;;17861:192::o;18060:416::-;18260:2;18274:47;;;7403:2;18245:18;;;30517:19;7439:34;30557:14;;;7419:55;-1:-1;;;7494:12;;;7487:30;7536:12;;;18231:245::o;18483:416::-;18683:2;18697:47;;;7787:2;18668:18;;;30517:19;-1:-1;;;30557:14;;;7803:37;7859:12;;;18654:245::o;18906:416::-;19106:2;19120:47;;;8110:2;19091:18;;;30517:19;8146:29;30557:14;;;8126:50;8195:12;;;19077:245::o;19329:416::-;19529:2;19543:47;;;8446:2;19514:18;;;30517:19;8482:34;30557:14;;;8462:55;-1:-1;;;8537:12;;;8530:26;8575:12;;;19500:245::o;19752:416::-;19952:2;19966:47;;;8826:2;19937:18;;;30517:19;8862:32;30557:14;;;8842:53;8914:12;;;19923:245::o;20175:416::-;20375:2;20389:47;;;9165:2;20360:18;;;30517:19;9201:34;30557:14;;;9181:55;-1:-1;;;9256:12;;;9249:30;9298:12;;;20346:245::o;20598:416::-;20798:2;20812:47;;;9549:2;20783:18;;;30517:19;9585:28;30557:14;;;9565:49;9633:12;;;20769:245::o;21021:416::-;21221:2;21235:47;;;9884:1;21206:18;;;30517:19;-1:-1;;;30557:14;;;9899:32;9950:12;;;21192:245::o;21444:416::-;21644:2;21658:47;;;10201:2;21629:18;;;30517:19;-1:-1;;;30557:14;;;10217:40;10276:12;;;21615:245::o;21867:416::-;22067:2;22081:47;;;10527:2;22052:18;;;30517:19;10563:34;30557:14;;;10543:55;-1:-1;;;10618:12;;;10611:25;10655:12;;;22038:245::o;22290:416::-;22490:2;22504:47;;;22475:18;;;30517:19;10942:34;30557:14;;;10922:55;10996:12;;;22461:245::o;22713:416::-;22913:2;22927:47;;;11247:2;22898:18;;;30517:19;-1:-1;;;30557:14;;;11263:45;11327:12;;;22884:245::o;23136:416::-;23336:2;23350:47;;;11578:2;23321:18;;;30517:19;11614:31;30557:14;;;11594:52;11665:12;;;23307:245::o;23559:416::-;23759:2;23773:47;;;11916:2;23744:18;;;30517:19;-1:-1;;;30557:14;;;11932:33;11984:12;;;23730:245::o;23982:416::-;24182:2;24196:47;;;12235:2;24167:18;;;30517:19;12271:31;30557:14;;;12251:52;12322:12;;;24153:245::o;24405:416::-;24605:2;24619:47;;;12573:2;24590:18;;;30517:19;12609:31;30557:14;;;12589:52;12660:12;;;24576:245::o;24828:416::-;25028:2;25042:47;;;12911:2;25013:18;;;30517:19;-1:-1;;;30557:14;;;12927:38;12984:12;;;24999:245::o;25251:416::-;25451:2;25465:47;;;13235:2;25436:18;;;30517:19;13271:34;30557:14;;;13251:55;-1:-1;;;13326:12;;;13319:34;13372:12;;;25422:245::o;25674:416::-;25874:2;25888:47;;;13623:2;25859:18;;;30517:19;13659:30;30557:14;;;13639:51;13709:12;;;25845:245::o;26097:416::-;26297:2;26311:47;;;13960:2;26282:18;;;30517:19;13996:33;30557:14;;;13976:54;14049:12;;;26268:245::o;26520:222::-;15295:37;;;26647:2;26632:18;;26618:124::o;26749:605::-;;15325:5;15302:3;15295:37;27016:2;27134;27123:9;27119:18;27112:48;27174:170;27016:2;27005:9;27001:18;27330:6;27174:170;:::i;27361:333::-;15295:37;;;27680:2;27665:18;;15295:37;27516:2;27501:18;;27487:207::o;27701:828::-;;15325:5;15302:3;15295:37;15325:5;28189:2;28178:9;28174:18;15295:37;15325:5;28272:2;28261:9;28257:18;15295:37;28024:3;28309:2;28298:9;28294:18;28287:48;28349:170;28024:3;28013:9;28009:19;28505:6;28349:170;:::i;:::-;28341:178;27995:534;-1:-1;;;;;;27995:534::o;28536:556::-;15295:37;;;28912:2;28897:18;;15295:37;;;;28995:2;28980:18;;15295:37;29078:2;29063:18;;15295:37;28747:3;28732:19;;28718:374::o;31835:268::-;31900:1;31907:101;31921:6;31918:1;31915:13;31907:101;;;31988:11;;;31982:18;31969:11;;;31962:39;31943:2;31936:10;31907:101;;;32023:6;32020:1;32017:13;32014:2;;;-1:-1;;31900:1;32070:16;;32063:27;31884:219::o;32216:117::-;-1:-1;;;;;31377:54;;32275:35;;32265:2;;32324:1;;32314:12;32340:111;32421:5;31289:13;31282:21;32399:5;32396:32;32386:2;;32442:1;;32432:12
Swarm Source
ipfs://15122e078b49712b731404fc10d39d617e4dfa88e55acabeb8e8f6019e78717c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | $3,021.22 | 1.6327 | $4,932.81 |
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.