Source Code
Latest 25 from a total of 1,967 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit | 24545118 | 12 hrs ago | IN | 0 ETH | 0.00021676 | ||||
| Compound | 24545108 | 12 hrs ago | IN | 0 ETH | 0.00027457 | ||||
| Deposit | 24543954 | 15 hrs ago | IN | 0 ETH | 0.00021717 | ||||
| Compound | 24543945 | 15 hrs ago | IN | 0 ETH | 0.00027608 | ||||
| Compound | 24538181 | 35 hrs ago | IN | 0 ETH | 0.00027536 | ||||
| Compound | 24532988 | 2 days ago | IN | 0 ETH | 0.00028257 | ||||
| Compound | 24507330 | 5 days ago | IN | 0 ETH | 0.00027527 | ||||
| Deposit | 24501575 | 6 days ago | IN | 0 ETH | 0.00021632 | ||||
| Deposit | 24498157 | 7 days ago | IN | 0 ETH | 0.00021653 | ||||
| Deposit | 24498129 | 7 days ago | IN | 0 ETH | 0.00021667 | ||||
| Compound | 24498118 | 7 days ago | IN | 0 ETH | 0.0002753 | ||||
| Deposit | 24480257 | 9 days ago | IN | 0 ETH | 0.00021551 | ||||
| Compound | 24480251 | 9 days ago | IN | 0 ETH | 0.00027373 | ||||
| Deposit | 24472900 | 10 days ago | IN | 0 ETH | 0.00021538 | ||||
| Compound | 24472892 | 10 days ago | IN | 0 ETH | 0.00027402 | ||||
| Deposit | 24472770 | 10 days ago | IN | 0 ETH | 0.00021577 | ||||
| Compound | 24472715 | 10 days ago | IN | 0 ETH | 0.00027415 | ||||
| Compound | 24445286 | 14 days ago | IN | 0 ETH | 0.00027633 | ||||
| Deposit | 24397273 | 21 days ago | IN | 0 ETH | 0.00024473 | ||||
| Compound | 24397266 | 21 days ago | IN | 0 ETH | 0.00031089 | ||||
| Deposit | 24396846 | 21 days ago | IN | 0 ETH | 0.0002301 | ||||
| Withdraw Reward | 24396833 | 21 days ago | IN | 0 ETH | 0.00030111 | ||||
| Deposit | 24395429 | 21 days ago | IN | 0 ETH | 0.00025381 | ||||
| Compound | 24395409 | 21 days ago | IN | 0 ETH | 0.00031954 | ||||
| Deposit | 24359405 | 26 days ago | IN | 0 ETH | 0.00021842 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-09-26
*/
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @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() {
_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 making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/elmo_staking_v2.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
interface IBurn {
function publicBurn(uint256 amount) external;
}
interface IBalanceOf721 {
function balanceOf(address owner) external view returns (uint256 balance);
}
contract Staking is Ownable, ReentrancyGuard {
//constant
uint256 public constant BURN_OPTION_ONE = 25;
uint256 public constant BURN_OPTION_TWO = 50;
uint256 public constant BURN_OPTION_THREE = 75;
uint256 public constant DELAY_WITHDRAW = 14 days;
uint256 public constant EMERGENCY_FEE = 10;
uint256 public immutable MAX_DEPOSIT_LIMIT;
uint256 public immutable PRECISION_FACTOR;
uint256 public immutable TOKEN_DECIMALS;
// bool
bool public hasUserLimit;
bool public isInitialized;
bool public poolIsOnline;
bool public depositEnabled = true;
bool public compoundEnabled = true;
//address
address public nftContractAddress;
// uint
uint256 public totalUsersInStaking;
uint256 public poolTotalReward;
uint256 public accTokenPerShare;
uint256 public startBlock;
uint256 public lastRewardBlock;
uint256 public rewardPerBlock;
uint256 public totalBurned;
uint256 public totalUsersStake;
uint256 public totalUsersRewards;
uint256 public nftBoostPercentage;
// staking tokens
IERC20Metadata public rewardToken;
// mapping
mapping(address => UserInfo) public userInfo;
mapping(uint => uint) public optionToBurn; //0=None 1=25% 2=50% 3=75%
// struct
struct UserInfo {
uint256 amount; // How many staked tokens the user has provided
uint256 rewardDebt; // Reward debt
uint256 withdrawInitTime; // // init the cooldown timer to withdraw, save block.timestamp
uint256 burnChosen; // burn option
uint256 amountToWithdraw; // amount to withdraw
}
// event
event Deposit(address indexed user, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 amount);
event Withdraw(address indexed user, uint256 amount);
event PoolFunded(uint256 amount);
event Compound(address indexed user, uint256 amount);
event ClaimReward(address indexed user, uint256 amount);
event UserCompoundUpdated(address indexed user, bool onDeposit, bool onWithdraw);
event WithdrawInitiated(address indexed user, uint256 amount, uint256 burnedAmount);
event PoolStateUpdated(bool poolIsOnline, bool depositEnabled, bool compoundEnabled);
event NftBoostUpdated(uint256 percentage);
event TokenRecovered(address indexed tokenAddress, uint256 tokenAmount);
event BlockRewardUpdated(uint256 rewardPerBlock);
event PoolStarted(uint256 startBlock, uint256 rewardPerBlock);
//constructor
/// @notice Contract constructor that initializes the Smart Contract.
/// @param _rewardToken The address of the ERC20 token used as a reward.
/// @param _nftContractAddress The address of the NFT contract used as reward boost.
constructor(IERC20Metadata _rewardToken, address _nftContractAddress) {
rewardToken = _rewardToken;
TOKEN_DECIMALS = uint256(rewardToken.decimals());
require(TOKEN_DECIMALS < 30, "Must be inferior to 30");
MAX_DEPOSIT_LIMIT= 2000000*10**TOKEN_DECIMALS;
PRECISION_FACTOR = uint256(10**(uint256(30) - TOKEN_DECIMALS));
optionToBurn[1] = BURN_OPTION_ONE;
optionToBurn[2] = BURN_OPTION_TWO;
optionToBurn[3] = BURN_OPTION_THREE;
nftContractAddress = _nftContractAddress;
}
//owner function
/// @notice Allows the contract owner to set the state of the pool.
/// @param _poolIsOnline Enable or disable the pool.
/// @param _depositEnabled Enable or disable user deposits.
/// @param _compoundEnabled Enable or disable user compound functionality.
function setPoolState(bool _poolIsOnline, bool _depositEnabled, bool _compoundEnabled) external onlyOwner {
poolIsOnline = _poolIsOnline;
depositEnabled = _depositEnabled;
compoundEnabled = _compoundEnabled;
emit PoolStateUpdated(_poolIsOnline, _depositEnabled, _compoundEnabled);
}
/// @notice Allows the contract owner to set the NFT boost percentage.
/// @param _percentage The new NFT boost percentage to be set.
function setNftBoostPercentage(uint256 _percentage) external onlyOwner {
nftBoostPercentage = _percentage;
emit NftBoostUpdated(_percentage);
}
/// @notice Allows the contract owner to recover wrongly sent tokens to the contract.
/// @param _tokenAddress The address of the token to be recovered.
/// @param _tokenAmount The amount of tokens to be recovered.
function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { //@msg NOT Withdraw any tokens from the contract
require(_tokenAddress != address(rewardToken), "Cannot be staked or reward tokens");
IERC20Metadata(_tokenAddress).transfer(address(msg.sender), _tokenAmount);
emit TokenRecovered(_tokenAddress, _tokenAmount);
}
/// @notice Allows the contract owner to update the reward rate per block.
/// @param _rewardPerBlock The new token amount per block to be set.
function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { //@msg Update APY
require(_rewardPerBlock > 0, "Reward per block should be greater than 0");
rewardPerBlock = _rewardPerBlock;
emit BlockRewardUpdated(_rewardPerBlock);
}
/// @notice Initializes the staking pool with the provided reward rate per block.
/// @param _rewardPerBlock The reward rate per block to be set for the staking pool.
function istart(uint256 _rewardPerBlock) external onlyOwner {
require(!isInitialized, "Already initialized");
isInitialized = true;
rewardPerBlock = _rewardPerBlock;
startBlock = block.number;
poolIsOnline = true;
lastRewardBlock = startBlock;
emit PoolStarted(startBlock, _rewardPerBlock);
}
//modifier
/// @notice Modifier to check if the staking pool is online and available for certain actions.
/// @param actionType The type of action: 0 for deposit, 1 for compound.
modifier isPoolOnline(uint8 actionType) {
require(poolIsOnline || msg.sender == owner(),"staking platform not available now.");
if (actionType == 0) {
require(depositEnabled || msg.sender == owner(),"deposits not available now.");
}
else if (actionType == 1) {
require(compoundEnabled || msg.sender == owner(),"compounds not available now.");
}
_;
}
// user functions
/// @notice Allows users to top up the staking pool with additional reward tokens.
/// @param amount The amount of reward tokens to be added to the pool.
function fundPool(uint256 amount) external {
poolTotalReward += amount;
rewardToken.transferFrom(address(msg.sender), address(this), amount);
emit PoolFunded(amount);
}
/// @notice Allows users to deposit tokens into the staking pool.
/// @param _amount The amount of reward tokens to be deposited into the staking pool.
/// @param _burnOption The chosen burn option (1-25%, 2-50%, 3-75%) for the user's rewards.
function deposit(uint256 _amount, uint256 _burnOption) external isPoolOnline(0) nonReentrant {
require(_burnOption == 1 || _burnOption == 2 || _burnOption == 3, "invalid burn option");
require(userInfo[msg.sender].withdrawInitTime < block.timestamp, "cooldown not passed");
UserInfo storage user = userInfo[msg.sender];
uint userAmountBefore = user.amount;
require(_amount + userAmountBefore <= MAX_DEPOSIT_LIMIT, "User amount above limit");
if (_amount != 0) {
user.amount = userAmountBefore + _amount;
totalUsersStake += _amount;
rewardToken.transferFrom(address(msg.sender), address(this), _amount);
}else{
revert("can't deposit 0 tokens");
}
if (userAmountBefore == 0) {
totalUsersInStaking += 1;
user.burnChosen = _burnOption;
}
_updatePool();
user.rewardDebt = user.amount * accTokenPerShare / PRECISION_FACTOR;
emit Deposit(msg.sender, _amount);
}
/// @notice Initiates the withdrawal process for the staked reward tokens.
function initWithdraw() external nonReentrant {// unstack init
UserInfo storage user = userInfo[msg.sender];
uint userAmnt = user.amount;
require(userAmnt != 0, "No amount stacked");
require(user.amountToWithdraw == 0, "Withdraw already initiated");
_updatePool();
uint burnAmnout;
uint256 pending =_internalPendingCalc(userAmnt, accTokenPerShare, user.rewardDebt);
if (pending != 0) {
totalUsersRewards += pending;
poolTotalReward -= pending;
burnAmnout = pending * optionToBurn[user.burnChosen] / 100;
totalBurned += burnAmnout;
user.amountToWithdraw = userAmnt + (pending - burnAmnout);
IBurn(address(rewardToken)).publicBurn(burnAmnout);
emit ClaimReward(msg.sender,pending - burnAmnout);
}else{
user.amountToWithdraw = userAmnt;
}
totalUsersInStaking -= 1;
totalUsersStake -= userAmnt;
user.withdrawInitTime = block.timestamp;
user.rewardDebt = userAmnt * accTokenPerShare / PRECISION_FACTOR;
emit WithdrawInitiated(msg.sender, userAmnt + (pending - burnAmnout), burnAmnout);
}
/// @notice Allows users to withdraw their pending rewards from the staking pool.
function withdrawReward() external nonReentrant{
UserInfo storage user = userInfo[msg.sender];
require(user.amountToWithdraw == 0, "Cant have rewards if withdraw initiated");
uint userAmnt = user.amount;
require(userAmnt != 0, "0 stacked");
_updatePool();
uint256 pending = _internalPendingCalc(userAmnt, accTokenPerShare, user.rewardDebt);
if (pending > 0) {
totalUsersRewards += pending;
poolTotalReward -= pending;
uint burnAmnout = pending * optionToBurn[user.burnChosen] / 100;
totalBurned += burnAmnout;
IBurn(address(rewardToken)).publicBurn(burnAmnout);
rewardToken.transfer(address(msg.sender), pending-burnAmnout);
emit ClaimReward(msg.sender,pending - burnAmnout);
}
user.rewardDebt = userAmnt * accTokenPerShare / PRECISION_FACTOR;
}
/// @notice Allows users to withdraw their staked reward tokens after the lock time has passed.
function withdraw() external nonReentrant {// unstack
UserInfo storage user = userInfo[msg.sender];
uint256 amountToWithdraw = user.amountToWithdraw;
require(amountToWithdraw != 0, "No amount to withdraw");
require(user.withdrawInitTime + DELAY_WITHDRAW <= block.timestamp, "Minimum lock time not reached");
delete userInfo[msg.sender];
rewardToken.transfer(address(msg.sender), amountToWithdraw);
emit Withdraw(msg.sender, amountToWithdraw);
}
/// @notice Allows users to compound their pending rewards by adding them to their staked amount.
function compound() external isPoolOnline(1) nonReentrant {
UserInfo storage user = userInfo[msg.sender];
uint userAmnt = user.amount;
require(userAmnt != 0, "No amount stacked");
require(user.amountToWithdraw == 0, "Cant compound if withdraw initiated");
if(userAmnt != 0) {
_updatePool();
uint pending = _internalPendingCalc(userAmnt, accTokenPerShare, user.rewardDebt);
if(pending != 0) {
totalUsersRewards += pending;
poolTotalReward -= pending;
uint burnAmnout = pending * optionToBurn[user.burnChosen] / 100;
uint effectivePending = pending - burnAmnout;
totalBurned += burnAmnout;
totalUsersStake += effectivePending;
user.amount = user.amount + effectivePending;
user.rewardDebt = user.amount * accTokenPerShare / PRECISION_FACTOR;
IBurn(address(rewardToken)).publicBurn(burnAmnout);
emit Compound(msg.sender, effectivePending);
}
} else {
revert("nothing to compound");
}
}
// @notice Allows users to perform an emergency withdrawal from the staking pool.
function emergencyWithdraw() external nonReentrant {
UserInfo storage user = userInfo[msg.sender];
uint256 amountToWithdraw = user.amount;
require(amountToWithdraw != 0, "No amount to withdraw");
totalUsersStake -= amountToWithdraw;
uint256 feePart = (amountToWithdraw * EMERGENCY_FEE / 100);
amountToWithdraw = amountToWithdraw - feePart; //fee back to pool
poolTotalReward += feePart;
totalUsersInStaking -= 1;
delete userInfo[msg.sender];
rewardToken.transfer(address(msg.sender), amountToWithdraw);
emit EmergencyWithdraw(msg.sender, amountToWithdraw);
}
/// @notice Calculates the pending rewards for a user's staked amount, considering the NFT boost.
/// @param amnt The user's staked amount for which the pending rewards are calculated.
/// @param accTokenShare The accumulated token share in the staking pool at the time of calculation.
/// @param debt The user's reward debt at the time of calculation.
/// @return pending The calculated pending rewards for the user's staked amount, considering the NFT boost.
function _internalPendingCalc(uint amnt, uint accTokenShare, uint debt) internal view returns(uint256 pending) {
pending = amnt * accTokenShare / PRECISION_FACTOR - debt;
uint hasNft = IBalanceOf721(nftContractAddress).balanceOf(msg.sender);
if(hasNft != 0) {
pending = pending+(pending * nftBoostPercentage / 100);
}
return pending;
}
/// @notice Calculates the pending and effective pending rewards for a specific user, considering the NFT boost(if applicable).
/// @param _user The address of the user for whom the rewards are to be calculated.
/// @return pending The total pending rewards for the user's staked amount, including the NFT boost if applicable.
/// @return effectivePending The effective pending rewards after considering the burn option (if any) and NFT boost (if applicable).
function pendingReward(address _user) external view returns (uint256 pending, uint256 effectivePending) {
UserInfo storage user = userInfo[_user];
if(user.amountToWithdraw != 0){
pending = 0;
effectivePending = user.amountToWithdraw;
} else {
if (block.number > lastRewardBlock && totalUsersStake != 0) {
uint256 multiplier = block.number - lastRewardBlock;
uint256 cakeReward = multiplier * rewardPerBlock;
uint256 adjustedTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR / totalUsersStake);
pending = user.amount * adjustedTokenPerShare / PRECISION_FACTOR - user.rewardDebt;
} else {
pending = user.amount * accTokenPerShare / PRECISION_FACTOR - user.rewardDebt;
}
uint hasNft = IBalanceOf721(nftContractAddress).balanceOf(_user);
if(hasNft != 0) {
pending = pending + (pending * nftBoostPercentage / 100);
}
uint burnAmnout = pending * optionToBurn[user.burnChosen] / 100;
effectivePending = pending - burnAmnout;
}
}
/// @notice Updates the staking pool by calculating and accumulating the reward tokens (cakeReward) per share of staked tokens.
function _updatePool() internal {
if (block.number <= lastRewardBlock) {
return;
}
uint256 stakedTokenSupply = totalUsersStake;
if (stakedTokenSupply == 0) {
lastRewardBlock = block.number;
return;
}
uint256 multiplier = block.number - lastRewardBlock;
uint256 cakeReward = multiplier * rewardPerBlock;
accTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR / stakedTokenSupply);
lastRewardBlock = block.number;
}
/// @notice Get the available balance of the staking pool.
/// @return calc The available balance of the staking pool (total reward tokens available for distribution).
function getPoolEffectiveBalance() external view returns(uint256 calc){
calc = rewardToken.balanceOf(address(this)) - totalUsersStake;
return calc;
}
/// @notice Calculate the Annual Percentage Yield (APY) for the staking pool.
/// @return calculatedApr The calculated Annual Percentage Yield (APY) for the staking pool.
function calculateAPR() external view returns (uint256 calculatedApr, uint256 aprWithNft) {
uint blockPerYear = (86400/12)*365;
if (totalUsersStake == 0 || poolTotalReward == 0) {
calculatedApr = 0;
aprWithNft = 0;
}else{
calculatedApr = (rewardPerBlock * blockPerYear) / totalUsersStake;
uint blockBoosted = rewardPerBlock + (rewardPerBlock * nftBoostPercentage / 100);
aprWithNft = (blockBoosted * blockPerYear) / totalUsersStake;
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20Metadata","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_nftContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"BlockRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"NftBoostUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"PoolStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"poolIsOnline","type":"bool"},{"indexed":false,"internalType":"bool","name":"depositEnabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"compoundEnabled","type":"bool"}],"name":"PoolStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"TokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"onDeposit","type":"bool"},{"indexed":false,"internalType":"bool","name":"onWithdraw","type":"bool"}],"name":"UserCompoundUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"name":"WithdrawInitiated","type":"event"},{"inputs":[],"name":"BURN_OPTION_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_OPTION_THREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_OPTION_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELAY_WITHDRAW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DEPOSIT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateAPR","outputs":[{"internalType":"uint256","name":"calculatedApr","type":"uint256"},{"internalType":"uint256","name":"aprWithNft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_burnOption","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPoolEffectiveBalance","outputs":[{"internalType":"uint256","name":"calc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"istart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftBoostPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionToBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"effectivePending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolIsOnline","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolTotalReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setNftBoostPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_poolIsOnline","type":"bool"},{"internalType":"bool","name":"_depositEnabled","type":"bool"},{"internalType":"bool","name":"_compoundEnabled","type":"bool"}],"name":"setPoolState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUsersInStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUsersRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUsersStake","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":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"withdrawInitTime","type":"uint256"},{"internalType":"uint256","name":"burnChosen","type":"uint256"},{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawReward","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60e06040526001600260036101000a81548160ff0219169083151502179055506001600260046101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620043ea380380620043ea83398181016040528101906200006d91906200041b565b6200008d62000081620002a060201b60201c565b620002a860201b60201c565b6001808190555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000143573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001699190620004a0565b60ff1660c08181525050601e60c05110620001bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b29062000533565b60405180910390fd5b60c051600a620001cc9190620006e2565b621e8480620001dc919062000733565b6080818152505060c051601e620001f491906200077e565b600a620002029190620006e2565b60a081815250506019600f600060018152602001908152602001600020819055506032600f60006002815260200190815260200160002081905550604b600f6000600381526020019081526020016000208190555080600260056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620007b9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200039e8262000371565b9050919050565b6000620003b28262000391565b9050919050565b620003c481620003a5565b8114620003d057600080fd5b50565b600081519050620003e481620003b9565b92915050565b620003f58162000391565b81146200040157600080fd5b50565b6000815190506200041581620003ea565b92915050565b600080604083850312156200043557620004346200036c565b5b60006200044585828601620003d3565b9250506020620004588582860162000404565b9150509250929050565b600060ff82169050919050565b6200047a8162000462565b81146200048657600080fd5b50565b6000815190506200049a816200046f565b92915050565b600060208284031215620004b957620004b86200036c565b5b6000620004c98482850162000489565b91505092915050565b600082825260208201905092915050565b7f4d75737420626520696e666572696f7220746f20333000000000000000000000600082015250565b60006200051b601683620004d2565b91506200052882620004e3565b602082019050919050565b600060208201905081810360008301526200054e816200050c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620005e357808604811115620005bb57620005ba62000555565b5b6001851615620005cb5780820291505b8081029050620005db8562000584565b94506200059b565b94509492505050565b600082620005fe5760019050620006d1565b816200060e5760009050620006d1565b8160018114620006275760028114620006325762000668565b6001915050620006d1565b60ff84111562000647576200064662000555565b5b8360020a91508482111562000661576200066062000555565b5b50620006d1565b5060208310610133831016604e8410600b8410161715620006a25782820a9050838111156200069c576200069b62000555565b5b620006d1565b620006b1848484600162000591565b92509050818404811115620006cb57620006ca62000555565b5b81810290505b9392505050565b6000819050919050565b6000620006ef82620006d8565b9150620006fc83620006d8565b92506200072b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620005ec565b905092915050565b60006200074082620006d8565b91506200074d83620006d8565b92508282026200075d81620006d8565b9150828204841483151762000777576200077662000555565b5b5092915050565b60006200078b82620006d8565b91506200079883620006d8565b9250828203905081811115620007b357620007b262000555565b5b92915050565b60805160a05160c051613bbb6200082f6000396000610d2f0152600081816110f5015281816116080152818161165c01528181611ea2015281816121550152818161219f015281816121f3015281816126e201528181612a740152612acd015260008181610d530152611ce80152613bbb6000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80639ebc1a8e1161015c578063da3a5f72116100ce578063f2fde38b11610087578063f2fde38b146106cd578063f40f0f52146106e9578063f69e20461461071a578063f7c618c114610724578063f83ac39c14610742578063fa967e43146107605761027f565b8063da3a5f7214610632578063db2e21bc1461064e578063e2bbb15814610658578063eb0477f414610674578063f2494f3b14610692578063f2e0c915146106b15761027f565b8063bace709911610120578063bace709914610592578063c885bc58146105b0578063cac9e1eb146105ba578063ccd34cd5146105d8578063d843f352146105f6578063d89135cd146106145761027f565b80639ebc1a8e146104fc5780639f8c9b2e1461051a5780639fc3749514610538578063a9f8d18114610556578063aae282e1146105745761027f565b80635b7f415c116101f55780638aa99af1116101b95780638aa99af11461045c5780638ae39cac146104665780638da5cb5b146104845780638f662915146104a2578063909de8df146104c057806392e8990e146104de5761027f565b80635b7f415c146103dc5780636a00dc3c146103fa578063715018a6146104185780637f7499ca14610422578063897af754146104405761027f565b8063392e53cd11610247578063392e53cd1461032c5780633ccfd60b1461034a5780633da72bf4146103545780633f138d4b1461037257806348cd4cb11461038e5780634960d6d9146103ac5761027f565b806301f8a9761461028457806310859a70146102a05780631959a002146102bc57806323efc307146102f05780632eebe78e1461030e575b600080fd5b61029e60048036038101906102999190612c29565b61077e565b005b6102ba60048036038101906102b59190612c29565b61080a565b005b6102d660048036038101906102d19190612cb4565b6108ec565b6040516102e7959493929190612cf0565b60405180910390f35b6102f8610922565b6040516103059190612d43565b60405180910390f35b610316610929565b6040516103239190612d79565b60405180910390f35b61033461093c565b6040516103419190612d79565b60405180910390f35b61035261094f565b005b61035c610ba0565b6040516103699190612d43565b60405180910390f35b61038c60048036038101906103879190612d94565b610ba6565b005b610396610d0f565b6040516103a39190612d43565b60405180910390f35b6103c660048036038101906103c19190612c29565b610d15565b6040516103d39190612d43565b60405180910390f35b6103e4610d2d565b6040516103f19190612d43565b60405180910390f35b610402610d51565b60405161040f9190612d43565b60405180910390f35b610420610d75565b005b61042a610d89565b6040516104379190612d43565b60405180910390f35b61045a60048036038101906104559190612e00565b610d8e565b005b610464610e23565b005b61046e6111a8565b60405161047b9190612d43565b60405180910390f35b61048c6111ae565b6040516104999190612e62565b60405180910390f35b6104aa6111d7565b6040516104b79190612d43565b60405180910390f35b6104c86111dd565b6040516104d59190612d43565b60405180910390f35b6104e661128d565b6040516104f39190612d79565b60405180910390f35b6105046112a0565b6040516105119190612d79565b60405180910390f35b6105226112b3565b60405161052f9190612d43565b60405180910390f35b6105406112b9565b60405161054d9190612d43565b60405180910390f35b61055e6112bf565b60405161056b9190612d43565b60405180910390f35b61057c6112c5565b6040516105899190612e62565b60405180910390f35b61059a6112eb565b6040516105a79190612d43565b60405180910390f35b6105b86112f0565b005b6105c2611654565b6040516105cf9190612d43565b60405180910390f35b6105e061165a565b6040516105ed9190612d43565b60405180910390f35b6105fe61167e565b60405161060b9190612d43565b60405180910390f35b61061c611684565b6040516106299190612d43565b60405180910390f35b61064c60048036038101906106479190612c29565b61168a565b005b610656611780565b005b610672600480360381019061066d9190612e7d565b6119f4565b005b61067c611f42565b6040516106899190612d43565b60405180910390f35b61069a611f47565b6040516106a8929190612ebd565b60405180910390f35b6106cb60048036038101906106c69190612c29565b611fe3565b005b6106e760048036038101906106e29190612cb4565b61202c565b005b61070360048036038101906106fe9190612cb4565b6120af565b604051610711929190612ebd565b60405180910390f35b610722612355565b005b61072c612851565b6040516107399190612f45565b60405180910390f35b61074a612877565b6040516107579190612d43565b60405180910390f35b61076861287c565b6040516107759190612d79565b60405180910390f35b61078661288d565b600081116107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090612fe3565b60405180910390fd5b806008819055507f36ea59653b93d089d49c74d420b7884cd51117c3ff1ed62ed8b98cf43835d888816040516107ff9190612d43565b60405180910390a150565b61081261288d565b600260019054906101000a900460ff1615610862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108599061304f565b60405180910390fd5b6001600260016101000a81548160ff021916908315150217905550806008819055504360068190555060016002806101000a81548160ff0219169083151502179055506006546007819055507faf9b8c1676656a817bb6b978900dea30f7d87dd4af846ff666096a49ebdd1e35600654826040516108e1929190612ebd565b60405180910390a150565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6212750081565b600260039054906101000a900460ff1681565b600260019054906101000a900460ff1681565b61095761290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600401549050600081036109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd906130bb565b60405180910390fd5b426212750083600201546109fa919061310a565b1115610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a329061318a565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090555050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b029291906131aa565b6020604051808303816000875af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436482604051610b8c9190612d43565b60405180910390a25050610b9e61295a565b565b60035481565b610bae61288d565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613287565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610c799291906131aa565b6020604051808303816000875af1158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc91906131e8565b508173ffffffffffffffffffffffffffffffffffffffff167f4590b594be6fdef6bd5e18792a2494ddf2156b618c7bbe48d13a92831208af0582604051610d039190612d43565b60405180910390a25050565b60065481565b600f6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d7d61288d565b610d876000612963565b565b604b81565b610d9661288d565b826002806101000a81548160ff02191690831515021790555081600260036101000a81548160ff02191690831515021790555080600260046101000a81548160ff0219169083151502179055507f28de186b226935b24684e28dd7acff5cdcd95dddcbde84e6451b70ac240acb66838383604051610e16939291906132a7565b60405180910390a1505050565b610e2b61290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008103610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb19061332a565b60405180910390fd5b6000826004015414610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613396565b60405180910390fd5b610f09612a27565b600080610f1d836005548660010154612ac8565b9050600081146110ad5780600b6000828254610f39919061310a565b925050819055508060046000828254610f5291906133b6565b925050819055506064600f6000866003015481526020019081526020016000205482610f7e91906133ea565b610f88919061345b565b91508160096000828254610f9c919061310a565b925050819055508181610faf91906133b6565b83610fba919061310a565b8460040181905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475836040518263ffffffff1660e01b815260040161101d9190612d43565b600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e838361109391906133b6565b6040516110a09190612d43565b60405180910390a26110b7565b8284600401819055505b6001600360008282546110ca91906133b6565b9250508190555082600a60008282546110e391906133b6565b925050819055504284600201819055507f00000000000000000000000000000000000000000000000000000000000000006005548461112291906133ea565b61112c919061345b565b84600101819055503373ffffffffffffffffffffffffffffffffffffffff167ff908b12fe0d8dc1ff4fda115e5bace3a7ad1aad889daca8e638ca0b29f806577838361117891906133b6565b85611183919061310a565b84604051611192929190612ebd565b60405180910390a2505050506111a661295a565b565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b6000600a54600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161123d9190612e62565b602060405180830381865afa15801561125a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127e91906134a1565b61128891906133b6565b905090565b600260009054906101000a900460ff1681565b600260049054906101000a900460ff1681565b600c5481565b600a5481565b60075481565b600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a81565b6112f861290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816004015414611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613540565b60405180910390fd5b600081600001549050600081036113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906135ac565b60405180910390fd5b6113d6612a27565b60006113e9826005548560010154612ac8565b905060008111156116065780600b6000828254611406919061310a565b92505081905550806004600082825461141f91906133b6565b9250508190555060006064600f600086600301548152602001908152602001600020548361144d91906133ea565b611457919061345b565b9050806009600082825461146b919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475826040518263ffffffff1660e01b81526004016114cd9190612d43565b600060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b50505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33838561154a91906133b6565b6040518363ffffffff1660e01b81526004016115679291906131aa565b6020604051808303816000875af1158015611586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115aa91906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e82846115ef91906133b6565b6040516115fc9190612d43565b60405180910390a2505b7f00000000000000000000000000000000000000000000000000000000000000006005548361163591906133ea565b61163f919061345b565b836001018190555050505061165261295a565b565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045481565b60095481565b806004600082825461169c919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611702939291906135cc565b6020604051808303816000875af1158015611721573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174591906131e8565b507fd20389ec208fde395624b8221fa1cae9211e46a6ba77134c8e0b1af8c9603398816040516117759190612d43565b60405180910390a150565b61178861290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008103611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906130bb565b60405180910390fd5b80600a600082825461182991906133b6565b9250508190555060006064600a8361184191906133ea565b61184b919061345b565b9050808261185991906133b6565b9150806004600082825461186d919061310a565b9250508190555060016003600082825461188791906133b6565b92505081905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090555050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016119559291906131aa565b6020604051808303816000875af1158015611974573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199891906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695836040516119df9190612d43565b60405180910390a25050506119f261295a565b565b600060028054906101000a900460ff1680611a415750611a126111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790613675565b60405180910390fd5b60008160ff1603611b1c57600260039054906101000a900460ff1680611ad85750611aa96111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e906136e1565b60405180910390fd5b611bb5565b60018160ff1603611bb457600260049054906101000a900460ff1680611b745750611b456111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa9061374d565b60405180910390fd5b5b5b611bbd61290b565b6001821480611bcc5750600282145b80611bd75750600382145b611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d906137b9565b60405180910390fd5b42600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015410611c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9190613825565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490507f00000000000000000000000000000000000000000000000000000000000000008186611d13919061310a565b1115611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90613891565b60405180910390fd5b60008514611e31578481611d68919061310a565b826000018190555084600a6000828254611d82919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401611de8939291906135cc565b6020604051808303816000875af1158015611e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2b91906131e8565b50611e6c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906138fd565b60405180910390fd5b60008103611e9857600160036000828254611e87919061310a565b925050819055508382600301819055505b611ea0612a27565b7f00000000000000000000000000000000000000000000000000000000000000006005548360000154611ed391906133ea565b611edd919061345b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c86604051611f2b9190612d43565b60405180910390a25050611f3d61295a565b505050565b601981565b6000806000622819a090506000600a541480611f6557506000600454145b15611f77576000925060009150611fde565b600a5481600854611f8891906133ea565b611f92919061345b565b925060006064600c54600854611fa891906133ea565b611fb2919061345b565b600854611fbf919061310a565b9050600a548282611fd091906133ea565b611fda919061345b565b9250505b509091565b611feb61288d565b80600c819055507f32e63aeca1f896ac57d5b36c3f3b57df9a47fe6ff073e58366ff3d0cf6e55fa5816040516120219190612d43565b60405180910390a150565b61203461288d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061398f565b60405180910390fd5b6120ac81612963565b50565b6000806000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600401541461211157600092508060040154915061234f565b6007544311801561212557506000600a5414155b156121ec5760006007544361213a91906133b6565b905060006008548261214c91906133ea565b90506000600a547f00000000000000000000000000000000000000000000000000000000000000008361217f91906133ea565b612189919061345b565b600554612196919061310a565b905083600101547f00000000000000000000000000000000000000000000000000000000000000008286600001546121ce91906133ea565b6121d8919061345b565b6121e291906133b6565b955050505061223b565b80600101547f0000000000000000000000000000000000000000000000000000000000000000600554836000015461222491906133ea565b61222e919061345b565b61223891906133b6565b92505b6000600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016122989190612e62565b602060405180830381865afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d991906134a1565b90506000811461230b576064600c54856122f391906133ea565b6122fd919061345b565b84612308919061310a565b93505b60006064600f600085600301548152602001908152602001600020548661233291906133ea565b61233c919061345b565b9050808561234a91906133b6565b935050505b50915091565b600160028054906101000a900460ff16806123a257506123736111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d890613675565b60405180910390fd5b60008160ff160361247d57600260039054906101000a900460ff1680612439575061240a6111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f906136e1565b60405180910390fd5b612516565b60018160ff160361251557600260049054906101000a900460ff16806124d557506124a66111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b9061374d565b60405180910390fd5b5b5b61251e61290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600081036125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a49061332a565b60405180910390fd5b60008260040154146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb90613a21565b60405180910390fd5b6000811461280957612604612a27565b6000612617826005548560010154612ac8565b9050600081146128035780600b6000828254612633919061310a565b92505081905550806004600082825461264c91906133b6565b9250508190555060006064600f600086600301548152602001908152602001600020548361267a91906133ea565b612684919061345b565b90506000818361269491906133b6565b905081600960008282546126a8919061310a565b9250508190555080600a60008282546126c1919061310a565b925050819055508085600001546126d8919061310a565b85600001819055507f0000000000000000000000000000000000000000000000000000000000000000600554866000015461271391906133ea565b61271d919061345b565b8560010181905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475836040518263ffffffff1660e01b81526004016127809190612d43565b600060405180830381600087803b15801561279a57600080fd5b505af11580156127ae573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f169f1815ebdea059aac3bb00ec9a9594c7a5ffcb64a17e8392b5d84909a14556826040516127f89190612d43565b60405180910390a250505b50612844565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90613a8d565b60405180910390fd5b505061284e61295a565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603281565b60028054906101000a900460ff1681565b612895612be6565b73ffffffffffffffffffffffffffffffffffffffff166128b36111ae565b73ffffffffffffffffffffffffffffffffffffffff1614612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290090613af9565b60405180910390fd5b565b600260015403612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294790613b65565b60405180910390fd5b6002600181905550565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600754431115612ac6576000600a54905060008103612a4d574360078190555050612ac6565b600060075443612a5d91906133b6565b9050600060085482612a6f91906133ea565b9050827f000000000000000000000000000000000000000000000000000000000000000082612a9e91906133ea565b612aa8919061345b565b600554612ab5919061310a565b600581905550436007819055505050505b565b6000817f00000000000000000000000000000000000000000000000000000000000000008486612af891906133ea565b612b02919061345b565b612b0c91906133b6565b90506000600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612b6b9190612e62565b602060405180830381865afa158015612b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bac91906134a1565b905060008114612bde576064600c5483612bc691906133ea565b612bd0919061345b565b82612bdb919061310a565b91505b509392505050565b600033905090565b600080fd5b6000819050919050565b612c0681612bf3565b8114612c1157600080fd5b50565b600081359050612c2381612bfd565b92915050565b600060208284031215612c3f57612c3e612bee565b5b6000612c4d84828501612c14565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c8182612c56565b9050919050565b612c9181612c76565b8114612c9c57600080fd5b50565b600081359050612cae81612c88565b92915050565b600060208284031215612cca57612cc9612bee565b5b6000612cd884828501612c9f565b91505092915050565b612cea81612bf3565b82525050565b600060a082019050612d056000830188612ce1565b612d126020830187612ce1565b612d1f6040830186612ce1565b612d2c6060830185612ce1565b612d396080830184612ce1565b9695505050505050565b6000602082019050612d586000830184612ce1565b92915050565b60008115159050919050565b612d7381612d5e565b82525050565b6000602082019050612d8e6000830184612d6a565b92915050565b60008060408385031215612dab57612daa612bee565b5b6000612db985828601612c9f565b9250506020612dca85828601612c14565b9150509250929050565b612ddd81612d5e565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600080600060608486031215612e1957612e18612bee565b5b6000612e2786828701612deb565b9350506020612e3886828701612deb565b9250506040612e4986828701612deb565b9150509250925092565b612e5c81612c76565b82525050565b6000602082019050612e776000830184612e53565b92915050565b60008060408385031215612e9457612e93612bee565b5b6000612ea285828601612c14565b9250506020612eb385828601612c14565b9150509250929050565b6000604082019050612ed26000830185612ce1565b612edf6020830184612ce1565b9392505050565b6000819050919050565b6000612f0b612f06612f0184612c56565b612ee6565b612c56565b9050919050565b6000612f1d82612ef0565b9050919050565b6000612f2f82612f12565b9050919050565b612f3f81612f24565b82525050565b6000602082019050612f5a6000830184612f36565b92915050565b600082825260208201905092915050565b7f5265776172642070657220626c6f636b2073686f756c6420626520677265617460008201527f6572207468616e20300000000000000000000000000000000000000000000000602082015250565b6000612fcd602983612f60565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613039601383612f60565b915061304482613003565b602082019050919050565b600060208201905081810360008301526130688161302c565b9050919050565b7f4e6f20616d6f756e7420746f2077697468647261770000000000000000000000600082015250565b60006130a5601583612f60565b91506130b08261306f565b602082019050919050565b600060208201905081810360008301526130d481613098565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061311582612bf3565b915061312083612bf3565b9250828201905080821115613138576131376130db565b5b92915050565b7f4d696e696d756d206c6f636b2074696d65206e6f742072656163686564000000600082015250565b6000613174601d83612f60565b915061317f8261313e565b602082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b60006040820190506131bf6000830185612e53565b6131cc6020830184612ce1565b9392505050565b6000815190506131e281612dd4565b92915050565b6000602082840312156131fe576131fd612bee565b5b600061320c848285016131d3565b91505092915050565b7f43616e6e6f74206265207374616b6564206f722072657761726420746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613271602183612f60565b915061327c82613215565b604082019050919050565b600060208201905081810360008301526132a081613264565b9050919050565b60006060820190506132bc6000830186612d6a565b6132c96020830185612d6a565b6132d66040830184612d6a565b949350505050565b7f4e6f20616d6f756e7420737461636b6564000000000000000000000000000000600082015250565b6000613314601183612f60565b915061331f826132de565b602082019050919050565b6000602082019050818103600083015261334381613307565b9050919050565b7f576974686472617720616c726561647920696e69746961746564000000000000600082015250565b6000613380601a83612f60565b915061338b8261334a565b602082019050919050565b600060208201905081810360008301526133af81613373565b9050919050565b60006133c182612bf3565b91506133cc83612bf3565b92508282039050818111156133e4576133e36130db565b5b92915050565b60006133f582612bf3565b915061340083612bf3565b925082820261340e81612bf3565b91508282048414831517613425576134246130db565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061346682612bf3565b915061347183612bf3565b9250826134815761348061342c565b5b828204905092915050565b60008151905061349b81612bfd565b92915050565b6000602082840312156134b7576134b6612bee565b5b60006134c58482850161348c565b91505092915050565b7f43616e742068617665207265776172647320696620776974686472617720696e60008201527f6974696174656400000000000000000000000000000000000000000000000000602082015250565b600061352a602783612f60565b9150613535826134ce565b604082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b7f3020737461636b65640000000000000000000000000000000000000000000000600082015250565b6000613596600983612f60565b91506135a182613560565b602082019050919050565b600060208201905081810360008301526135c581613589565b9050919050565b60006060820190506135e16000830186612e53565b6135ee6020830185612e53565b6135fb6040830184612ce1565b949350505050565b7f7374616b696e6720706c6174666f726d206e6f7420617661696c61626c65206e60008201527f6f772e0000000000000000000000000000000000000000000000000000000000602082015250565b600061365f602383612f60565b915061366a82613603565b604082019050919050565b6000602082019050818103600083015261368e81613652565b9050919050565b7f6465706f73697473206e6f7420617661696c61626c65206e6f772e0000000000600082015250565b60006136cb601b83612f60565b91506136d682613695565b602082019050919050565b600060208201905081810360008301526136fa816136be565b9050919050565b7f636f6d706f756e6473206e6f7420617661696c61626c65206e6f772e00000000600082015250565b6000613737601c83612f60565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f696e76616c6964206275726e206f7074696f6e00000000000000000000000000600082015250565b60006137a3601383612f60565b91506137ae8261376d565b602082019050919050565b600060208201905081810360008301526137d281613796565b9050919050565b7f636f6f6c646f776e206e6f742070617373656400000000000000000000000000600082015250565b600061380f601383612f60565b915061381a826137d9565b602082019050919050565b6000602082019050818103600083015261383e81613802565b9050919050565b7f5573657220616d6f756e742061626f7665206c696d6974000000000000000000600082015250565b600061387b601783612f60565b915061388682613845565b602082019050919050565b600060208201905081810360008301526138aa8161386e565b9050919050565b7f63616e2774206465706f736974203020746f6b656e7300000000000000000000600082015250565b60006138e7601683612f60565b91506138f2826138b1565b602082019050919050565b60006020820190508181036000830152613916816138da565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613979602683612f60565b91506139848261391d565b604082019050919050565b600060208201905081810360008301526139a88161396c565b9050919050565b7f43616e7420636f6d706f756e6420696620776974686472617720696e6974696160008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0b602383612f60565b9150613a16826139af565b604082019050919050565b60006020820190508181036000830152613a3a816139fe565b9050919050565b7f6e6f7468696e6720746f20636f6d706f756e6400000000000000000000000000600082015250565b6000613a77601383612f60565b9150613a8282613a41565b602082019050919050565b60006020820190508181036000830152613aa681613a6a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ae3602083612f60565b9150613aee82613aad565b602082019050919050565b60006020820190508181036000830152613b1281613ad6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b4f601f83612f60565b9150613b5a82613b19565b602082019050919050565b60006020820190508181036000830152613b7e81613b42565b905091905056fea2646970667358221220741ce9fc56b66a15dd7ab369005d4961fb742b3da5b4a41221cf140431c91cab64736f6c63430008130033000000000000000000000000335f4e66b9b61cee5ceade4e727fcec20156b2f00000000000000000000000009122f8948dba98b049f61ce6632fad85d82e5348
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80639ebc1a8e1161015c578063da3a5f72116100ce578063f2fde38b11610087578063f2fde38b146106cd578063f40f0f52146106e9578063f69e20461461071a578063f7c618c114610724578063f83ac39c14610742578063fa967e43146107605761027f565b8063da3a5f7214610632578063db2e21bc1461064e578063e2bbb15814610658578063eb0477f414610674578063f2494f3b14610692578063f2e0c915146106b15761027f565b8063bace709911610120578063bace709914610592578063c885bc58146105b0578063cac9e1eb146105ba578063ccd34cd5146105d8578063d843f352146105f6578063d89135cd146106145761027f565b80639ebc1a8e146104fc5780639f8c9b2e1461051a5780639fc3749514610538578063a9f8d18114610556578063aae282e1146105745761027f565b80635b7f415c116101f55780638aa99af1116101b95780638aa99af11461045c5780638ae39cac146104665780638da5cb5b146104845780638f662915146104a2578063909de8df146104c057806392e8990e146104de5761027f565b80635b7f415c146103dc5780636a00dc3c146103fa578063715018a6146104185780637f7499ca14610422578063897af754146104405761027f565b8063392e53cd11610247578063392e53cd1461032c5780633ccfd60b1461034a5780633da72bf4146103545780633f138d4b1461037257806348cd4cb11461038e5780634960d6d9146103ac5761027f565b806301f8a9761461028457806310859a70146102a05780631959a002146102bc57806323efc307146102f05780632eebe78e1461030e575b600080fd5b61029e60048036038101906102999190612c29565b61077e565b005b6102ba60048036038101906102b59190612c29565b61080a565b005b6102d660048036038101906102d19190612cb4565b6108ec565b6040516102e7959493929190612cf0565b60405180910390f35b6102f8610922565b6040516103059190612d43565b60405180910390f35b610316610929565b6040516103239190612d79565b60405180910390f35b61033461093c565b6040516103419190612d79565b60405180910390f35b61035261094f565b005b61035c610ba0565b6040516103699190612d43565b60405180910390f35b61038c60048036038101906103879190612d94565b610ba6565b005b610396610d0f565b6040516103a39190612d43565b60405180910390f35b6103c660048036038101906103c19190612c29565b610d15565b6040516103d39190612d43565b60405180910390f35b6103e4610d2d565b6040516103f19190612d43565b60405180910390f35b610402610d51565b60405161040f9190612d43565b60405180910390f35b610420610d75565b005b61042a610d89565b6040516104379190612d43565b60405180910390f35b61045a60048036038101906104559190612e00565b610d8e565b005b610464610e23565b005b61046e6111a8565b60405161047b9190612d43565b60405180910390f35b61048c6111ae565b6040516104999190612e62565b60405180910390f35b6104aa6111d7565b6040516104b79190612d43565b60405180910390f35b6104c86111dd565b6040516104d59190612d43565b60405180910390f35b6104e661128d565b6040516104f39190612d79565b60405180910390f35b6105046112a0565b6040516105119190612d79565b60405180910390f35b6105226112b3565b60405161052f9190612d43565b60405180910390f35b6105406112b9565b60405161054d9190612d43565b60405180910390f35b61055e6112bf565b60405161056b9190612d43565b60405180910390f35b61057c6112c5565b6040516105899190612e62565b60405180910390f35b61059a6112eb565b6040516105a79190612d43565b60405180910390f35b6105b86112f0565b005b6105c2611654565b6040516105cf9190612d43565b60405180910390f35b6105e061165a565b6040516105ed9190612d43565b60405180910390f35b6105fe61167e565b60405161060b9190612d43565b60405180910390f35b61061c611684565b6040516106299190612d43565b60405180910390f35b61064c60048036038101906106479190612c29565b61168a565b005b610656611780565b005b610672600480360381019061066d9190612e7d565b6119f4565b005b61067c611f42565b6040516106899190612d43565b60405180910390f35b61069a611f47565b6040516106a8929190612ebd565b60405180910390f35b6106cb60048036038101906106c69190612c29565b611fe3565b005b6106e760048036038101906106e29190612cb4565b61202c565b005b61070360048036038101906106fe9190612cb4565b6120af565b604051610711929190612ebd565b60405180910390f35b610722612355565b005b61072c612851565b6040516107399190612f45565b60405180910390f35b61074a612877565b6040516107579190612d43565b60405180910390f35b61076861287c565b6040516107759190612d79565b60405180910390f35b61078661288d565b600081116107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090612fe3565b60405180910390fd5b806008819055507f36ea59653b93d089d49c74d420b7884cd51117c3ff1ed62ed8b98cf43835d888816040516107ff9190612d43565b60405180910390a150565b61081261288d565b600260019054906101000a900460ff1615610862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108599061304f565b60405180910390fd5b6001600260016101000a81548160ff021916908315150217905550806008819055504360068190555060016002806101000a81548160ff0219169083151502179055506006546007819055507faf9b8c1676656a817bb6b978900dea30f7d87dd4af846ff666096a49ebdd1e35600654826040516108e1929190612ebd565b60405180910390a150565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6212750081565b600260039054906101000a900460ff1681565b600260019054906101000a900460ff1681565b61095761290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600401549050600081036109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd906130bb565b60405180910390fd5b426212750083600201546109fa919061310a565b1115610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a329061318a565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090555050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b029291906131aa565b6020604051808303816000875af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436482604051610b8c9190612d43565b60405180910390a25050610b9e61295a565b565b60035481565b610bae61288d565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613287565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610c799291906131aa565b6020604051808303816000875af1158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc91906131e8565b508173ffffffffffffffffffffffffffffffffffffffff167f4590b594be6fdef6bd5e18792a2494ddf2156b618c7bbe48d13a92831208af0582604051610d039190612d43565b60405180910390a25050565b60065481565b600f6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000001281565b7f00000000000000000000000000000000000000000001a784379d99db4200000081565b610d7d61288d565b610d876000612963565b565b604b81565b610d9661288d565b826002806101000a81548160ff02191690831515021790555081600260036101000a81548160ff02191690831515021790555080600260046101000a81548160ff0219169083151502179055507f28de186b226935b24684e28dd7acff5cdcd95dddcbde84e6451b70ac240acb66838383604051610e16939291906132a7565b60405180910390a1505050565b610e2b61290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008103610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb19061332a565b60405180910390fd5b6000826004015414610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613396565b60405180910390fd5b610f09612a27565b600080610f1d836005548660010154612ac8565b9050600081146110ad5780600b6000828254610f39919061310a565b925050819055508060046000828254610f5291906133b6565b925050819055506064600f6000866003015481526020019081526020016000205482610f7e91906133ea565b610f88919061345b565b91508160096000828254610f9c919061310a565b925050819055508181610faf91906133b6565b83610fba919061310a565b8460040181905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475836040518263ffffffff1660e01b815260040161101d9190612d43565b600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e838361109391906133b6565b6040516110a09190612d43565b60405180910390a26110b7565b8284600401819055505b6001600360008282546110ca91906133b6565b9250508190555082600a60008282546110e391906133b6565b925050819055504284600201819055507f000000000000000000000000000000000000000000000000000000e8d4a510006005548461112291906133ea565b61112c919061345b565b84600101819055503373ffffffffffffffffffffffffffffffffffffffff167ff908b12fe0d8dc1ff4fda115e5bace3a7ad1aad889daca8e638ca0b29f806577838361117891906133b6565b85611183919061310a565b84604051611192929190612ebd565b60405180910390a2505050506111a661295a565b565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b6000600a54600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161123d9190612e62565b602060405180830381865afa15801561125a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127e91906134a1565b61128891906133b6565b905090565b600260009054906101000a900460ff1681565b600260049054906101000a900460ff1681565b600c5481565b600a5481565b60075481565b600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a81565b6112f861290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816004015414611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613540565b60405180910390fd5b600081600001549050600081036113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906135ac565b60405180910390fd5b6113d6612a27565b60006113e9826005548560010154612ac8565b905060008111156116065780600b6000828254611406919061310a565b92505081905550806004600082825461141f91906133b6565b9250508190555060006064600f600086600301548152602001908152602001600020548361144d91906133ea565b611457919061345b565b9050806009600082825461146b919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475826040518263ffffffff1660e01b81526004016114cd9190612d43565b600060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b50505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33838561154a91906133b6565b6040518363ffffffff1660e01b81526004016115679291906131aa565b6020604051808303816000875af1158015611586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115aa91906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e82846115ef91906133b6565b6040516115fc9190612d43565b60405180910390a2505b7f000000000000000000000000000000000000000000000000000000e8d4a510006005548361163591906133ea565b61163f919061345b565b836001018190555050505061165261295a565b565b600b5481565b7f000000000000000000000000000000000000000000000000000000e8d4a5100081565b60045481565b60095481565b806004600082825461169c919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611702939291906135cc565b6020604051808303816000875af1158015611721573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174591906131e8565b507fd20389ec208fde395624b8221fa1cae9211e46a6ba77134c8e0b1af8c9603398816040516117759190612d43565b60405180910390a150565b61178861290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008103611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906130bb565b60405180910390fd5b80600a600082825461182991906133b6565b9250508190555060006064600a8361184191906133ea565b61184b919061345b565b9050808261185991906133b6565b9150806004600082825461186d919061310a565b9250508190555060016003600082825461188791906133b6565b92505081905550600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600090555050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016119559291906131aa565b6020604051808303816000875af1158015611974573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199891906131e8565b503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695836040516119df9190612d43565b60405180910390a25050506119f261295a565b565b600060028054906101000a900460ff1680611a415750611a126111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790613675565b60405180910390fd5b60008160ff1603611b1c57600260039054906101000a900460ff1680611ad85750611aa96111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e906136e1565b60405180910390fd5b611bb5565b60018160ff1603611bb457600260049054906101000a900460ff1680611b745750611b456111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa9061374d565b60405180910390fd5b5b5b611bbd61290b565b6001821480611bcc5750600282145b80611bd75750600382145b611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d906137b9565b60405180910390fd5b42600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015410611c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9190613825565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490507f00000000000000000000000000000000000000000001a784379d99db420000008186611d13919061310a565b1115611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90613891565b60405180910390fd5b60008514611e31578481611d68919061310a565b826000018190555084600a6000828254611d82919061310a565b92505081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401611de8939291906135cc565b6020604051808303816000875af1158015611e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2b91906131e8565b50611e6c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906138fd565b60405180910390fd5b60008103611e9857600160036000828254611e87919061310a565b925050819055508382600301819055505b611ea0612a27565b7f000000000000000000000000000000000000000000000000000000e8d4a510006005548360000154611ed391906133ea565b611edd919061345b565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c86604051611f2b9190612d43565b60405180910390a25050611f3d61295a565b505050565b601981565b6000806000622819a090506000600a541480611f6557506000600454145b15611f77576000925060009150611fde565b600a5481600854611f8891906133ea565b611f92919061345b565b925060006064600c54600854611fa891906133ea565b611fb2919061345b565b600854611fbf919061310a565b9050600a548282611fd091906133ea565b611fda919061345b565b9250505b509091565b611feb61288d565b80600c819055507f32e63aeca1f896ac57d5b36c3f3b57df9a47fe6ff073e58366ff3d0cf6e55fa5816040516120219190612d43565b60405180910390a150565b61203461288d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061398f565b60405180910390fd5b6120ac81612963565b50565b6000806000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600401541461211157600092508060040154915061234f565b6007544311801561212557506000600a5414155b156121ec5760006007544361213a91906133b6565b905060006008548261214c91906133ea565b90506000600a547f000000000000000000000000000000000000000000000000000000e8d4a510008361217f91906133ea565b612189919061345b565b600554612196919061310a565b905083600101547f000000000000000000000000000000000000000000000000000000e8d4a510008286600001546121ce91906133ea565b6121d8919061345b565b6121e291906133b6565b955050505061223b565b80600101547f000000000000000000000000000000000000000000000000000000e8d4a51000600554836000015461222491906133ea565b61222e919061345b565b61223891906133b6565b92505b6000600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016122989190612e62565b602060405180830381865afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d991906134a1565b90506000811461230b576064600c54856122f391906133ea565b6122fd919061345b565b84612308919061310a565b93505b60006064600f600085600301548152602001908152602001600020548661233291906133ea565b61233c919061345b565b9050808561234a91906133b6565b935050505b50915091565b600160028054906101000a900460ff16806123a257506123736111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d890613675565b60405180910390fd5b60008160ff160361247d57600260039054906101000a900460ff1680612439575061240a6111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f906136e1565b60405180910390fd5b612516565b60018160ff160361251557600260049054906101000a900460ff16806124d557506124a66111ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b9061374d565b60405180910390fd5b5b5b61251e61290b565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600081036125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a49061332a565b60405180910390fd5b60008260040154146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb90613a21565b60405180910390fd5b6000811461280957612604612a27565b6000612617826005548560010154612ac8565b9050600081146128035780600b6000828254612633919061310a565b92505081905550806004600082825461264c91906133b6565b9250508190555060006064600f600086600301548152602001908152602001600020548361267a91906133ea565b612684919061345b565b90506000818361269491906133b6565b905081600960008282546126a8919061310a565b9250508190555080600a60008282546126c1919061310a565b925050819055508085600001546126d8919061310a565b85600001819055507f000000000000000000000000000000000000000000000000000000e8d4a51000600554866000015461271391906133ea565b61271d919061345b565b8560010181905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b8b3475836040518263ffffffff1660e01b81526004016127809190612d43565b600060405180830381600087803b15801561279a57600080fd5b505af11580156127ae573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f169f1815ebdea059aac3bb00ec9a9594c7a5ffcb64a17e8392b5d84909a14556826040516127f89190612d43565b60405180910390a250505b50612844565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90613a8d565b60405180910390fd5b505061284e61295a565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603281565b60028054906101000a900460ff1681565b612895612be6565b73ffffffffffffffffffffffffffffffffffffffff166128b36111ae565b73ffffffffffffffffffffffffffffffffffffffff1614612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290090613af9565b60405180910390fd5b565b600260015403612950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294790613b65565b60405180910390fd5b6002600181905550565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600754431115612ac6576000600a54905060008103612a4d574360078190555050612ac6565b600060075443612a5d91906133b6565b9050600060085482612a6f91906133ea565b9050827f000000000000000000000000000000000000000000000000000000e8d4a5100082612a9e91906133ea565b612aa8919061345b565b600554612ab5919061310a565b600581905550436007819055505050505b565b6000817f000000000000000000000000000000000000000000000000000000e8d4a510008486612af891906133ea565b612b02919061345b565b612b0c91906133b6565b90506000600260059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612b6b9190612e62565b602060405180830381865afa158015612b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bac91906134a1565b905060008114612bde576064600c5483612bc691906133ea565b612bd0919061345b565b82612bdb919061310a565b91505b509392505050565b600033905090565b600080fd5b6000819050919050565b612c0681612bf3565b8114612c1157600080fd5b50565b600081359050612c2381612bfd565b92915050565b600060208284031215612c3f57612c3e612bee565b5b6000612c4d84828501612c14565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c8182612c56565b9050919050565b612c9181612c76565b8114612c9c57600080fd5b50565b600081359050612cae81612c88565b92915050565b600060208284031215612cca57612cc9612bee565b5b6000612cd884828501612c9f565b91505092915050565b612cea81612bf3565b82525050565b600060a082019050612d056000830188612ce1565b612d126020830187612ce1565b612d1f6040830186612ce1565b612d2c6060830185612ce1565b612d396080830184612ce1565b9695505050505050565b6000602082019050612d586000830184612ce1565b92915050565b60008115159050919050565b612d7381612d5e565b82525050565b6000602082019050612d8e6000830184612d6a565b92915050565b60008060408385031215612dab57612daa612bee565b5b6000612db985828601612c9f565b9250506020612dca85828601612c14565b9150509250929050565b612ddd81612d5e565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600080600060608486031215612e1957612e18612bee565b5b6000612e2786828701612deb565b9350506020612e3886828701612deb565b9250506040612e4986828701612deb565b9150509250925092565b612e5c81612c76565b82525050565b6000602082019050612e776000830184612e53565b92915050565b60008060408385031215612e9457612e93612bee565b5b6000612ea285828601612c14565b9250506020612eb385828601612c14565b9150509250929050565b6000604082019050612ed26000830185612ce1565b612edf6020830184612ce1565b9392505050565b6000819050919050565b6000612f0b612f06612f0184612c56565b612ee6565b612c56565b9050919050565b6000612f1d82612ef0565b9050919050565b6000612f2f82612f12565b9050919050565b612f3f81612f24565b82525050565b6000602082019050612f5a6000830184612f36565b92915050565b600082825260208201905092915050565b7f5265776172642070657220626c6f636b2073686f756c6420626520677265617460008201527f6572207468616e20300000000000000000000000000000000000000000000000602082015250565b6000612fcd602983612f60565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613039601383612f60565b915061304482613003565b602082019050919050565b600060208201905081810360008301526130688161302c565b9050919050565b7f4e6f20616d6f756e7420746f2077697468647261770000000000000000000000600082015250565b60006130a5601583612f60565b91506130b08261306f565b602082019050919050565b600060208201905081810360008301526130d481613098565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061311582612bf3565b915061312083612bf3565b9250828201905080821115613138576131376130db565b5b92915050565b7f4d696e696d756d206c6f636b2074696d65206e6f742072656163686564000000600082015250565b6000613174601d83612f60565b915061317f8261313e565b602082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b60006040820190506131bf6000830185612e53565b6131cc6020830184612ce1565b9392505050565b6000815190506131e281612dd4565b92915050565b6000602082840312156131fe576131fd612bee565b5b600061320c848285016131d3565b91505092915050565b7f43616e6e6f74206265207374616b6564206f722072657761726420746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613271602183612f60565b915061327c82613215565b604082019050919050565b600060208201905081810360008301526132a081613264565b9050919050565b60006060820190506132bc6000830186612d6a565b6132c96020830185612d6a565b6132d66040830184612d6a565b949350505050565b7f4e6f20616d6f756e7420737461636b6564000000000000000000000000000000600082015250565b6000613314601183612f60565b915061331f826132de565b602082019050919050565b6000602082019050818103600083015261334381613307565b9050919050565b7f576974686472617720616c726561647920696e69746961746564000000000000600082015250565b6000613380601a83612f60565b915061338b8261334a565b602082019050919050565b600060208201905081810360008301526133af81613373565b9050919050565b60006133c182612bf3565b91506133cc83612bf3565b92508282039050818111156133e4576133e36130db565b5b92915050565b60006133f582612bf3565b915061340083612bf3565b925082820261340e81612bf3565b91508282048414831517613425576134246130db565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061346682612bf3565b915061347183612bf3565b9250826134815761348061342c565b5b828204905092915050565b60008151905061349b81612bfd565b92915050565b6000602082840312156134b7576134b6612bee565b5b60006134c58482850161348c565b91505092915050565b7f43616e742068617665207265776172647320696620776974686472617720696e60008201527f6974696174656400000000000000000000000000000000000000000000000000602082015250565b600061352a602783612f60565b9150613535826134ce565b604082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b7f3020737461636b65640000000000000000000000000000000000000000000000600082015250565b6000613596600983612f60565b91506135a182613560565b602082019050919050565b600060208201905081810360008301526135c581613589565b9050919050565b60006060820190506135e16000830186612e53565b6135ee6020830185612e53565b6135fb6040830184612ce1565b949350505050565b7f7374616b696e6720706c6174666f726d206e6f7420617661696c61626c65206e60008201527f6f772e0000000000000000000000000000000000000000000000000000000000602082015250565b600061365f602383612f60565b915061366a82613603565b604082019050919050565b6000602082019050818103600083015261368e81613652565b9050919050565b7f6465706f73697473206e6f7420617661696c61626c65206e6f772e0000000000600082015250565b60006136cb601b83612f60565b91506136d682613695565b602082019050919050565b600060208201905081810360008301526136fa816136be565b9050919050565b7f636f6d706f756e6473206e6f7420617661696c61626c65206e6f772e00000000600082015250565b6000613737601c83612f60565b915061374282613701565b602082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f696e76616c6964206275726e206f7074696f6e00000000000000000000000000600082015250565b60006137a3601383612f60565b91506137ae8261376d565b602082019050919050565b600060208201905081810360008301526137d281613796565b9050919050565b7f636f6f6c646f776e206e6f742070617373656400000000000000000000000000600082015250565b600061380f601383612f60565b915061381a826137d9565b602082019050919050565b6000602082019050818103600083015261383e81613802565b9050919050565b7f5573657220616d6f756e742061626f7665206c696d6974000000000000000000600082015250565b600061387b601783612f60565b915061388682613845565b602082019050919050565b600060208201905081810360008301526138aa8161386e565b9050919050565b7f63616e2774206465706f736974203020746f6b656e7300000000000000000000600082015250565b60006138e7601683612f60565b91506138f2826138b1565b602082019050919050565b60006020820190508181036000830152613916816138da565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613979602683612f60565b91506139848261391d565b604082019050919050565b600060208201905081810360008301526139a88161396c565b9050919050565b7f43616e7420636f6d706f756e6420696620776974686472617720696e6974696160008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0b602383612f60565b9150613a16826139af565b604082019050919050565b60006020820190508181036000830152613a3a816139fe565b9050919050565b7f6e6f7468696e6720746f20636f6d706f756e6400000000000000000000000000600082015250565b6000613a77601383612f60565b9150613a8282613a41565b602082019050919050565b60006020820190508181036000830152613aa681613a6a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ae3602083612f60565b9150613aee82613aad565b602082019050919050565b60006020820190508181036000830152613b1281613ad6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b4f601f83612f60565b9150613b5a82613b19565b602082019050919050565b60006020820190508181036000830152613b7e81613b42565b905091905056fea2646970667358221220741ce9fc56b66a15dd7ab369005d4961fb742b3da5b4a41221cf140431c91cab64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000335f4e66b9b61cee5ceade4e727fcec20156b2f00000000000000000000000009122f8948dba98b049f61ce6632fad85d82e5348
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x335F4e66B9B61CEE5CeaDE4e727FCEC20156B2F0
Arg [1] : _nftContractAddress (address): 0x9122f8948dba98b049F61CE6632fAd85d82e5348
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000335f4e66b9b61cee5ceade4e727fcec20156b2f0
Arg [1] : 0000000000000000000000009122f8948dba98b049f61ce6632fad85d82e5348
Deployed Bytecode Sourcemap
10700:17676:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15769:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16232:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11866:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;10919:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11276:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11213:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21390:532;;;:::i;:::-;;11417:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15221:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11533:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11917:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11121:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11023:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9589:103;;;:::i;:::-;;10866:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14341:324;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19033:1227;;;:::i;:::-;;11602:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8948:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11495:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27457:172;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11182:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11316:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11747:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11671:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11565;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11368:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10974:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20355:926;;;:::i;:::-;;11708:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11073:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11458:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11638:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17418:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23315:662;;;:::i;:::-;;17885:1060;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10764:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27818:553;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;14817:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9847:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25365:1213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22035:1185;;;:::i;:::-;;11812:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10815:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11245:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:278;8834:13;:11;:13::i;:::-;15898:1:::1;15880:15;:19;15872:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15973:15;15956:14;:32;;;;16004:35;16023:15;16004:35;;;;;;:::i;:::-;;;;;;;;15769:278:::0;:::o;16232:360::-;8834:13;:11;:13::i;:::-;16312::::1;;;;;;;;;;;16311:14;16303:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;16376:4;16360:13;;:20;;;;;;;;;;;;;;;;;;16408:15;16391:14;:32;;;;16447:12;16434:10;:25;;;;16485:4;16470:12;::::0;:19:::1;;;;;;;;;;;;;;;;;;16518:10;;16500:15;:28;;;;16544:40;16556:10;;16568:15;16544:40;;;;;;;:::i;:::-;;;;;;;;16232:360:::0;:::o;11866:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10919:48::-;10960:7;10919:48;:::o;11276:33::-;;;;;;;;;;;;;:::o;11213:25::-;;;;;;;;;;;;;:::o;21390:532::-;2345:21;:19;:21::i;:::-;21453::::1;21477:8;:20;21486:10;21477:20;;;;;;;;;;;;;;;21453:44;;21508:24;21535:4;:21;;;21508:48;;21595:1;21575:16;:21:::0;21567:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21683:15;10960:7;21641:4;:21;;;:38;;;;:::i;:::-;:57;;21633:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;21760:8;:20;21769:10;21760:20;;;;;;;;;;;;;;;;21753:27:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21791:11;;;;;;;;;;;:20;;;21820:10;21833:16;21791:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21885:10;21876:38;;;21897:16;21876:38;;;;;;:::i;:::-;;;;;;;;21432:490;;2389:20:::0;:18;:20::i;:::-;21390:532::o;11417:34::-;;;;:::o;15221:386::-;8834:13;:11;:13::i;:::-;15406:11:::1;;;;;;;;;;;15381:37;;:13;:37;;::::0;15373:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15482:13;15467:38;;;15514:10;15527:12;15467:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15571:13;15556:43;;;15586:12;15556:43;;;;;;:::i;:::-;;;;;;;;15221:386:::0;;:::o;11533:25::-;;;;:::o;11917:41::-;;;;;;;;;;;;;;;;;:::o;11121:39::-;;;:::o;11023:42::-;;;:::o;9589:103::-;8834:13;:11;:13::i;:::-;9654:30:::1;9681:1;9654:18;:30::i;:::-;9589:103::o:0;10866:46::-;10910:2;10866:46;:::o;14341:324::-;8834:13;:11;:13::i;:::-;14473::::1;14458:12;::::0;:28:::1;;;;;;;;;;;;;;;;;;14514:15;14497:14;;:32;;;;;;;;;;;;;;;;;;14558:16;14540:15;;:34;;;;;;;;;;;;;;;;;;14591:66;14608:13;14623:15;14640:16;14591:66;;;;;;;;:::i;:::-;;;;;;;;14341:324:::0;;;:::o;19033:1227::-;2345:21;:19;:21::i;:::-;19105::::1;19129:8;:20;19138:10;19129:20;;;;;;;;;;;;;;;19105:44;;19160:13;19176:4;:11;;;19160:27;;19218:1;19206:8;:13:::0;19198:43:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19285:1;19260:4;:21;;;:26;19252:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19328:13;:11;:13::i;:::-;19352:15;19378::::0;19395:65:::1;19416:8;19426:16;;19444:4;:15;;;19395:20;:65::i;:::-;19378:82;;19487:1;19476:7;:12;19472:491;;19526:7;19505:17;;:28;;;;;;;:::i;:::-;;;;;;;;19567:7;19548:15;;:26;;;;;;;:::i;:::-;;;;;;;;19644:3;19612:12;:29;19625:4;:15;;;19612:29;;;;;;;;;;;;19602:7;:39;;;;:::i;:::-;:45;;;;:::i;:::-;19589:58;;19677:10;19662:11;;:25;;;;;;;:::i;:::-;;;;;;;;19748:10;19738:7;:20;;;;:::i;:::-;19726:8;:33;;;;:::i;:::-;19702:4;:21;;:57;;;;19788:11;;;;;;;;;;;19774:38;;;19813:10;19774:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19856:10;19844:44;;;19877:10;19867:7;:20;;;;:::i;:::-;19844:44;;;;;;:::i;:::-;;;;;;;;19472:491;;;19943:8;19919:4;:21;;:32;;;;19472:491;19996:1;19973:19;;:24;;;;;;;:::i;:::-;;;;;;;;20027:8;20008:15;;:27;;;;;;;:::i;:::-;;;;;;;;20070:15;20046:4;:21;;:39;;;;20144:16;20125;;20114:8;:27;;;;:::i;:::-;:46;;;;:::i;:::-;20096:4;:15;;:64;;;;20194:10;20176:76;;;20228:10;20218:7;:20;;;;:::i;:::-;20206:8;:33;;;;:::i;:::-;20241:10;20176:76;;;;;;;:::i;:::-;;;;;;;;19079:1181;;;;2389:20:::0;:18;:20::i;:::-;19033:1227::o;11602:29::-;;;;:::o;8948:87::-;8994:7;9021:6;;;;;;;;;;;9014:13;;8948:87;:::o;11495:31::-;;;;:::o;27457:172::-;27514:12;27584:15;;27545:11;;;;;;;;;;;:21;;;27575:4;27545:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;27538:61;;27457:172;:::o;11182:24::-;;;;;;;;;;;;;:::o;11316:34::-;;;;;;;;;;;;;:::o;11747:33::-;;;;:::o;11671:30::-;;;;:::o;11565:::-;;;;:::o;11368:33::-;;;;;;;;;;;;;:::o;10974:42::-;11014:2;10974:42;:::o;20355:926::-;2345:21;:19;:21::i;:::-;20414::::1;20438:8;:20;20447:10;20438:20;;;;;;;;;;;;;;;20414:44;;20502:1;20477:4;:21;;;:26;20469:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20558:13;20574:4;:11;;;20558:27;;20616:1;20604:8;:13:::0;20596:35:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20642:13;:11;:13::i;:::-;20668:15;20686:65;20707:8;20717:16;;20735:4;:15;;;20686:20;:65::i;:::-;20668:83;;20777:1;20767:7;:11;20763:436;;;20816:7;20795:17;;:28;;;;;;;:::i;:::-;;;;;;;;20857:7;20838:15;;:26;;;;;;;:::i;:::-;;;;;;;;20879:15;20939:3;20907:12;:29;20920:4;:15;;;20907:29;;;;;;;;;;;;20897:7;:39;;;;:::i;:::-;:45;;;;:::i;:::-;20879:63;;20972:10;20957:11;;:25;;;;;;;:::i;:::-;;;;;;;;21011:11;;;;;;;;;;;20997:38;;;21036:10;20997:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21062:11;;;;;;;;;;;:20;;;21091:10;21112;21104:7;:18;;;;:::i;:::-;21062:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21155:10;21143:44;;;21176:10;21166:7;:20;;;;:::i;:::-;21143:44;;;;;;:::i;:::-;;;;;;;;20780:419;20763:436;21257:16;21238;;21227:8;:27;;;;:::i;:::-;:46;;;;:::i;:::-;21209:4;:15;;:64;;;;20402:879;;;2389:20:::0;:18;:20::i;:::-;20355:926::o;11708:32::-;;;;:::o;11073:41::-;;;:::o;11458:30::-;;;;:::o;11638:26::-;;;;:::o;17418:200::-;17491:6;17472:15;;:25;;;;;;;:::i;:::-;;;;;;;;17508:11;;;;;;;;;;;:24;;;17541:10;17562:4;17569:6;17508:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17592:18;17603:6;17592:18;;;;;;:::i;:::-;;;;;;;;17418:200;:::o;23315:662::-;2345:21;:19;:21::i;:::-;23377::::1;23401:8;:20;23410:10;23401:20;;;;;;;;;;;;;;;23377:44;;23432:24;23459:4;:11;;;23432:38;;23509:1;23489:16;:21:::0;23481:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23566:16;23547:15;;:35;;;;;;;:::i;:::-;;;;;;;;23593:15;23647:3;11014:2;23612:16;:32;;;;:::i;:::-;:38;;;;:::i;:::-;23593:58;;23700:7;23681:16;:26;;;;:::i;:::-;23662:45;;23756:7;23737:15;;:26;;;;;;;:::i;:::-;;;;;;;;23797:1;23774:19;;:24;;;;;;;:::i;:::-;;;;;;;;23816:8;:20;23825:10;23816:20;;;;;;;;;;;;;;;;23809:27:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23847:11;;;;;;;;;;;:20;;;23876:10;23889:16;23847:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23940:10;23922:47;;;23952:16;23922:47;;;;;;:::i;:::-;;;;;;;;23366:611;;;2389:20:::0;:18;:20::i;:::-;23315:662::o;17885:1060::-;17962:1;16849:12;;;;;;;;;;:37;;;;16879:7;:5;:7::i;:::-;16865:21;;:10;:21;;;16849:37;16841:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;16954:1;16940:10;:15;;;16936:269;;16980:14;;;;;;;;;;;:39;;;;17012:7;:5;:7::i;:::-;16998:21;;:10;:21;;;16980:39;16972:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;16936:269;;;17095:1;17081:10;:15;;;17077:128;;17121:15;;;;;;;;;;;:40;;;;17154:7;:5;:7::i;:::-;17140:21;;:10;:21;;;17121:40;17113:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;17077:128;16936:269;2345:21:::1;:19;:21::i;:::-;18012:1:::2;17997:11;:16;:36;;;;18032:1;18017:11;:16;17997:36;:56;;;;18052:1;18037:11;:16;17997:56;17989:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;18136:15;18096:8;:20;18105:10;18096:20;;;;;;;;;;;;;;;:37;;;:55;18088:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;18186:21;18210:8;:20;18219:10;18210:20;;;;;;;;;;;;;;;18186:44;;18241:21;18265:4;:11;;;18241:35;;18325:17;18305:16;18295:7;:26;;;;:::i;:::-;:47;;18287:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;18396:1;18385:7;:12;18381:273;;18447:7;18428:16;:26;;;;:::i;:::-;18414:4;:11;;:40;;;;18488:7;18469:15;;:26;;;;;;;:::i;:::-;;;;;;;;18510:11;;;;;;;;;;;:24;;;18543:10;18564:4;18571:7;18510:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18381:273;;;18610:32;;;;;;;;;;:::i;:::-;;;;;;;;18381:273;18688:1;18668:16;:21:::0;18664:122:::2;;18729:1;18706:19;;:24;;;;;;;:::i;:::-;;;;;;;;18763:11;18745:4;:15;;:29;;;;18664:122;18798:13;:11;:13::i;:::-;18875:16;18856;;18842:4;:11;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;18824:4;:15;;:67;;;;18917:10;18909:28;;;18929:7;18909:28;;;;;;:::i;:::-;;;;;;;;17978:967;;2389:20:::1;:18;:20::i;:::-;17885:1060:::0;;;:::o;10764:44::-;10806:2;10764:44;:::o;27818:553::-;27865:21;27888:18;27919:17;27939:14;27919:34;;27988:1;27969:15;;:20;:44;;;;28012:1;27993:15;;:20;27969:44;27965:389;;;28046:1;28030:17;;28075:1;28062:14;;27965:389;;;28157:15;;28141:12;28124:14;;:29;;;;:::i;:::-;28123:49;;;;:::i;:::-;28107:65;;28187:17;28263:3;28242:18;;28225:14;;:35;;;;:::i;:::-;:41;;;;:::i;:::-;28207:14;;:60;;;;:::i;:::-;28187:80;;28327:15;;28311:12;28296;:27;;;;:::i;:::-;28295:47;;;;:::i;:::-;28282:60;;28092:262;27965:389;27908:463;27818:553;;:::o;14817:166::-;8834:13;:11;:13::i;:::-;14920:11:::1;14899:18;:32;;;;14947:28;14963:11;14947:28;;;;;;:::i;:::-;;;;;;;;14817:166:::0;:::o;9847:201::-;8834:13;:11;:13::i;:::-;9956:1:::1;9936:22;;:8;:22;;::::0;9928:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10012:28;10031:8;10012:18;:28::i;:::-;9847:201:::0;:::o;25365:1213::-;25426:15;25443:24;25480:21;25504:8;:15;25513:5;25504:15;;;;;;;;;;;;;;;25480:39;;25558:1;25533:4;:21;;;:26;25530:1041;;25585:1;25575:11;;25620:4;:21;;;25601:40;;25530:1041;;;25693:15;;25678:12;:30;:54;;;;;25731:1;25712:15;;:20;;25678:54;25674:553;;;25753:18;25789:15;;25774:12;:30;;;;:::i;:::-;25753:51;;25823:18;25857:14;;25844:10;:27;;;;:::i;:::-;25823:48;;25890:29;25974:15;;25955:16;25942:10;:29;;;;:::i;:::-;:47;;;;:::i;:::-;25922:16;;:68;;;;:::i;:::-;25890:100;;26076:4;:15;;;26057:16;26033:21;26019:4;:11;;;:35;;;;:::i;:::-;:54;;;;:::i;:::-;:72;;;;:::i;:::-;26009:82;;25734:375;;;25674:553;;;26196:4;:15;;;26177:16;26158;;26144:4;:11;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;26134:77;;25674:553;26241:11;26269:18;;;;;;;;;;;26255:43;;;26299:5;26255:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26241:64;;26334:1;26324:6;:11;26321:107;;26408:3;26387:18;;26377:7;:28;;;;:::i;:::-;:34;;;;:::i;:::-;26366:7;:46;;;;:::i;:::-;26356:56;;26321:107;26442:15;26502:3;26470:12;:29;26483:4;:15;;;26470:29;;;;;;;;;;;;26460:7;:39;;;;:::i;:::-;:45;;;;:::i;:::-;26442:63;;26549:10;26539:7;:20;;;;:::i;:::-;26520:39;;25659:912;;25530:1041;25469:1109;25365:1213;;;:::o;22035:1185::-;22077:1;16849:12;;;;;;;;;;:37;;;;16879:7;:5;:7::i;:::-;16865:21;;:10;:21;;;16849:37;16841:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;16954:1;16940:10;:15;;;16936:269;;16980:14;;;;;;;;;;;:39;;;;17012:7;:5;:7::i;:::-;16998:21;;:10;:21;;;16980:39;16972:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;16936:269;;;17095:1;17081:10;:15;;;17077:128;;17121:15;;;;;;;;;;;:40;;;;17154:7;:5;:7::i;:::-;17140:21;;:10;:21;;;17121:40;17113:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;17077:128;16936:269;2345:21:::1;:19;:21::i;:::-;22104::::2;22128:8;:20;22137:10;22128:20;;;;;;;;;;;;;;;22104:44;;22159:13;22175:4;:11;;;22159:27;;22217:1;22205:8;:13:::0;22197:43:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;22284:1;22259:4;:21;;;:26;22251:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22351:1;22339:8;:13;22336:877;;22369:13;:11;:13::i;:::-;22397:12;22412:65;22433:8;22443:16;;22461:4;:15;;;22412:20;:65::i;:::-;22397:80;;22506:1;22495:7;:12;22492:648;;22549:7;22528:17;;:28;;;;;;;:::i;:::-;;;;;;;;22594:7;22575:15;;:26;;;;;;;:::i;:::-;;;;;;;;22620:15;22680:3;22648:12;:29;22661:4;:15;;;22648:29;;;;;;;;;;;;22638:7;:39;;;;:::i;:::-;:45;;;;:::i;:::-;22620:63;;22702:21;22736:10;22726:7;:20;;;;:::i;:::-;22702:44;;22780:10;22765:11;;:25;;;;;;;:::i;:::-;;;;;;;;22828:16;22809:15;;:35;;;;;;;:::i;:::-;;;;;;;;22891:16;22877:4;:11;;;:30;;;;:::i;:::-;22863:4;:11;;:44;;;;22977:16;22958;;22944:4;:11;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;22926:4;:15;;:67;;;;23026:11;;;;;;;;;;;23012:38;;;23051:10;23012:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;23095:10;23086:38;;;23107:16;23086:38;;;;;;:::i;:::-;;;;;;;;22509:631;;22492:648;22354:797;22336:877;;;23172:29;;;;;;;;;;:::i;:::-;;;;;;;;22336:877;22093:1127;;2389:20:::1;:18;:20::i;:::-;22035:1185:::0;:::o;11812:33::-;;;;;;;;;;;;;:::o;10815:44::-;10857:2;10815:44;:::o;11245:24::-;;;;;;;;;;;;:::o;9113:132::-;9188:12;:10;:12::i;:::-;9177:23;;:7;:5;:7::i;:::-;:23;;;9169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9113:132::o;2425:293::-;1827:1;2559:7;;:19;2551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1827:1;2692:7;:18;;;;2425:293::o;2726:213::-;1783:1;2909:7;:22;;;;2726:213::o;10208:191::-;10282:16;10301:6;;;;;;;;;;;10282:25;;10327:8;10318:6;;:17;;;;;;;;;;;;;;;;;;10382:8;10351:40;;10372:8;10351:40;;;;;;;;;;;;10271:128;10208:191;:::o;26719:552::-;26782:15;;26766:12;:31;26762:70;26814:7;26762:70;26842:25;26870:15;;26842:43;;26921:1;26900:17;:22;26896:106;;26957:12;26939:15;:30;;;;26984:7;;;26896:106;27012:18;27048:15;;27033:12;:30;;;;:::i;:::-;27012:51;;27074:18;27108:14;;27095:10;:27;;;;:::i;:::-;27074:48;;27204:17;27185:16;27172:10;:29;;;;:::i;:::-;:49;;;;:::i;:::-;27152:16;;:70;;;;:::i;:::-;27133:16;:89;;;;27251:12;27233:15;:30;;;;26751:520;;;26719:552;:::o;24475:400::-;24569:15;24650:4;24631:16;24615:13;24608:4;:20;;;;:::i;:::-;:39;;;;:::i;:::-;:46;;;;:::i;:::-;24598:56;;24665:11;24693:18;;;;;;;;;;;24679:43;;;24723:10;24679:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24665:69;;24759:1;24749:6;:11;24746:97;;24827:3;24806:18;;24796:7;:28;;;;:::i;:::-;:34;;;;:::i;:::-;24787:7;:44;;;;:::i;:::-;24777:54;;24746:97;24853:14;24475:400;;;;;:::o;7499:98::-;7552:7;7579:10;7572:17;;7499:98;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:329::-;1591:6;1640:2;1628:9;1619:7;1615:23;1611:32;1608:119;;;1646:79;;:::i;:::-;1608:119;1766:1;1791:53;1836:7;1827:6;1816:9;1812:22;1791:53;:::i;:::-;1781:63;;1737:117;1532:329;;;;:::o;1867:118::-;1954:24;1972:5;1954:24;:::i;:::-;1949:3;1942:37;1867:118;;:::o;1991:664::-;2196:4;2234:3;2223:9;2219:19;2211:27;;2248:71;2316:1;2305:9;2301:17;2292:6;2248:71;:::i;:::-;2329:72;2397:2;2386:9;2382:18;2373:6;2329:72;:::i;:::-;2411;2479:2;2468:9;2464:18;2455:6;2411:72;:::i;:::-;2493;2561:2;2550:9;2546:18;2537:6;2493:72;:::i;:::-;2575:73;2643:3;2632:9;2628:19;2619:6;2575:73;:::i;:::-;1991:664;;;;;;;;:::o;2661:222::-;2754:4;2792:2;2781:9;2777:18;2769:26;;2805:71;2873:1;2862:9;2858:17;2849:6;2805:71;:::i;:::-;2661:222;;;;:::o;2889:90::-;2923:7;2966:5;2959:13;2952:21;2941:32;;2889:90;;;:::o;2985:109::-;3066:21;3081:5;3066:21;:::i;:::-;3061:3;3054:34;2985:109;;:::o;3100:210::-;3187:4;3225:2;3214:9;3210:18;3202:26;;3238:65;3300:1;3289:9;3285:17;3276:6;3238:65;:::i;:::-;3100:210;;;;:::o;3316:474::-;3384:6;3392;3441:2;3429:9;3420:7;3416:23;3412:32;3409:119;;;3447:79;;:::i;:::-;3409:119;3567:1;3592:53;3637:7;3628:6;3617:9;3613:22;3592:53;:::i;:::-;3582:63;;3538:117;3694:2;3720:53;3765:7;3756:6;3745:9;3741:22;3720:53;:::i;:::-;3710:63;;3665:118;3316:474;;;;;:::o;3796:116::-;3866:21;3881:5;3866:21;:::i;:::-;3859:5;3856:32;3846:60;;3902:1;3899;3892:12;3846:60;3796:116;:::o;3918:133::-;3961:5;3999:6;3986:20;3977:29;;4015:30;4039:5;4015:30;:::i;:::-;3918:133;;;;:::o;4057:601::-;4125:6;4133;4141;4190:2;4178:9;4169:7;4165:23;4161:32;4158:119;;;4196:79;;:::i;:::-;4158:119;4316:1;4341:50;4383:7;4374:6;4363:9;4359:22;4341:50;:::i;:::-;4331:60;;4287:114;4440:2;4466:50;4508:7;4499:6;4488:9;4484:22;4466:50;:::i;:::-;4456:60;;4411:115;4565:2;4591:50;4633:7;4624:6;4613:9;4609:22;4591:50;:::i;:::-;4581:60;;4536:115;4057:601;;;;;:::o;4664:118::-;4751:24;4769:5;4751:24;:::i;:::-;4746:3;4739:37;4664:118;;:::o;4788:222::-;4881:4;4919:2;4908:9;4904:18;4896:26;;4932:71;5000:1;4989:9;4985:17;4976:6;4932:71;:::i;:::-;4788:222;;;;:::o;5016:474::-;5084:6;5092;5141:2;5129:9;5120:7;5116:23;5112:32;5109:119;;;5147:79;;:::i;:::-;5109:119;5267:1;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5238:117;5394:2;5420:53;5465:7;5456:6;5445:9;5441:22;5420:53;:::i;:::-;5410:63;;5365:118;5016:474;;;;;:::o;5496:332::-;5617:4;5655:2;5644:9;5640:18;5632:26;;5668:71;5736:1;5725:9;5721:17;5712:6;5668:71;:::i;:::-;5749:72;5817:2;5806:9;5802:18;5793:6;5749:72;:::i;:::-;5496:332;;;;;:::o;5834:60::-;5862:3;5883:5;5876:12;;5834:60;;;:::o;5900:142::-;5950:9;5983:53;6001:34;6010:24;6028:5;6010:24;:::i;:::-;6001:34;:::i;:::-;5983:53;:::i;:::-;5970:66;;5900:142;;;:::o;6048:126::-;6098:9;6131:37;6162:5;6131:37;:::i;:::-;6118:50;;6048:126;;;:::o;6180:148::-;6252:9;6285:37;6316:5;6285:37;:::i;:::-;6272:50;;6180:148;;;:::o;6334:175::-;6443:59;6496:5;6443:59;:::i;:::-;6438:3;6431:72;6334:175;;:::o;6515:266::-;6630:4;6668:2;6657:9;6653:18;6645:26;;6681:93;6771:1;6760:9;6756:17;6747:6;6681:93;:::i;:::-;6515:266;;;;:::o;6787:169::-;6871:11;6905:6;6900:3;6893:19;6945:4;6940:3;6936:14;6921:29;;6787:169;;;;:::o;6962:228::-;7102:34;7098:1;7090:6;7086:14;7079:58;7171:11;7166:2;7158:6;7154:15;7147:36;6962:228;:::o;7196:366::-;7338:3;7359:67;7423:2;7418:3;7359:67;:::i;:::-;7352:74;;7435:93;7524:3;7435:93;:::i;:::-;7553:2;7548:3;7544:12;7537:19;;7196:366;;;:::o;7568:419::-;7734:4;7772:2;7761:9;7757:18;7749:26;;7821:9;7815:4;7811:20;7807:1;7796:9;7792:17;7785:47;7849:131;7975:4;7849:131;:::i;:::-;7841:139;;7568:419;;;:::o;7993:169::-;8133:21;8129:1;8121:6;8117:14;8110:45;7993:169;:::o;8168:366::-;8310:3;8331:67;8395:2;8390:3;8331:67;:::i;:::-;8324:74;;8407:93;8496:3;8407:93;:::i;:::-;8525:2;8520:3;8516:12;8509:19;;8168:366;;;:::o;8540:419::-;8706:4;8744:2;8733:9;8729:18;8721:26;;8793:9;8787:4;8783:20;8779:1;8768:9;8764:17;8757:47;8821:131;8947:4;8821:131;:::i;:::-;8813:139;;8540:419;;;:::o;8965:171::-;9105:23;9101:1;9093:6;9089:14;9082:47;8965:171;:::o;9142:366::-;9284:3;9305:67;9369:2;9364:3;9305:67;:::i;:::-;9298:74;;9381:93;9470:3;9381:93;:::i;:::-;9499:2;9494:3;9490:12;9483:19;;9142:366;;;:::o;9514:419::-;9680:4;9718:2;9707:9;9703:18;9695:26;;9767:9;9761:4;9757:20;9753:1;9742:9;9738:17;9731:47;9795:131;9921:4;9795:131;:::i;:::-;9787:139;;9514:419;;;:::o;9939:180::-;9987:77;9984:1;9977:88;10084:4;10081:1;10074:15;10108:4;10105:1;10098:15;10125:191;10165:3;10184:20;10202:1;10184:20;:::i;:::-;10179:25;;10218:20;10236:1;10218:20;:::i;:::-;10213:25;;10261:1;10258;10254:9;10247:16;;10282:3;10279:1;10276:10;10273:36;;;10289:18;;:::i;:::-;10273:36;10125:191;;;;:::o;10322:179::-;10462:31;10458:1;10450:6;10446:14;10439:55;10322:179;:::o;10507:366::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:419::-;11045:4;11083:2;11072:9;11068:18;11060:26;;11132:9;11126:4;11122:20;11118:1;11107:9;11103:17;11096:47;11160:131;11286:4;11160:131;:::i;:::-;11152:139;;10879:419;;;:::o;11304:332::-;11425:4;11463:2;11452:9;11448:18;11440:26;;11476:71;11544:1;11533:9;11529:17;11520:6;11476:71;:::i;:::-;11557:72;11625:2;11614:9;11610:18;11601:6;11557:72;:::i;:::-;11304:332;;;;;:::o;11642:137::-;11696:5;11727:6;11721:13;11712:22;;11743:30;11767:5;11743:30;:::i;:::-;11642:137;;;;:::o;11785:345::-;11852:6;11901:2;11889:9;11880:7;11876:23;11872:32;11869:119;;;11907:79;;:::i;:::-;11869:119;12027:1;12052:61;12105:7;12096:6;12085:9;12081:22;12052:61;:::i;:::-;12042:71;;11998:125;11785:345;;;;:::o;12136:220::-;12276:34;12272:1;12264:6;12260:14;12253:58;12345:3;12340:2;12332:6;12328:15;12321:28;12136:220;:::o;12362:366::-;12504:3;12525:67;12589:2;12584:3;12525:67;:::i;:::-;12518:74;;12601:93;12690:3;12601:93;:::i;:::-;12719:2;12714:3;12710:12;12703:19;;12362:366;;;:::o;12734:419::-;12900:4;12938:2;12927:9;12923:18;12915:26;;12987:9;12981:4;12977:20;12973:1;12962:9;12958:17;12951:47;13015:131;13141:4;13015:131;:::i;:::-;13007:139;;12734:419;;;:::o;13159:406::-;13290:4;13328:2;13317:9;13313:18;13305:26;;13341:65;13403:1;13392:9;13388:17;13379:6;13341:65;:::i;:::-;13416:66;13478:2;13467:9;13463:18;13454:6;13416:66;:::i;:::-;13492;13554:2;13543:9;13539:18;13530:6;13492:66;:::i;:::-;13159:406;;;;;;:::o;13571:167::-;13711:19;13707:1;13699:6;13695:14;13688:43;13571:167;:::o;13744:366::-;13886:3;13907:67;13971:2;13966:3;13907:67;:::i;:::-;13900:74;;13983:93;14072:3;13983:93;:::i;:::-;14101:2;14096:3;14092:12;14085:19;;13744:366;;;:::o;14116:419::-;14282:4;14320:2;14309:9;14305:18;14297:26;;14369:9;14363:4;14359:20;14355:1;14344:9;14340:17;14333:47;14397:131;14523:4;14397:131;:::i;:::-;14389:139;;14116:419;;;:::o;14541:176::-;14681:28;14677:1;14669:6;14665:14;14658:52;14541:176;:::o;14723:366::-;14865:3;14886:67;14950:2;14945:3;14886:67;:::i;:::-;14879:74;;14962:93;15051:3;14962:93;:::i;:::-;15080:2;15075:3;15071:12;15064:19;;14723:366;;;:::o;15095:419::-;15261:4;15299:2;15288:9;15284:18;15276:26;;15348:9;15342:4;15338:20;15334:1;15323:9;15319:17;15312:47;15376:131;15502:4;15376:131;:::i;:::-;15368:139;;15095:419;;;:::o;15520:194::-;15560:4;15580:20;15598:1;15580:20;:::i;:::-;15575:25;;15614:20;15632:1;15614:20;:::i;:::-;15609:25;;15658:1;15655;15651:9;15643:17;;15682:1;15676:4;15673:11;15670:37;;;15687:18;;:::i;:::-;15670:37;15520:194;;;;:::o;15720:410::-;15760:7;15783:20;15801:1;15783:20;:::i;:::-;15778:25;;15817:20;15835:1;15817:20;:::i;:::-;15812:25;;15872:1;15869;15865:9;15894:30;15912:11;15894:30;:::i;:::-;15883:41;;16073:1;16064:7;16060:15;16057:1;16054:22;16034:1;16027:9;16007:83;15984:139;;16103:18;;:::i;:::-;15984:139;15768:362;15720:410;;;;:::o;16136:180::-;16184:77;16181:1;16174:88;16281:4;16278:1;16271:15;16305:4;16302:1;16295:15;16322:185;16362:1;16379:20;16397:1;16379:20;:::i;:::-;16374:25;;16413:20;16431:1;16413:20;:::i;:::-;16408:25;;16452:1;16442:35;;16457:18;;:::i;:::-;16442:35;16499:1;16496;16492:9;16487:14;;16322:185;;;;:::o;16513:143::-;16570:5;16601:6;16595:13;16586:22;;16617:33;16644:5;16617:33;:::i;:::-;16513:143;;;;:::o;16662:351::-;16732:6;16781:2;16769:9;16760:7;16756:23;16752:32;16749:119;;;16787:79;;:::i;:::-;16749:119;16907:1;16932:64;16988:7;16979:6;16968:9;16964:22;16932:64;:::i;:::-;16922:74;;16878:128;16662:351;;;;:::o;17019:226::-;17159:34;17155:1;17147:6;17143:14;17136:58;17228:9;17223:2;17215:6;17211:15;17204:34;17019:226;:::o;17251:366::-;17393:3;17414:67;17478:2;17473:3;17414:67;:::i;:::-;17407:74;;17490:93;17579:3;17490:93;:::i;:::-;17608:2;17603:3;17599:12;17592:19;;17251:366;;;:::o;17623:419::-;17789:4;17827:2;17816:9;17812:18;17804:26;;17876:9;17870:4;17866:20;17862:1;17851:9;17847:17;17840:47;17904:131;18030:4;17904:131;:::i;:::-;17896:139;;17623:419;;;:::o;18048:159::-;18188:11;18184:1;18176:6;18172:14;18165:35;18048:159;:::o;18213:365::-;18355:3;18376:66;18440:1;18435:3;18376:66;:::i;:::-;18369:73;;18451:93;18540:3;18451:93;:::i;:::-;18569:2;18564:3;18560:12;18553:19;;18213:365;;;:::o;18584:419::-;18750:4;18788:2;18777:9;18773:18;18765:26;;18837:9;18831:4;18827:20;18823:1;18812:9;18808:17;18801:47;18865:131;18991:4;18865:131;:::i;:::-;18857:139;;18584:419;;;:::o;19009:442::-;19158:4;19196:2;19185:9;19181:18;19173:26;;19209:71;19277:1;19266:9;19262:17;19253:6;19209:71;:::i;:::-;19290:72;19358:2;19347:9;19343:18;19334:6;19290:72;:::i;:::-;19372;19440:2;19429:9;19425:18;19416:6;19372:72;:::i;:::-;19009:442;;;;;;:::o;19457:222::-;19597:34;19593:1;19585:6;19581:14;19574:58;19666:5;19661:2;19653:6;19649:15;19642:30;19457:222;:::o;19685:366::-;19827:3;19848:67;19912:2;19907:3;19848:67;:::i;:::-;19841:74;;19924:93;20013:3;19924:93;:::i;:::-;20042:2;20037:3;20033:12;20026:19;;19685:366;;;:::o;20057:419::-;20223:4;20261:2;20250:9;20246:18;20238:26;;20310:9;20304:4;20300:20;20296:1;20285:9;20281:17;20274:47;20338:131;20464:4;20338:131;:::i;:::-;20330:139;;20057:419;;;:::o;20482:177::-;20622:29;20618:1;20610:6;20606:14;20599:53;20482:177;:::o;20665:366::-;20807:3;20828:67;20892:2;20887:3;20828:67;:::i;:::-;20821:74;;20904:93;20993:3;20904:93;:::i;:::-;21022:2;21017:3;21013:12;21006:19;;20665:366;;;:::o;21037:419::-;21203:4;21241:2;21230:9;21226:18;21218:26;;21290:9;21284:4;21280:20;21276:1;21265:9;21261:17;21254:47;21318:131;21444:4;21318:131;:::i;:::-;21310:139;;21037:419;;;:::o;21462:178::-;21602:30;21598:1;21590:6;21586:14;21579:54;21462:178;:::o;21646:366::-;21788:3;21809:67;21873:2;21868:3;21809:67;:::i;:::-;21802:74;;21885:93;21974:3;21885:93;:::i;:::-;22003:2;21998:3;21994:12;21987:19;;21646:366;;;:::o;22018:419::-;22184:4;22222:2;22211:9;22207:18;22199:26;;22271:9;22265:4;22261:20;22257:1;22246:9;22242:17;22235:47;22299:131;22425:4;22299:131;:::i;:::-;22291:139;;22018:419;;;:::o;22443:169::-;22583:21;22579:1;22571:6;22567:14;22560:45;22443:169;:::o;22618:366::-;22760:3;22781:67;22845:2;22840:3;22781:67;:::i;:::-;22774:74;;22857:93;22946:3;22857:93;:::i;:::-;22975:2;22970:3;22966:12;22959:19;;22618:366;;;:::o;22990:419::-;23156:4;23194:2;23183:9;23179:18;23171:26;;23243:9;23237:4;23233:20;23229:1;23218:9;23214:17;23207:47;23271:131;23397:4;23271:131;:::i;:::-;23263:139;;22990:419;;;:::o;23415:169::-;23555:21;23551:1;23543:6;23539:14;23532:45;23415:169;:::o;23590:366::-;23732:3;23753:67;23817:2;23812:3;23753:67;:::i;:::-;23746:74;;23829:93;23918:3;23829:93;:::i;:::-;23947:2;23942:3;23938:12;23931:19;;23590:366;;;:::o;23962:419::-;24128:4;24166:2;24155:9;24151:18;24143:26;;24215:9;24209:4;24205:20;24201:1;24190:9;24186:17;24179:47;24243:131;24369:4;24243:131;:::i;:::-;24235:139;;23962:419;;;:::o;24387:173::-;24527:25;24523:1;24515:6;24511:14;24504:49;24387:173;:::o;24566:366::-;24708:3;24729:67;24793:2;24788:3;24729:67;:::i;:::-;24722:74;;24805:93;24894:3;24805:93;:::i;:::-;24923:2;24918:3;24914:12;24907:19;;24566:366;;;:::o;24938:419::-;25104:4;25142:2;25131:9;25127:18;25119:26;;25191:9;25185:4;25181:20;25177:1;25166:9;25162:17;25155:47;25219:131;25345:4;25219:131;:::i;:::-;25211:139;;24938:419;;;:::o;25363:172::-;25503:24;25499:1;25491:6;25487:14;25480:48;25363:172;:::o;25541:366::-;25683:3;25704:67;25768:2;25763:3;25704:67;:::i;:::-;25697:74;;25780:93;25869:3;25780:93;:::i;:::-;25898:2;25893:3;25889:12;25882:19;;25541:366;;;:::o;25913:419::-;26079:4;26117:2;26106:9;26102:18;26094:26;;26166:9;26160:4;26156:20;26152:1;26141:9;26137:17;26130:47;26194:131;26320:4;26194:131;:::i;:::-;26186:139;;25913:419;;;:::o;26338:225::-;26478:34;26474:1;26466:6;26462:14;26455:58;26547:8;26542:2;26534:6;26530:15;26523:33;26338:225;:::o;26569:366::-;26711:3;26732:67;26796:2;26791:3;26732:67;:::i;:::-;26725:74;;26808:93;26897:3;26808:93;:::i;:::-;26926:2;26921:3;26917:12;26910:19;;26569:366;;;:::o;26941:419::-;27107:4;27145:2;27134:9;27130:18;27122:26;;27194:9;27188:4;27184:20;27180:1;27169:9;27165:17;27158:47;27222:131;27348:4;27222:131;:::i;:::-;27214:139;;26941:419;;;:::o;27366:222::-;27506:34;27502:1;27494:6;27490:14;27483:58;27575:5;27570:2;27562:6;27558:15;27551:30;27366:222;:::o;27594:366::-;27736:3;27757:67;27821:2;27816:3;27757:67;:::i;:::-;27750:74;;27833:93;27922:3;27833:93;:::i;:::-;27951:2;27946:3;27942:12;27935:19;;27594:366;;;:::o;27966:419::-;28132:4;28170:2;28159:9;28155:18;28147:26;;28219:9;28213:4;28209:20;28205:1;28194:9;28190:17;28183:47;28247:131;28373:4;28247:131;:::i;:::-;28239:139;;27966:419;;;:::o;28391:169::-;28531:21;28527:1;28519:6;28515:14;28508:45;28391:169;:::o;28566:366::-;28708:3;28729:67;28793:2;28788:3;28729:67;:::i;:::-;28722:74;;28805:93;28894:3;28805:93;:::i;:::-;28923:2;28918:3;28914:12;28907:19;;28566:366;;;:::o;28938:419::-;29104:4;29142:2;29131:9;29127:18;29119:26;;29191:9;29185:4;29181:20;29177:1;29166:9;29162:17;29155:47;29219:131;29345:4;29219:131;:::i;:::-;29211:139;;28938:419;;;:::o;29363:182::-;29503:34;29499:1;29491:6;29487:14;29480:58;29363:182;:::o;29551:366::-;29693:3;29714:67;29778:2;29773:3;29714:67;:::i;:::-;29707:74;;29790:93;29879:3;29790:93;:::i;:::-;29908:2;29903:3;29899:12;29892:19;;29551:366;;;:::o;29923:419::-;30089:4;30127:2;30116:9;30112:18;30104:26;;30176:9;30170:4;30166:20;30162:1;30151:9;30147:17;30140:47;30204:131;30330:4;30204:131;:::i;:::-;30196:139;;29923:419;;;:::o;30348:181::-;30488:33;30484:1;30476:6;30472:14;30465:57;30348:181;:::o;30535:366::-;30677:3;30698:67;30762:2;30757:3;30698:67;:::i;:::-;30691:74;;30774:93;30863:3;30774:93;:::i;:::-;30892:2;30887:3;30883:12;30876:19;;30535:366;;;:::o;30907:419::-;31073:4;31111:2;31100:9;31096:18;31088:26;;31160:9;31154:4;31150:20;31146:1;31135:9;31131:17;31124:47;31188:131;31314:4;31188:131;:::i;:::-;31180:139;;30907:419;;;:::o
Swarm Source
ipfs://741ce9fc56b66a15dd7ab369005d4961fb742b3da5b4a41221cf140431c91cab
Loading...
Loading
Loading...
Loading
Net Worth in USD
$16,390.69
Net Worth in ETH
8.360941
Token Allocations
ELMO
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000635 | 25,810,070.302 | $16,390.69 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.