This nametag was submitted by Kleros Scout.
Latest 25 from a total of 107,417 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Prebook | 38388346 | 111 days ago | IN | 0 ETH | 0.00000029 | ||||
| Prebook | 38388316 | 111 days ago | IN | 0 ETH | 0.00000031 | ||||
| Prebook | 38388286 | 111 days ago | IN | 0 ETH | 0.00000033 | ||||
| Prebook | 38388254 | 111 days ago | IN | 0 ETH | 0.00000038 | ||||
| Prebook | 38388224 | 111 days ago | IN | 0 ETH | 0.00000035 | ||||
| Prebook | 38388194 | 111 days ago | IN | 0 ETH | 0.00000034 | ||||
| Prebook | 38388164 | 111 days ago | IN | 0 ETH | 0.00000034 | ||||
| Prebook | 38388133 | 111 days ago | IN | 0 ETH | 0.00000028 | ||||
| Prebook | 38388103 | 111 days ago | IN | 0 ETH | 0.00000028 | ||||
| Prebook | 38388073 | 111 days ago | IN | 0 ETH | 0.00000026 | ||||
| Prebook | 38388042 | 111 days ago | IN | 0 ETH | 0.00000024 | ||||
| Prebook | 38388012 | 111 days ago | IN | 0 ETH | 0.00000022 | ||||
| Prebook | 38387982 | 111 days ago | IN | 0 ETH | 0.00000023 | ||||
| Prebook | 38387952 | 111 days ago | IN | 0 ETH | 0.00000022 | ||||
| Prebook | 38387921 | 111 days ago | IN | 0 ETH | 0.00000024 | ||||
| Prebook | 38387891 | 111 days ago | IN | 0 ETH | 0.00000025 | ||||
| Prebook | 38387861 | 111 days ago | IN | 0 ETH | 0.00000027 | ||||
| Prebook | 38387831 | 111 days ago | IN | 0 ETH | 0.00000026 | ||||
| Prebook | 38387800 | 111 days ago | IN | 0 ETH | 0.00000024 | ||||
| Prebook | 38387770 | 111 days ago | IN | 0 ETH | 0.00000019 | ||||
| Prebook | 38387740 | 111 days ago | IN | 0 ETH | 0.00000018 | ||||
| Prebook | 38387710 | 111 days ago | IN | 0 ETH | 0.00000018 | ||||
| Prebook | 38387679 | 111 days ago | IN | 0 ETH | 0.00000018 | ||||
| Prebook | 38387649 | 111 days ago | IN | 0 ETH | 0.00000018 | ||||
| Prebook | 38387618 | 111 days ago | IN | 0 ETH | 0.00000018 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
STAKINGG
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;
// ░██████╗████████╗░█████╗░██╗░░██╗██╗███╗░░██╗░░░░██████╗░░██████╗░ //
// ██╔════╝╚══██╔══╝██╔══██╗██║░██╔╝██║████╗░██║░░░██╔════╝░██╔════╝░ //
// ╚█████╗░░░░██║░░░███████║█████═╝░██║██╔██╗██║░░░██║░░██╗░██║░░██╗░ //
// ░╚═══██╗░░░██║░░░██╔══██║██╔═██╗░██║██║╚████║░░░██║░░╚██╗██║░░╚██╗ //
// ██████╔╝░░░██║░░░██║░░██║██║░╚██╗██║██║░╚███║██╗╚██████╔╝╚██████╔╝ //
// ╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝╚═╝░░╚══╝╚═╝░╚═════╝░░╚═════╝░ //
import "Ownable.sol";
import "ERC20.sol";
import "IWETH.sol";
import 'TransferHelper.sol';
import "IV3SwapRouter.sol";
import "IQuoterV2.sol";
contract Uniswapper {
IV3SwapRouter public ROUTER;
IQuoterV2 public QUOTER;
function _Uniswapper_setParams(address _ROUTER, address _QUOTER) internal
{
ROUTER = IV3SwapRouter(_ROUTER);
QUOTER = IQuoterV2(_QUOTER);
}
function _swapExactInputSingle(
address _tokenIn,
address _tokenOut,
uint24 _fee,
address _recipient,
uint _amountIn
) internal returns (uint amountOut)
{
TransferHelper.safeApprove(_tokenIn, address(ROUTER), _amountIn);
IV3SwapRouter.ExactInputSingleParams memory params = IV3SwapRouter
.ExactInputSingleParams({
tokenIn: _tokenIn,
tokenOut: _tokenOut,
fee: _fee,
recipient: _recipient,
amountIn: _amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
amountOut = ROUTER.exactInputSingle(params);
}
function _quoteExactInputSingle(
address _tokenIn,
address _tokenOut,
uint _amountIn,
uint24 _fee
) internal returns (uint amountOut)
{
IQuoterV2.QuoteExactInputSingleParams memory params = IQuoterV2
.QuoteExactInputSingleParams({
tokenIn: _tokenIn,
tokenOut: _tokenOut,
amountIn: _amountIn,
fee: _fee,
sqrtPriceLimitX96: 0
});
(amountOut,,,) = QUOTER.quoteExactInputSingle(params);
}
}
contract STAKINGG is Ownable, Uniswapper {
struct Currency {
address addr;
uint24 poolFee;
int8 decimals;
}
struct Plan {
uint32 rate;
uint32 duration;
uint32 created;
uint32 checkpoint;
uint amount;
uint minAmount;
}
struct Log {
address addr;
uint amount;
uint self;
uint back;
bool prebooked;
}
struct User {
Plan[] plans;
uint cbank;
uint rbank;
uint amtsum;
Log[] logs;
address prebook;
}
struct Leader {
bool exists;
uint16 partSelf;
uint reward;
uint prebooks;
uint amtsum;
Log[] logs;
}
address public WETH_CONTRACT_ADDR; // official WETH contract
uint16 public MARKETING_BONUS; // deposit fee
uint16 public REFERRAL_BONUS; // non-leader referral reward
uint16 public LEADER_BONUS_PREBOOK; // leader reward, prebooked user
uint16 public LEADER_BONUS_REGULAR; // leader reward, without prebooking
uint public POOL_MARKETING; // marketing.fee locked until owner_claim()
uint public POOL_PROTECTED; // leader.reward locked untii leader_claim()
uint32 public LAUNCH_TIMESTAMP;
bool public LAUNCHED;
Currency[] public CURRENCIES;
Plan[] public PLANS;
mapping(address => User) public USERS;
mapping(address => Leader) public LEADERS;
bool public SECURE_SETTINGS; // settingsNotSecured modifier: locks basic settings forever
event Invest(address sender, uint baseAmt, uint8 plan, address referrer);
event Prebook(address sender, address leaderOld, address leaderNew);
receive() external payable {}
constructor() Ownable(msg.sender) {}
modifier settingsNotSecured() { require( !SECURE_SETTINGS, 'Settings locked' ); _; }
// public functions
function estimateSwap(address _tokenIn, address _tokenOut, uint _amount) public returns (uint)
{
if(_tokenIn == address(0)) _tokenIn = WETH_CONTRACT_ADDR;
if(_tokenOut == address(0)) _tokenOut = WETH_CONTRACT_ADDR;
if(_tokenIn == _tokenOut) return _amount;
Currency storage currIn = CURRENCIES[_getCurrIdx(_tokenIn)];
Currency storage currOut = CURRENCIES[_getCurrIdx(_tokenOut)];
return _quoteExactInputSingle(
_tokenIn,
_tokenOut,
_amount,
currIn.addr == WETH_CONTRACT_ADDR ? currOut.poolFee : currIn.poolFee
);
}
function invest(uint8 _currIdx, uint _amount, uint8 _plan, address _referrer, uint _minBaseAmt) public payable
{
if(!LAUNCHED) {
require(LAUNCH_TIMESTAMP <= block.timestamp, 'Not launched');
LAUNCHED = true;
}
Currency storage currency = CURRENCIES[_currIdx];
Plan storage plan = PLANS[_plan];
User storage user = USERS[msg.sender];
uint baseAmt = _receiveCurrency(currency, _amount);
require(baseAmt >= _minBaseAmt, 'Slippage too high');
require(baseAmt >= plan.minAmount, 'Minimum amount required');
_payouts(user, baseAmt, _referrer);
_addPlan(user, plan, baseAmt);
emit Invest(msg.sender, baseAmt, _plan, _referrer);
}
// this function also withdraws Cashback and Referral reward
function claim(uint8 _currIdx, uint[] calldata _planIdxs, uint _minAmountOut) public returns (uint amountAvail, uint amountExtra, uint amountOut)
{
User storage user = USERS[msg.sender];
Currency storage currency = CURRENCIES[_currIdx];
(,uint planProfits) = _userPlanProfits(user, _planIdxs, true);
// if Contract lacks unlocked funds to pay User earnings, User.cbank stores the 'debt'
// no plan profits are lost, and will be paid as soon as Contract receives more funds
(amountAvail, amountExtra) = _availToClaim( planProfits + user.cbank + user.rbank );
user.cbank = amountExtra;
user.rbank = 0;
amountOut = _withdrawCurrency(currency, msg.sender, amountAvail);
require(amountOut >= _minAmountOut, 'Slippage too high');
}
// users can Prebook before the official Launch, specifying their Leader
// provides a higher [Leader.reward + User.cashback] amount on Invest()
function prebook(address _leader) public
{
require(!LAUNCHED, 'Already launched');
User storage user = USERS[msg.sender];
Leader storage leader = LEADERS[_leader];
require(leader.exists, 'Leader not found');
address _prebook = user.prebook;
if(_prebook == _leader)
return;
if(_prebook != address(0))
LEADERS[_prebook].prebooks--;
user.prebook = _leader;
leader.prebooks++;
emit Prebook(msg.sender, _prebook, _leader);
}
struct PData {
uint timestamp;
uint[] balance;
bool launched;
uint32 launchTime;
Currency[] currencies;
Plan[] plans;
uint16 referral_bonus;
uint16 leader_bonus_prebook;
uint16 leader_bonus_regular;
}
struct UData {
address addr;
uint[] balance;
uint[] allowance;
Plan[] plans;
uint[] planProfitsArray;
uint planProfitsTotal;
uint cbank;
uint rbank;
uint amtsum;
address prebook;
Leader leaderInfo;
}
struct LData {
bool exists;
uint16 partSelf;
uint reward;
uint prebooks;
uint amtsum;
}
function info(address _user, address _leader) public returns (PData memory pdata, UData memory udata, LData memory ldata)
{
User storage user = USERS[_user];
Leader storage leader = LEADERS[_user];
pdata = PData({
timestamp: block.timestamp,
balance: _userBalanceAllowance(false, address(this)),
launched: LAUNCHED,
launchTime: LAUNCH_TIMESTAMP,
currencies: CURRENCIES,
plans: PLANS,
referral_bonus: REFERRAL_BONUS,
leader_bonus_prebook: LEADER_BONUS_PREBOOK,
leader_bonus_regular: LEADER_BONUS_REGULAR
});
uint[] memory planIdxs = new uint[](user.plans.length);
for(uint i; i < planIdxs.length; i++) planIdxs[i] = i;
(uint[] memory planProfitsArray, uint planProfitsTotal) = _userPlanProfits(user, planIdxs, false);
udata = UData({
addr: _user,
balance: _userBalanceAllowance(false, _user),
allowance: _userBalanceAllowance(true, _user),
plans: user.plans,
planProfitsArray: planProfitsArray,
planProfitsTotal: planProfitsTotal,
cbank: user.cbank,
rbank: user.rbank,
amtsum: user.amtsum,
prebook: user.prebook,
leaderInfo: LEADERS[_leader]
});
ldata = LData({
exists: leader.exists,
partSelf: leader.partSelf,
reward: leader.reward,
prebooks: leader.prebooks,
amtsum: leader.amtsum
});
}
function logs(address _user, bool mode, uint _cnt, uint _off) public view returns (Log[] memory page, uint left)
{
return _slice(mode ? LEADERS[_user].logs : USERS[_user].logs, _cnt, _off);
}
// leader functions
// each Leader decides on the ratio [Reward/Cashback]
// User.cashback depends on this value
function leader_setPartSelf(uint16 _partSelf) public
{
Leader storage leader = LEADERS[msg.sender];
leader.partSelf = _partSelf < 1000 ? _partSelf : 1000;
}
function leader_claim(uint8 _currIdx, uint _amount, uint _minAmountOut) public
{
Leader storage leader = LEADERS[msg.sender];
uint reward = leader.reward;
uint amount = _amount > reward ? reward : _amount;
leader.reward -= amount;
POOL_PROTECTED -= amount;
Currency storage currency = CURRENCIES[_currIdx];
uint amountOut = _withdrawCurrency(currency, msg.sender, amount);
require(amountOut >= _minAmountOut, 'Slippage too high');
}
// owner functions
function owner_Uniswapper_setParams(
address _ROUTER,
address _QUOTER
) public onlyOwner settingsNotSecured
{
_Uniswapper_setParams(_ROUTER, _QUOTER);
}
function owner_setCurrencies(
address _WETH_CONTRACT_ADDR,
Currency[] calldata _currencies
) public onlyOwner settingsNotSecured
{
WETH_CONTRACT_ADDR = _WETH_CONTRACT_ADDR;
delete CURRENCIES;
for(uint i; i < _currencies.length; i++) {
CURRENCIES.push( _currencies[i] );
}
}
//not secured: adding new currencies is safe & always allowed
function owner_addCurrency(
Currency calldata _currency
) public onlyOwner
{
CURRENCIES.push( _currency );
}
function owner_setPlans(
Plan[] calldata _plans
) public onlyOwner settingsNotSecured
{
delete PLANS;
for(uint i; i < _plans.length; i++) {
PLANS.push( _plans[i] );
}
}
function owner_setParams(
uint32 _LAUNCH_TIMESTAMP,
uint16 _MARKETING_BONUS,
uint16 _REFERRAL_BONUS,
uint16 _LEADER_BONUS_PREBOOK,
uint16 _LEADER_BONUS_REGULAR
) public onlyOwner settingsNotSecured
{
LAUNCH_TIMESTAMP = _LAUNCH_TIMESTAMP;
MARKETING_BONUS = _MARKETING_BONUS;
REFERRAL_BONUS = _REFERRAL_BONUS;
LEADER_BONUS_PREBOOK = _LEADER_BONUS_PREBOOK;
LEADER_BONUS_REGULAR = _LEADER_BONUS_REGULAR;
}
//add or remove Leader
function owner_setLeader(
address _leader,
bool _exists
) public onlyOwner
{
Leader storage leader = LEADERS[_leader];
leader.exists = _exists;
}
function owner_claim(
uint8 _currIdx,
uint _amount,
uint _minAmountOut
) public onlyOwner
{
uint amount = _amount > POOL_MARKETING ? POOL_MARKETING : _amount;
POOL_MARKETING -= amount;
Currency storage currency = CURRENCIES[_currIdx];
uint amountOut = _withdrawCurrency(currency, msg.sender, amount);
require(amountOut >= _minAmountOut, 'Slippage too high');
}
// locking 'settingsNotSecured' before the launch
// prevents Admin from altering sensitive params
function owner_secureSettings()
public onlyOwner
{
SECURE_SETTINGS = true;
}
// internal functions
function _userBalanceAllowance(bool _which, address _user) internal view returns (uint[] memory amounts)
{
amounts = new uint[](CURRENCIES.length);
for(uint i; i < amounts.length; i++) {
Currency storage currency = CURRENCIES[i];
if(!_which) amounts[i] = currency.addr == address(0) ? address(_user).balance : ERC20(currency.addr).balanceOf(_user);
else amounts[i] = currency.addr == address(0) ? 0 : ERC20(currency.addr).allowance(_user, address(this));
}
return amounts;
}
// used in Logs() function for pagination
function _slice(Log[] storage _logs, uint _cnt, uint _off) internal view returns (Log[] memory, uint)
{
uint l = _logs.length;
uint s = l>_off ? l-_off : 0;
uint e = s>_cnt ? s-_cnt : 0;
Log[] memory slice = new Log[](s-e);
for(uint i=s; i>e; i--)
slice[s-i] = _logs[i-1];
return (slice, e);
}
function _getCurrIdx(address _addr) internal view returns (uint)
{
for(uint i; i < CURRENCIES.length; i++)
if(CURRENCIES[i].addr == _addr)
return i;
revert('Currency not found');
}
function _receiveCurrency(Currency storage currency, uint _currAmt) internal returns (uint baseAmt)
{
address curr = currency.addr;
address weth = WETH_CONTRACT_ADDR;
if(curr == address(0)) require(msg.value == _currAmt, 'Amount/Value mismatch');
else TransferHelper.safeTransferFrom(curr, msg.sender, address(this), _currAmt);
if(curr == weth) return _currAmt;
if(curr == address(0)) {
IWETH(weth).deposit{ value: _currAmt }();
return _currAmt;
}
return _swapExactInputSingle(curr, weth, currency.poolFee, address(this), _currAmt);
}
function _withdrawCurrency(Currency storage currency, address _recipient, uint _baseAmt) internal returns (uint currAmt)
{
if(_baseAmt == 0) return 0;
address curr = currency.addr;
address weth = WETH_CONTRACT_ADDR;
if(curr == weth) {
TransferHelper.safeTransfer(curr, _recipient, _baseAmt);
return _baseAmt;
}
if(curr == address(0)) {
IWETH(weth).withdraw(_baseAmt);
payable(_recipient).transfer(_baseAmt);
return _baseAmt;
}
currAmt = _swapExactInputSingle(weth, curr, currency.poolFee, address(this), _baseAmt);
TransferHelper.safeTransfer(curr, _recipient, currAmt);
}
// Calculating: Marketing fee, Leader.reward or Referral.reward, User.cashback
function _payouts(User storage user, uint _baseAmt, address _referrer) internal
{
//MARKETING fee is locked on Contract.balance until owner_claim()
POOL_MARKETING += _baseAmt * MARKETING_BONUS / 1000;
Leader storage leader = LEADERS[_referrer];
//referrer is a Leader: if User prebooked before investing, allocate a higher [Leader.reward + User.cashback] bonus
if(leader.exists) {
bool prebooked = user.prebook == _referrer;
uint full = _baseAmt * (prebooked ? LEADER_BONUS_PREBOOK : LEADER_BONUS_REGULAR) / 1000;
uint self = full * leader.partSelf / 1000;
uint back = full - self;
if(back > 0) {
user.cbank += back; // User cashback
}
if(self > 0) {
leader.reward += self; // Leader reward
POOL_PROTECTED += self; // locked on Contract.balance until leader_claim()
}
leader.amtsum += _baseAmt;
leader.logs.push( Log({ addr: msg.sender, amount: _baseAmt, self: self, back: back, prebooked: prebooked }) );
return;
}
//referrer is not a Leader: just a regular referral reward, without cashbacks & locking funds
if(_referrer != address(0)) {
User storage referrer = USERS[_referrer];
uint refAmount = _baseAmt * REFERRAL_BONUS / 1000;
referrer.rbank += refAmount;
referrer.amtsum += _baseAmt;
referrer.logs.push( Log({ addr: msg.sender, amount: _baseAmt, self: refAmount, back: 0, prebooked: false }) );
}
}
function _addPlan(User storage user, Plan storage plan, uint _baseAmt) internal
{
user.plans.push(Plan({
rate: plan.rate,
duration: plan.duration,
created: uint32(block.timestamp),
checkpoint: uint32(block.timestamp),
amount: _baseAmt,
minAmount: plan.minAmount
})
);
}
function _userPlanProfits(User storage user, uint[] memory _planIdxs, bool _updateCheckpoint) internal returns (uint[] memory array, uint total)
{
array = new uint[](_planIdxs.length);
uint32 timestamp = uint32(block.timestamp);
for(uint i; i < _planIdxs.length; i++) {
Plan storage plan = user.plans[_planIdxs[i]];
uint32 expires = plan.created + plan.duration;
uint32 maxTimestamp = timestamp < expires ? timestamp : expires;
uint32 interval = maxTimestamp - plan.checkpoint;
uint profit = (plan.amount * plan.rate * interval) / (plan.duration * 1000);
array[i] = profit;
total += profit;
if(_updateCheckpoint)
plan.checkpoint = maxTimestamp;
}
}
function _availToClaim(uint _amountFull) internal view returns (uint amountAvail, uint amountExtra)
{
uint balanceAvail = ERC20(WETH_CONTRACT_ADDR).balanceOf(address(this)) - POOL_MARKETING - POOL_PROTECTED;
amountAvail = _amountFull < balanceAvail ? _amountFull : balanceAvail;
amountExtra = _amountFull - amountAvail;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "IERC20.sol";
import {IERC20Metadata} from "IERC20Metadata.sol";
import {Context} from "Context.sol";
import {IERC20Errors} from "draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
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);
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
/// @title QuoterV2 Interface
/// @notice Supports quoting the calculated amounts from exact input or exact output swaps.
/// @notice For each pool also tells you the number of initialized ticks crossed and the sqrt price of the pool after the swap.
/// @dev These functions are not marked view because they rely on calling non-view functions and reverting
/// to compute the result. They are also not gas efficient and should not be called on-chain.
interface IQuoterV2 {
/// @notice Returns the amount out received for a given exact input swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee
/// @param amountIn The amount of the first token to swap
/// @return amountOut The amount of the last token that would be received
/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path
/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactInput(bytes memory path, uint256 amountIn)
external
returns (
uint256 amountOut,
uint160[] memory sqrtPriceX96AfterList,
uint32[] memory initializedTicksCrossedList,
uint256 gasEstimate
);
struct QuoteExactInputSingleParams {
address tokenIn;
address tokenOut;
uint256 amountIn;
uint24 fee;
uint160 sqrtPriceLimitX96;
}
/// @notice Returns the amount out received for a given exact input but for a swap of a single pool
/// @param params The params for the quote, encoded as `QuoteExactInputSingleParams`
/// tokenIn The token being swapped in
/// tokenOut The token being swapped out
/// fee The fee of the token pool to consider for the pair
/// amountIn The desired input amount
/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountOut The amount of `tokenOut` that would be received
/// @return sqrtPriceX96After The sqrt price of the pool after the swap
/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactInputSingle(QuoteExactInputSingleParams memory params)
external
returns (
uint256 amountOut,
uint160 sqrtPriceX96After,
uint32 initializedTicksCrossed,
uint256 gasEstimate
);
/// @notice Returns the amount in required for a given exact output swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee. Path must be provided in reverse order
/// @param amountOut The amount of the last token to receive
/// @return amountIn The amount of first token required to be paid
/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path
/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactOutput(bytes memory path, uint256 amountOut)
external
returns (
uint256 amountIn,
uint160[] memory sqrtPriceX96AfterList,
uint32[] memory initializedTicksCrossedList,
uint256 gasEstimate
);
struct QuoteExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint256 amount;
uint24 fee;
uint160 sqrtPriceLimitX96;
}
/// @notice Returns the amount in required to receive the given exact output amount but for a swap of a single pool
/// @param params The params for the quote, encoded as `QuoteExactOutputSingleParams`
/// tokenIn The token being swapped in
/// tokenOut The token being swapped out
/// fee The fee of the token pool to consider for the pair
/// amountOut The desired output amount
/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountIn The amount required as the input for the swap in order to receive `amountOut`
/// @return sqrtPriceX96After The sqrt price of the pool after the swap
/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed
/// @return gasEstimate The estimate of the gas that the swap consumes
function quoteExactOutputSingle(QuoteExactOutputSingleParams memory params)
external
returns (
uint256 amountIn,
uint160 sqrtPriceX96After,
uint32 initializedTicksCrossed,
uint256 gasEstimate
);
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
/// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
/// @dev In the implementation you must pay the pool tokens owed for the swap.
/// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
/// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
/// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
/// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
/// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
import 'IUniswapV3SwapCallback.sol';
/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface IV3SwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,
/// and swap the entire amount, enabling contracts to send tokens before calling this function.
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,
/// and swap the entire amount, enabling contracts to send tokens before calling this function.
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// that may remain in the router after the swap.
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// that may remain in the router after the swap.
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "Context.sol";
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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);
}
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0;
import 'IERC20.sol';
library TransferHelper {
/// @notice Transfers tokens from the targeted address to the given destination
/// @notice Errors with 'STF' if transfer fails
/// @param token The contract address of the token to be transferred
/// @param from The originating address from which the tokens will be transferred
/// @param to The destination address of the transfer
/// @param value The amount to be transferred
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
}
/// @notice Transfers tokens from msg.sender to a recipient
/// @dev Errors with ST if transfer fails
/// @param token The contract address of the token which will be transferred
/// @param to The recipient of the transfer
/// @param value The value of the transfer
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
}
/// @notice Approves the stipulated contract to spend the given allowance in the given token
/// @dev Errors with 'SA' if transfer fails
/// @param token The contract address of the token to be approved
/// @param to The target of the approval
/// @param value The amount of the given token the target will be allowed to spend
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
}
/// @notice Transfers ETH to the recipient address
/// @dev Fails with `STE`
/// @param to The destination of the transfer
/// @param value The value to be transferred
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'STE');
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseAmt","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"plan","type":"uint8"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"Invest","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":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"leaderOld","type":"address"},{"indexed":false,"internalType":"address","name":"leaderNew","type":"address"}],"name":"Prebook","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"CURRENCIES","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int8","name":"decimals","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCHED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_TIMESTAMP","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LEADERS","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint16","name":"partSelf","type":"uint16"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"prebooks","type":"uint256"},{"internalType":"uint256","name":"amtsum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEADER_BONUS_PREBOOK","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEADER_BONUS_REGULAR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKETING_BONUS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PLANS","outputs":[{"internalType":"uint32","name":"rate","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"created","type":"uint32"},{"internalType":"uint32","name":"checkpoint","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_MARKETING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_PROTECTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTER","outputs":[{"internalType":"contract IQuoterV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFERRAL_BONUS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract IV3SwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECURE_SETTINGS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"USERS","outputs":[{"internalType":"uint256","name":"cbank","type":"uint256"},{"internalType":"uint256","name":"rbank","type":"uint256"},{"internalType":"uint256","name":"amtsum","type":"uint256"},{"internalType":"address","name":"prebook","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_currIdx","type":"uint8"},{"internalType":"uint256[]","name":"_planIdxs","type":"uint256[]"},{"internalType":"uint256","name":"_minAmountOut","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"amountAvail","type":"uint256"},{"internalType":"uint256","name":"amountExtra","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"estimateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_leader","type":"address"}],"name":"info","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256[]","name":"balance","type":"uint256[]"},{"internalType":"bool","name":"launched","type":"bool"},{"internalType":"uint32","name":"launchTime","type":"uint32"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int8","name":"decimals","type":"int8"}],"internalType":"struct STAKINGG.Currency[]","name":"currencies","type":"tuple[]"},{"components":[{"internalType":"uint32","name":"rate","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"created","type":"uint32"},{"internalType":"uint32","name":"checkpoint","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"internalType":"struct STAKINGG.Plan[]","name":"plans","type":"tuple[]"},{"internalType":"uint16","name":"referral_bonus","type":"uint16"},{"internalType":"uint16","name":"leader_bonus_prebook","type":"uint16"},{"internalType":"uint16","name":"leader_bonus_regular","type":"uint16"}],"internalType":"struct STAKINGG.PData","name":"pdata","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256[]","name":"balance","type":"uint256[]"},{"internalType":"uint256[]","name":"allowance","type":"uint256[]"},{"components":[{"internalType":"uint32","name":"rate","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"created","type":"uint32"},{"internalType":"uint32","name":"checkpoint","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"internalType":"struct STAKINGG.Plan[]","name":"plans","type":"tuple[]"},{"internalType":"uint256[]","name":"planProfitsArray","type":"uint256[]"},{"internalType":"uint256","name":"planProfitsTotal","type":"uint256"},{"internalType":"uint256","name":"cbank","type":"uint256"},{"internalType":"uint256","name":"rbank","type":"uint256"},{"internalType":"uint256","name":"amtsum","type":"uint256"},{"internalType":"address","name":"prebook","type":"address"},{"components":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint16","name":"partSelf","type":"uint16"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"prebooks","type":"uint256"},{"internalType":"uint256","name":"amtsum","type":"uint256"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"self","type":"uint256"},{"internalType":"uint256","name":"back","type":"uint256"},{"internalType":"bool","name":"prebooked","type":"bool"}],"internalType":"struct STAKINGG.Log[]","name":"logs","type":"tuple[]"}],"internalType":"struct STAKINGG.Leader","name":"leaderInfo","type":"tuple"}],"internalType":"struct STAKINGG.UData","name":"udata","type":"tuple"},{"components":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint16","name":"partSelf","type":"uint16"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"prebooks","type":"uint256"},{"internalType":"uint256","name":"amtsum","type":"uint256"}],"internalType":"struct STAKINGG.LData","name":"ldata","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_currIdx","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_plan","type":"uint8"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_minBaseAmt","type":"uint256"}],"name":"invest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_currIdx","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmountOut","type":"uint256"}],"name":"leader_claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_partSelf","type":"uint16"}],"name":"leader_setPartSelf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"mode","type":"bool"},{"internalType":"uint256","name":"_cnt","type":"uint256"},{"internalType":"uint256","name":"_off","type":"uint256"}],"name":"logs","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"self","type":"uint256"},{"internalType":"uint256","name":"back","type":"uint256"},{"internalType":"bool","name":"prebooked","type":"bool"}],"internalType":"struct STAKINGG.Log[]","name":"page","type":"tuple[]"},{"internalType":"uint256","name":"left","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ROUTER","type":"address"},{"internalType":"address","name":"_QUOTER","type":"address"}],"name":"owner_Uniswapper_setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int8","name":"decimals","type":"int8"}],"internalType":"struct STAKINGG.Currency","name":"_currency","type":"tuple"}],"name":"owner_addCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_currIdx","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmountOut","type":"uint256"}],"name":"owner_claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner_secureSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_WETH_CONTRACT_ADDR","type":"address"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int8","name":"decimals","type":"int8"}],"internalType":"struct STAKINGG.Currency[]","name":"_currencies","type":"tuple[]"}],"name":"owner_setCurrencies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leader","type":"address"},{"internalType":"bool","name":"_exists","type":"bool"}],"name":"owner_setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_LAUNCH_TIMESTAMP","type":"uint32"},{"internalType":"uint16","name":"_MARKETING_BONUS","type":"uint16"},{"internalType":"uint16","name":"_REFERRAL_BONUS","type":"uint16"},{"internalType":"uint16","name":"_LEADER_BONUS_PREBOOK","type":"uint16"},{"internalType":"uint16","name":"_LEADER_BONUS_REGULAR","type":"uint16"}],"name":"owner_setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"rate","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"created","type":"uint32"},{"internalType":"uint32","name":"checkpoint","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"internalType":"struct STAKINGG.Plan[]","name":"_plans","type":"tuple[]"}],"name":"owner_setPlans","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leader","type":"address"}],"name":"prebook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801562000010575f80fd5b5033806200003757604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000428162000049565b5062000098565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613ad580620000a65f395ff3fe60806040526004361061022c575f3560e01c80636c546e9911610131578063b21e3627116100ac578063d03e062a1161007c578063e2a5d81e11610062578063e2a5d81e14610789578063e954f41d146107a8578063f2fde38b146107d9575f80fd5b8063d03e062a14610755578063e1913c8114610768575f80fd5b8063b21e362714610663578063bfe55a4c14610682578063c0f921f1146106a1578063ce19d73c1461071b575f80fd5b80638da5cb5b116101015780639535779f116100e75780639535779f146105c35780639c94cfb414610621578063acb4868d14610642575f80fd5b80638da5cb5b146105885780638dae88c2146105a4575f80fd5b80636c546e9914610515578063715018a6146105365780637c3c64f51461054a5780638a5dc82614610569575f80fd5b80632683f649116101c1578063487626f911610191578063558aeb6411610177578063558aeb64146104c35780635db6211b146104e25780636a57e07a14610501575f80fd5b8063487626f91461041a5780634f697c371461044e575f80fd5b80632683f649146103655780632f12029f146103af57806332fe7b26146103c45780633f2f869a146103fb575f80fd5b806321d195d7116101fc57806321d195d7146102d657806323f03ded146102f957806325058c261461031857806325ac5f2d14610346575f80fd5b80630208ae1714610237578063121a76971461026d57806317a6c72e146102965780631cf03368146102b7575f80fd5b3661023357005b5f80fd5b348015610242575f80fd5b50610256610251366004612edd565b6107f8565b604051610264929190612f20565b60405180910390f35b348015610278575f80fd5b50600b546102869060ff1681565b6040519015158152602001610264565b3480156102a1575f80fd5b506102b56102b0366004612f9e565b610851565b005b3480156102c2575f80fd5b506102b56102d1366004612fe0565b610a03565b3480156102e1575f80fd5b506102eb60045481565b604051908152602001610264565b348015610304575f80fd5b506102b5610313366004613043565b610b36565b348015610323575f80fd5b506103376103323660046130c4565b610c0d565b604051610264939291906133a2565b348015610351575f80fd5b506102b56103603660046130c4565b6111b3565b348015610370575f80fd5b5061038461037f3660046134c4565b611237565b604080516001600160a01b03909416845262ffffff90921660208401525f0b90820152606001610264565b3480156103ba575f80fd5b506102eb60055481565b3480156103cf575f80fd5b506001546103e3906001600160a01b031681565b6040516001600160a01b039091168152602001610264565b348015610406575f80fd5b506102eb6104153660046134db565b611276565b348015610425575f80fd5b5060035461043b90600160d01b900461ffff1681565b60405161ffff9091168152602001610264565b348015610459575f80fd5b5061049a610468366004612f9e565b60096020525f90815260409020600181015460028201546003830154600590930154919290916001600160a01b031684565b604080519485526020850193909352918301526001600160a01b03166060820152608001610264565b3480156104ce575f80fd5b506102b56104dd366004613519565b611375565b3480156104ed575f80fd5b506102b56104fc36600461353f565b6113bf565b34801561050c575f80fd5b506102b5611494565b348015610520575f80fd5b5060035461043b90600160c01b900461ffff1681565b348015610541575f80fd5b506102b56114ab565b348015610555575f80fd5b506102b561056436600461353f565b6114be565b348015610574575f80fd5b506102b561058336600461356f565b61156f565b348015610593575f80fd5b505f546001600160a01b03166103e3565b3480156105af575f80fd5b506002546103e3906001600160a01b031681565b3480156105ce575f80fd5b506105e26105dd3660046134c4565b611627565b6040805163ffffffff978816815295871660208701529386169385019390935293166060830152608082019290925260a081019190915260c001610264565b34801561062c575f80fd5b5060035461043b90600160a01b900461ffff1681565b34801561064d575f80fd5b5060065461028690640100000000900460ff1681565b34801561066e575f80fd5b506102b561067d3660046135de565b611684565b34801561068d575f80fd5b506003546103e3906001600160a01b031681565b3480156106ac575f80fd5b506106ee6106bb366004612f9e565b600a6020525f9081526040902080546001820154600283015460039093015460ff83169361010090930461ffff16929085565b60408051951515865261ffff9094166020860152928401919091526060830152608082015260a001610264565b348015610726575f80fd5b5061073a61073536600461360a565b6116b6565b60408051938452602084019290925290820152606001610264565b6102b561076336600461368f565b6117c8565b348015610773575f80fd5b5060035461043b90600160b01b900461ffff1681565b348015610794575f80fd5b506102b56107a33660046136e2565b611aa5565b3480156107b3575f80fd5b506006546107c49063ffffffff1681565b60405163ffffffff9091168152602001610264565b3480156107e4575f80fd5b506102b56107f3366004612f9e565b611ae5565b60605f61084485610822576001600160a01b0387165f90815260096020526040902060040161083d565b6001600160a01b0387165f908152600a602052604090206004015b8585611b3b565b9150915094509492505050565b600654640100000000900460ff16156108b15760405162461bcd60e51b815260206004820152601060248201527f416c7265616479206c61756e636865640000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526009602090815260408083206001600160a01b0385168452600a909252909120805460ff166109275760405162461bcd60e51b815260206004820152601060248201527f4c6561646572206e6f7420666f756e640000000000000000000000000000000060448201526064016108a8565b60058201546001600160a01b0390811690841681036109465750505050565b6001600160a01b03811615610981576001600160a01b0381165f908152600a6020526040812060020180549161097b8361370f565b91905055505b6005830180546001600160a01b0319166001600160a01b038616179055600282018054905f6109af83613724565b9091555050604080513381526001600160a01b03838116602083015286168183015290517f112c96b0aac0fe04029f33ab148154e665bd635d0b62381dbd042e59404422d89181900360600190a150505050565b610a0b611cca565b600b5460ff1615610a505760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6006805463ffffffff191663ffffffff9690961695909517909455600380547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff958616027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b93851693909302929092177fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b918416919091027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff1617600160d01b9290931691909102919091179055565b610b3e611cca565b600b5460ff1615610b835760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b600380546001600160a01b0319166001600160a01b038516179055610ba960075f612d67565b5f5b81811015610c07576007838383818110610bc757610bc761373c565b83546001810185555f948552602090942060609091029290920192919091019050610bf28282613750565b50508080610bff90613724565b915050610bab565b50505050565b610c6a6040518061012001604052805f8152602001606081526020015f151581526020015f63ffffffff16815260200160608152602001606081526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681525090565b610c72612d82565b610ca56040518060a001604052805f151581526020015f61ffff1681526020015f81526020015f81526020015f81525090565b6001600160a01b0385165f908152600960209081526040808320600a83528184208251610120810190935242835290939092820190610ce49030611d0f565b815260065460ff640100000000820416151560208084019190915263ffffffff9091166040808401919091526007805482518185028101850190935280835260609094019391929091905f9084015b82821015610d8e575f848152602080822060408051606081018252918601546001600160a01b038116835262ffffff600160a01b82041683850152600160b81b900490930b9281019290925290825260019092019101610d33565b5050505081526020016008805480602002602001604051908101604052809291908181526020015f905b82821015610e3c575f8481526020908190206040805160c08101825260038602909201805463ffffffff80821685526401000000008204811685870152680100000000000000008204811693850193909352600160601b90049091166060830152600180820154608084015260029091015460a08301529083529092019101610db8565b5050509082525060035461ffff600160b01b820481166020840152600160c01b820481166040840152600160d01b9091041660609091015282549095505f9067ffffffffffffffff811115610e9357610e93613837565b604051908082528060200260200182016040528015610ebc578160200160208202803683370190505b5090505f5b8151811015610efa5780828281518110610edd57610edd61373c565b602090810291909101015280610ef281613724565b915050610ec1565b505f80610f0885845f611f11565b915091506040518061016001604052808b6001600160a01b03168152602001610f315f8d611d0f565b8152602001610f4160018d611d0f565b8152602001865f01805480602002602001604051908101604052809291908181526020015f905b82821015610fec575f8481526020908190206040805160c08101825260038602909201805463ffffffff80821685526401000000008204811685870152680100000000000000008204811693850193909352600160601b90049091166060830152600180820154608084015260029091015460a08301529083529092019101610f68565b505050508152602001838152602001828152602001866001015481526020018660020154815260200186600301548152602001866005015f9054906101000a90046001600160a01b03166001600160a01b03168152602001600a5f8c6001600160a01b03166001600160a01b031681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff161515151581526020015f820160019054906101000a900461ffff1661ffff1661ffff16815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020015f905b82821015611157575f8481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460ff161515608083015290835290920191016110ec565b5050509152505090526040805160a081018252865460ff811615158252610100900461ffff166020820152600187015491810191909152600286015460608201526003909501546080860152979a979950929750505050505050565b6111bb611cca565b600b5460ff16156112005760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6112338282600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b5050565b60078181548110611246575f80fd5b5f9182526020822001546001600160a01b038116925062ffffff600160a01b82041691600160b81b909104900b83565b5f6001600160a01b038416611294576003546001600160a01b031693505b6001600160a01b0383166112b1576003546001600160a01b031692505b826001600160a01b0316846001600160a01b0316036112d157508061136e565b5f60076112dd866120d8565b815481106112ed576112ed61373c565b905f5260205f200190505f6007611303866120d8565b815481106113135761131361373c565b5f91825260209091206003548454919092019250611369918891889188916001600160a01b03908116911614611356578554600160a01b900462ffffff1661217c565b8454600160a01b900462ffffff1661217c565b925050505b9392505050565b61137d611cca565b600780546001810182555f9190915281907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688016113ba8282613750565b505050565b335f908152600a60205260408120600181015490918185116113e157846113e3565b815b905080836001015f8282546113f8919061384b565b925050819055508060055f828254611410919061384b565b925050819055505f60078760ff168154811061142e5761142e61373c565b905f5260205f200190505f611444823385612269565b90508581101561148a5760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b5050505050505050565b61149c611cca565b600b805460ff19166001179055565b6114b3611cca565b6114bc5f612393565b565b6114c6611cca565b5f60045483116114d657826114da565b6004545b90508060045f8282546114ed919061384b565b925050819055505f60078560ff168154811061150b5761150b61373c565b905f5260205f200190505f611521823385612269565b9050838110156115675760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b505050505050565b611577611cca565b600b5460ff16156115bc5760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6115c760085f612e1f565b5f5b818110156113ba5760088383838181106115e5576115e561373c565b83546001810185555f948552602090942060c090910292909201926003029091019050611612828261386a565b5050808061161f90613724565b9150506115c9565b60088181548110611636575f80fd5b5f91825260209091206003909102018054600182015460029092015463ffffffff80831694506401000000008304811693680100000000000000008404821693600160601b90049091169186565b61168c611cca565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b335f9081526009602052604081206007805483928392909183919060ff8b169081106116e4576116e461373c565b905f5260205f200190505f61172e838a8a808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611f11915050565b91505061175883600201548460010154836117499190613950565b6117539190613950565b6123e2565b600185018190555f60028601559096509450611775823388612269565b9350868410156117bb5760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b5050509450945094915050565b600654640100000000900460ff1661184a576006544263ffffffff90911611156118345760405162461bcd60e51b815260206004820152600c60248201527f4e6f74206c61756e63686564000000000000000000000000000000000000000060448201526064016108a8565b6006805464ff0000000019166401000000001790555b5f60078660ff16815481106118615761186161373c565b905f5260205f200190505f60088560ff16815481106118825761188261373c565b5f91825260208083203384526009909152604083206003909202019250906118aa8489612494565b9050848110156118f05760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b82600201548110156119445760405162461bcd60e51b815260206004820152601760248201527f4d696e696d756d20616d6f756e7420726571756972656400000000000000000060448201526064016108a8565b61194f8282886125be565b6040805160c081018252845463ffffffff8082168352640100000000918290048116602080850191825242831695850186815260608601968752608086018881526002808c015460a089019081528b5460018082018e555f8e815296909620995160039091029099018054965194519a5199881667ffffffffffffffff1990971696909617938716909702929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000988616989098026fffffffff000000000000000000000000191697909717600160601b969094169590950292909217815593519084015551910155604080513381526020810183905260ff8916918101919091526001600160a01b03871660608201527f1f3b82e2f7b6770a93dfc4b461265cf3644da3a6b632389ad82257d8a1005d6b9060800160405180910390a1505050505050505050565b335f908152600a602052604090206103e861ffff831610611ac8576103e8611aca565b815b815461ffff919091166101000262ffff001990911617905550565b611aed611cca565b6001600160a01b038116611b2f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016108a8565b611b3881612393565b50565b82546060905f9081848211611b50575f611b5a565b611b5a858361384b565b90505f868211611b6a575f611b74565b611b74878361384b565b90505f611b81828461384b565b67ffffffffffffffff811115611b9957611b99613837565b604051908082528060200260200182016040528015611c0257816020015b611bef6040518060a001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f151581525090565b815260200190600190039081611bb75790505b509050825b82811115611cbc5789611c1b60018361384b565b81548110611c2b57611c2b61373c565b5f9182526020918290206040805160a081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015460ff161515608082015282611c8e838761384b565b81518110611c9e57611c9e61373c565b60200260200101819052508080611cb49061370f565b915050611c07565b509890975095505050505050565b5f546001600160a01b031633146114bc576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016108a8565b60075460609067ffffffffffffffff811115611d2d57611d2d613837565b604051908082528060200260200182016040528015611d56578160200160208202803683370190505b5090505f5b8151811015611f09575f60078281548110611d7857611d7861373c565b905f5260205f2001905084611e365780546001600160a01b031615611e075780546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015611dde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190613963565b611e13565b836001600160a01b0316315b838381518110611e2557611e2561373c565b602002602001018181525050611ef6565b80546001600160a01b031615611ed55780546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063dd62ed3e90604401602060405180830381865afa158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed09190613963565b611ed7565b5f5b838381518110611ee957611ee961373c565b6020026020010181815250505b5080611f0181613724565b915050611d5b565b505b92915050565b60605f835167ffffffffffffffff811115611f2e57611f2e613837565b604051908082528060200260200182016040528015611f57578160200160208202803683370190505b509150425f5b85518110156120ce575f875f01878381518110611f7c57611f7c61373c565b602002602001015181548110611f9457611f9461373c565b5f918252602082206003909102018054909250611fcd9063ffffffff64010000000082048116916801000000000000000090041661397a565b90505f8163ffffffff168563ffffffff1610611fe95781611feb565b845b83549091505f9061200990600160601b900463ffffffff1683613997565b84549091505f9061202a90640100000000900463ffffffff166103e86139b4565b8554600187015463ffffffff928316928581169261204a929116906139dc565b61205491906139dc565b61205e91906139f3565b9050808987815181106120735761207361373c565b60209081029190910101526120888189613950565b975089156120b65784546fffffffff0000000000000000000000001916600160601b63ffffffff8516021785555b505050505080806120c690613724565b915050611f5d565b5050935093915050565b5f805b60075481101561213357826001600160a01b0316600782815481106121025761210261373c565b5f918252602090912001546001600160a01b0316036121215792915050565b8061212b81613724565b9150506120db565b5060405162461bcd60e51b815260206004820152601260248201527f43757272656e6379206e6f7420666f756e64000000000000000000000000000060448201526064016108a8565b6040805160a0810182526001600160a01b0386811682528581166020830190815282840186815262ffffff868116606086019081525f6080870181815260025498517fc6a5026a0000000000000000000000000000000000000000000000000000000081528851881660048201529551871660248701529351604486015290519091166064840152905183166084830152939091169063c6a5026a9060a4016080604051808303815f875af1158015612237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225b9190613a12565b509198975050505050505050565b5f815f0361227857505f61136e565b83546003546001600160a01b0391821691168082036122a65761229c8286866128bf565b839250505061136e565b6001600160a01b038216612360576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b03821690632e1a7d4d906024015f604051808303815f87803b15801561230c575f80fd5b505af115801561231e573d5f803e3d5ffd5b50506040516001600160a01b038816925086156108fc02915086905f818181858888f19350505050158015612355573d5f803e3d5ffd5b50839250505061136e565b855461237d9082908490600160a01b900462ffffff1630886129ee565b925061238a8286856128bf565b50509392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600554600480546003546040516370a0823160e01b815230938101939093525f938493849391926001600160a01b0316906370a0823190602401602060405180830381865afa158015612437573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245b9190613963565b612465919061384b565b61246f919061384b565b905080841061247e5780612480565b835b925061248c838561384b565b915050915091565b81546003545f916001600160a01b03908116911681612501578334146124fc5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742f56616c7565206d69736d61746368000000000000000000000060448201526064016108a8565b61250d565b61250d82333087612b0f565b806001600160a01b0316826001600160a01b031603612530578392505050611f0b565b6001600160a01b03821661259857806001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612577575f80fd5b505af1158015612589573d5f803e3d5ffd5b50505050508392505050611f0b565b84546125b59083908390600160a01b900462ffffff1630886129ee565b95945050505050565b6003546103e8906125da90600160a01b900461ffff16846139dc565b6125e491906139f3565b60045f8282546125f49190613950565b90915550506001600160a01b0381165f908152600a60205260409020805460ff16156127aa5760058401546001600160a01b038381169116145f6103e88261264957600354600160d01b900461ffff16612658565b600354600160c01b900461ffff165b6126669061ffff16876139dc565b61267091906139f3565b83549091505f906103e89061268e90610100900461ffff16846139dc565b61269891906139f3565b90505f6126a5828461384b565b905080156126c65780886001015f8282546126c09190613950565b90915550505b81156126fd5781856001015f8282546126df9190613950565b925050819055508160055f8282546126f79190613950565b90915550505b86856003015f8282546127109190613950565b90915550506040805160a0810182523381526020808201998a52918101938452606081019283529415156080860190815260049687018054600180820183555f928352939091209651600590910290960180546001600160a01b0319166001600160a01b03909716969096178655975190850155905160028401555160038301555092519201805460ff1916921515929092179091555050565b6001600160a01b03821615610c07576001600160a01b0382165f9081526009602052604081206003549091906103e8906127ef90600160b01b900461ffff16876139dc565b6127f991906139f3565b905080826002015f82825461280e9190613950565b9250508190555084826003015f8282546128289190613950565b90915550506040805160a08101825233815260208082019788529181019283525f60608201818152608083018281526004968701805460018082018355918552959093209351600590950290930180546001600160a01b0319166001600160a01b039095169490941784559751908301559151600282015594516003860155519301805460ff191693151593909317909255505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916129339190613a58565b5f604051808303815f865af19150503d805f811461296c576040519150601f19603f3d011682016040523d82523d5f602084013e612971565b606091505b509150915081801561299b57508051158061299b57508080602001905181019061299b9190613a84565b6129e75760405162461bcd60e51b815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b5050505050565b6001545f90612a089087906001600160a01b031684612c3f565b6040805160e0810182526001600160a01b0388811682528781166020830190815262ffffff88811684860190815288841660608601908152608086018981525f60a0880181815260c0890191825260015499517f04e45aaf000000000000000000000000000000000000000000000000000000008152895189166004820152965188166024880152935190941660448601529051851660648501525160848401525160a483015251821660c4820152919216906304e45aaf9060e4016020604051808303815f875af1158015612ae0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b049190613963565b979650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f92839290881691612b8b9190613a58565b5f604051808303815f865af19150503d805f8114612bc4576040519150601f19603f3d011682016040523d82523d5f602084013e612bc9565b606091505b5091509150818015612bf3575080511580612bf3575080806020019051810190612bf39190613a84565b6115675760405162461bcd60e51b815260206004820152600360248201527f535446000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167f095ea7b30000000000000000000000000000000000000000000000000000000017905291515f92839290871691612cb39190613a58565b5f604051808303815f865af19150503d805f8114612cec576040519150601f19603f3d011682016040523d82523d5f602084013e612cf1565b606091505b5091509150818015612d1b575080511580612d1b575080806020019051810190612d1b9190613a84565b6129e75760405162461bcd60e51b815260206004820152600260248201527f534100000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b5080545f8255905f5260205f2090810190611b389190612e3d565b6040518061016001604052805f6001600160a01b03168152602001606081526020016060815260200160608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b03168152602001612e1a6040518060c001604052805f151581526020015f61ffff1681526020015f81526020015f81526020015f8152602001606081525090565b905290565b5080545f8255600302905f5260205f2090810190611b389190612e78565b5b80821115612e745780547fffffffffffffffff000000000000000000000000000000000000000000000000168155600101612e3e565b5090565b5b80821115612e745780547fffffffffffffffffffffffffffffffff000000000000000000000000000000001681555f600182018190556002820155600301612e79565b6001600160a01b0381168114611b38575f80fd5b8015158114611b38575f80fd5b5f805f8060808587031215612ef0575f80fd5b8435612efb81612ebc565b93506020850135612f0b81612ed0565b93969395505050506040820135916060013590565b604080825283519082018190525f906020906060840190828701845b82811015612f8f57815180516001600160a01b0316855260208082015190860152604080820151908601526060808201519086015260809081015115159085015260a08401935090840190600101612f3c565b50505092019290925292915050565b5f60208284031215612fae575f80fd5b813561136e81612ebc565b63ffffffff81168114611b38575f80fd5b803561ffff81168114612fdb575f80fd5b919050565b5f805f805f60a08688031215612ff4575f80fd5b8535612fff81612fb9565b945061300d60208701612fca565b935061301b60408701612fca565b925061302960608701612fca565b915061303760808701612fca565b90509295509295909350565b5f805f60408486031215613055575f80fd5b833561306081612ebc565b9250602084013567ffffffffffffffff8082111561307c575f80fd5b818601915086601f83011261308f575f80fd5b81358181111561309d575f80fd5b8760206060830285010111156130b1575f80fd5b6020830194508093505050509250925092565b5f80604083850312156130d5575f80fd5b82356130e081612ebc565b915060208301356130f081612ebc565b809150509250929050565b5f8151808452602080850194508084015f5b838110156131295781518752958201959082019060010161310d565b509495945050505050565b5f8151808452602080850194508084015f805b8481101561318957825180516001600160a01b031689528481015162ffffff16858a0152604090810151830b9089015260609097019691830191600101613147565b50959695505050505050565b5f8151808452602080850194508084015f5b83811015613129578151805163ffffffff9081168952848201518116858a01526040808301518216908a0152606080830151909116908901526080808201519089015260a0908101519088015260c090960195908201906001016131a7565b5f60c08301825115158452602061ffff81850151168186015260408401516040860152606084015160608601526080840151608086015260a084015160c060a087015282815180855260e08801915083830194505f92505b808310156132b557845180516001600160a01b0316835260208082015190840152604080820151908401526060808201519084015260809081015115159083015260a082019150838501945060018301925061325e565b509695505050505050565b80516001600160a01b031682525f61016060208301518160208601526132e8828601826130fb565b9150506040830151848203604086015261330282826130fb565b9150506060830151848203606086015261331c8282613195565b9150506080830151848203608086015261333682826130fb565b91505060a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015161337e828701826001600160a01b03169052565b505061014080840151858303828701526133988382613206565b9695505050505050565b60e08152835160e08201525f602085015161012061010081818601526133cc6102008601846130fb565b925060408801516133e08387018215159052565b50606088015163ffffffff16610140860152608088015185840360df199081016101608801529092506134138484613134565b935060a089015192508086850301610180870152506134328383613195565b925060c0880151915061344c6101a086018361ffff169052565b60e088015161ffff9081166101c087015290880151166101e085015250828103602084015261347b81866132c0565b9150506134bc604083018480511515825261ffff60208201511660208301526040810151604083015260608101516060830152608081015160808301525050565b949350505050565b5f602082840312156134d4575f80fd5b5035919050565b5f805f606084860312156134ed575f80fd5b83356134f881612ebc565b9250602084013561350881612ebc565b929592945050506040919091013590565b5f60608284031215613529575f80fd5b50919050565b803560ff81168114612fdb575f80fd5b5f805f60608486031215613551575f80fd5b61355a8461352f565b95602085013595506040909401359392505050565b5f8060208385031215613580575f80fd5b823567ffffffffffffffff80821115613597575f80fd5b818501915085601f8301126135aa575f80fd5b8135818111156135b8575f80fd5b86602060c0830285010111156135cc575f80fd5b60209290920196919550909350505050565b5f80604083850312156135ef575f80fd5b82356135fa81612ebc565b915060208301356130f081612ed0565b5f805f806060858703121561361d575f80fd5b6136268561352f565b9350602085013567ffffffffffffffff80821115613642575f80fd5b818701915087601f830112613655575f80fd5b813581811115613663575f80fd5b8860208260051b8501011115613677575f80fd5b95986020929092019750949560400135945092505050565b5f805f805f60a086880312156136a3575f80fd5b6136ac8661352f565b9450602086013593506136c16040870161352f565b925060608601356136d181612ebc565b949793965091946080013592915050565b5f602082840312156136f2575f80fd5b61136e82612fca565b634e487b7160e01b5f52601160045260245ffd5b5f8161371d5761371d6136fb565b505f190190565b5f60018201613735576137356136fb565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b813561375b81612ebc565b6001600160a01b03811690508154816001600160a01b03198216178355602084013562ffffff8116811461378d575f80fd5b76ffffff00000000000000000000000000000000000000008160a01b16905080837fffffffffffffffffff00000000000000000000000000000000000000000000008416171784556040850135805f0b81146137e7575f80fd5b8060b81b77ff000000000000000000000000000000000000000000000016847fffffffffffffffff0000000000000000000000000000000000000000000000008516178317178555505050505050565b634e487b7160e01b5f52604160045260245ffd5b81810381811115611f0b57611f0b6136fb565b5f8135611f0b81612fb9565b813561387581612fb9565b63ffffffff8116905081548163ffffffff198216178355602084013561389a81612fb9565b67ffffffff000000008160201b169050808367ffffffffffffffff1984161717845560408501356138ca81612fb9565b6bffffffff00000000000000008160401b16846bffffffffffffffffffffffff198516178317178555505050506139386139066060840161385e565b82546fffffffff000000000000000000000000191660609190911b6fffffffff00000000000000000000000016178255565b6080820135600182015560a082013560028201555050565b80820180821115611f0b57611f0b6136fb565b5f60208284031215613973575f80fd5b5051919050565b63ffffffff818116838216019080821115611f0957611f096136fb565b63ffffffff828116828216039080821115611f0957611f096136fb565b63ffffffff8181168382160280821691908281146139d4576139d46136fb565b505092915050565b8082028115828204841417611f0b57611f0b6136fb565b5f82613a0d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f8060808587031215613a25575f80fd5b845193506020850151613a3781612ebc565b6040860151909350613a4881612fb9565b6060959095015193969295505050565b5f82515f5b81811015613a775760208186018101518583015201613a5d565b505f920191825250919050565b5f60208284031215613a94575f80fd5b815161136e81612ed056fea2646970667358221220e114725112b4a7c285d309ee221904a09a5b14d935c83ba7c5d4722800d208e764736f6c63430008140033
Deployed Bytecode
0x60806040526004361061022c575f3560e01c80636c546e9911610131578063b21e3627116100ac578063d03e062a1161007c578063e2a5d81e11610062578063e2a5d81e14610789578063e954f41d146107a8578063f2fde38b146107d9575f80fd5b8063d03e062a14610755578063e1913c8114610768575f80fd5b8063b21e362714610663578063bfe55a4c14610682578063c0f921f1146106a1578063ce19d73c1461071b575f80fd5b80638da5cb5b116101015780639535779f116100e75780639535779f146105c35780639c94cfb414610621578063acb4868d14610642575f80fd5b80638da5cb5b146105885780638dae88c2146105a4575f80fd5b80636c546e9914610515578063715018a6146105365780637c3c64f51461054a5780638a5dc82614610569575f80fd5b80632683f649116101c1578063487626f911610191578063558aeb6411610177578063558aeb64146104c35780635db6211b146104e25780636a57e07a14610501575f80fd5b8063487626f91461041a5780634f697c371461044e575f80fd5b80632683f649146103655780632f12029f146103af57806332fe7b26146103c45780633f2f869a146103fb575f80fd5b806321d195d7116101fc57806321d195d7146102d657806323f03ded146102f957806325058c261461031857806325ac5f2d14610346575f80fd5b80630208ae1714610237578063121a76971461026d57806317a6c72e146102965780631cf03368146102b7575f80fd5b3661023357005b5f80fd5b348015610242575f80fd5b50610256610251366004612edd565b6107f8565b604051610264929190612f20565b60405180910390f35b348015610278575f80fd5b50600b546102869060ff1681565b6040519015158152602001610264565b3480156102a1575f80fd5b506102b56102b0366004612f9e565b610851565b005b3480156102c2575f80fd5b506102b56102d1366004612fe0565b610a03565b3480156102e1575f80fd5b506102eb60045481565b604051908152602001610264565b348015610304575f80fd5b506102b5610313366004613043565b610b36565b348015610323575f80fd5b506103376103323660046130c4565b610c0d565b604051610264939291906133a2565b348015610351575f80fd5b506102b56103603660046130c4565b6111b3565b348015610370575f80fd5b5061038461037f3660046134c4565b611237565b604080516001600160a01b03909416845262ffffff90921660208401525f0b90820152606001610264565b3480156103ba575f80fd5b506102eb60055481565b3480156103cf575f80fd5b506001546103e3906001600160a01b031681565b6040516001600160a01b039091168152602001610264565b348015610406575f80fd5b506102eb6104153660046134db565b611276565b348015610425575f80fd5b5060035461043b90600160d01b900461ffff1681565b60405161ffff9091168152602001610264565b348015610459575f80fd5b5061049a610468366004612f9e565b60096020525f90815260409020600181015460028201546003830154600590930154919290916001600160a01b031684565b604080519485526020850193909352918301526001600160a01b03166060820152608001610264565b3480156104ce575f80fd5b506102b56104dd366004613519565b611375565b3480156104ed575f80fd5b506102b56104fc36600461353f565b6113bf565b34801561050c575f80fd5b506102b5611494565b348015610520575f80fd5b5060035461043b90600160c01b900461ffff1681565b348015610541575f80fd5b506102b56114ab565b348015610555575f80fd5b506102b561056436600461353f565b6114be565b348015610574575f80fd5b506102b561058336600461356f565b61156f565b348015610593575f80fd5b505f546001600160a01b03166103e3565b3480156105af575f80fd5b506002546103e3906001600160a01b031681565b3480156105ce575f80fd5b506105e26105dd3660046134c4565b611627565b6040805163ffffffff978816815295871660208701529386169385019390935293166060830152608082019290925260a081019190915260c001610264565b34801561062c575f80fd5b5060035461043b90600160a01b900461ffff1681565b34801561064d575f80fd5b5060065461028690640100000000900460ff1681565b34801561066e575f80fd5b506102b561067d3660046135de565b611684565b34801561068d575f80fd5b506003546103e3906001600160a01b031681565b3480156106ac575f80fd5b506106ee6106bb366004612f9e565b600a6020525f9081526040902080546001820154600283015460039093015460ff83169361010090930461ffff16929085565b60408051951515865261ffff9094166020860152928401919091526060830152608082015260a001610264565b348015610726575f80fd5b5061073a61073536600461360a565b6116b6565b60408051938452602084019290925290820152606001610264565b6102b561076336600461368f565b6117c8565b348015610773575f80fd5b5060035461043b90600160b01b900461ffff1681565b348015610794575f80fd5b506102b56107a33660046136e2565b611aa5565b3480156107b3575f80fd5b506006546107c49063ffffffff1681565b60405163ffffffff9091168152602001610264565b3480156107e4575f80fd5b506102b56107f3366004612f9e565b611ae5565b60605f61084485610822576001600160a01b0387165f90815260096020526040902060040161083d565b6001600160a01b0387165f908152600a602052604090206004015b8585611b3b565b9150915094509492505050565b600654640100000000900460ff16156108b15760405162461bcd60e51b815260206004820152601060248201527f416c7265616479206c61756e636865640000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526009602090815260408083206001600160a01b0385168452600a909252909120805460ff166109275760405162461bcd60e51b815260206004820152601060248201527f4c6561646572206e6f7420666f756e640000000000000000000000000000000060448201526064016108a8565b60058201546001600160a01b0390811690841681036109465750505050565b6001600160a01b03811615610981576001600160a01b0381165f908152600a6020526040812060020180549161097b8361370f565b91905055505b6005830180546001600160a01b0319166001600160a01b038616179055600282018054905f6109af83613724565b9091555050604080513381526001600160a01b03838116602083015286168183015290517f112c96b0aac0fe04029f33ab148154e665bd635d0b62381dbd042e59404422d89181900360600190a150505050565b610a0b611cca565b600b5460ff1615610a505760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6006805463ffffffff191663ffffffff9690961695909517909455600380547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff958616027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b93851693909302929092177fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b918416919091027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff1617600160d01b9290931691909102919091179055565b610b3e611cca565b600b5460ff1615610b835760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b600380546001600160a01b0319166001600160a01b038516179055610ba960075f612d67565b5f5b81811015610c07576007838383818110610bc757610bc761373c565b83546001810185555f948552602090942060609091029290920192919091019050610bf28282613750565b50508080610bff90613724565b915050610bab565b50505050565b610c6a6040518061012001604052805f8152602001606081526020015f151581526020015f63ffffffff16815260200160608152602001606081526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681525090565b610c72612d82565b610ca56040518060a001604052805f151581526020015f61ffff1681526020015f81526020015f81526020015f81525090565b6001600160a01b0385165f908152600960209081526040808320600a83528184208251610120810190935242835290939092820190610ce49030611d0f565b815260065460ff640100000000820416151560208084019190915263ffffffff9091166040808401919091526007805482518185028101850190935280835260609094019391929091905f9084015b82821015610d8e575f848152602080822060408051606081018252918601546001600160a01b038116835262ffffff600160a01b82041683850152600160b81b900490930b9281019290925290825260019092019101610d33565b5050505081526020016008805480602002602001604051908101604052809291908181526020015f905b82821015610e3c575f8481526020908190206040805160c08101825260038602909201805463ffffffff80821685526401000000008204811685870152680100000000000000008204811693850193909352600160601b90049091166060830152600180820154608084015260029091015460a08301529083529092019101610db8565b5050509082525060035461ffff600160b01b820481166020840152600160c01b820481166040840152600160d01b9091041660609091015282549095505f9067ffffffffffffffff811115610e9357610e93613837565b604051908082528060200260200182016040528015610ebc578160200160208202803683370190505b5090505f5b8151811015610efa5780828281518110610edd57610edd61373c565b602090810291909101015280610ef281613724565b915050610ec1565b505f80610f0885845f611f11565b915091506040518061016001604052808b6001600160a01b03168152602001610f315f8d611d0f565b8152602001610f4160018d611d0f565b8152602001865f01805480602002602001604051908101604052809291908181526020015f905b82821015610fec575f8481526020908190206040805160c08101825260038602909201805463ffffffff80821685526401000000008204811685870152680100000000000000008204811693850193909352600160601b90049091166060830152600180820154608084015260029091015460a08301529083529092019101610f68565b505050508152602001838152602001828152602001866001015481526020018660020154815260200186600301548152602001866005015f9054906101000a90046001600160a01b03166001600160a01b03168152602001600a5f8c6001600160a01b03166001600160a01b031681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff161515151581526020015f820160019054906101000a900461ffff1661ffff1661ffff16815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020015f905b82821015611157575f8481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460ff161515608083015290835290920191016110ec565b5050509152505090526040805160a081018252865460ff811615158252610100900461ffff166020820152600187015491810191909152600286015460608201526003909501546080860152979a979950929750505050505050565b6111bb611cca565b600b5460ff16156112005760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6112338282600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b5050565b60078181548110611246575f80fd5b5f9182526020822001546001600160a01b038116925062ffffff600160a01b82041691600160b81b909104900b83565b5f6001600160a01b038416611294576003546001600160a01b031693505b6001600160a01b0383166112b1576003546001600160a01b031692505b826001600160a01b0316846001600160a01b0316036112d157508061136e565b5f60076112dd866120d8565b815481106112ed576112ed61373c565b905f5260205f200190505f6007611303866120d8565b815481106113135761131361373c565b5f91825260209091206003548454919092019250611369918891889188916001600160a01b03908116911614611356578554600160a01b900462ffffff1661217c565b8454600160a01b900462ffffff1661217c565b925050505b9392505050565b61137d611cca565b600780546001810182555f9190915281907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688016113ba8282613750565b505050565b335f908152600a60205260408120600181015490918185116113e157846113e3565b815b905080836001015f8282546113f8919061384b565b925050819055508060055f828254611410919061384b565b925050819055505f60078760ff168154811061142e5761142e61373c565b905f5260205f200190505f611444823385612269565b90508581101561148a5760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b5050505050505050565b61149c611cca565b600b805460ff19166001179055565b6114b3611cca565b6114bc5f612393565b565b6114c6611cca565b5f60045483116114d657826114da565b6004545b90508060045f8282546114ed919061384b565b925050819055505f60078560ff168154811061150b5761150b61373c565b905f5260205f200190505f611521823385612269565b9050838110156115675760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b505050505050565b611577611cca565b600b5460ff16156115bc5760405162461bcd60e51b815260206004820152600f60248201526e14d95d1d1a5b99dcc81b1bd8dad959608a1b60448201526064016108a8565b6115c760085f612e1f565b5f5b818110156113ba5760088383838181106115e5576115e561373c565b83546001810185555f948552602090942060c090910292909201926003029091019050611612828261386a565b5050808061161f90613724565b9150506115c9565b60088181548110611636575f80fd5b5f91825260209091206003909102018054600182015460029092015463ffffffff80831694506401000000008304811693680100000000000000008404821693600160601b90049091169186565b61168c611cca565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b335f9081526009602052604081206007805483928392909183919060ff8b169081106116e4576116e461373c565b905f5260205f200190505f61172e838a8a808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611f11915050565b91505061175883600201548460010154836117499190613950565b6117539190613950565b6123e2565b600185018190555f60028601559096509450611775823388612269565b9350868410156117bb5760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b5050509450945094915050565b600654640100000000900460ff1661184a576006544263ffffffff90911611156118345760405162461bcd60e51b815260206004820152600c60248201527f4e6f74206c61756e63686564000000000000000000000000000000000000000060448201526064016108a8565b6006805464ff0000000019166401000000001790555b5f60078660ff16815481106118615761186161373c565b905f5260205f200190505f60088560ff16815481106118825761188261373c565b5f91825260208083203384526009909152604083206003909202019250906118aa8489612494565b9050848110156118f05760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b60448201526064016108a8565b82600201548110156119445760405162461bcd60e51b815260206004820152601760248201527f4d696e696d756d20616d6f756e7420726571756972656400000000000000000060448201526064016108a8565b61194f8282886125be565b6040805160c081018252845463ffffffff8082168352640100000000918290048116602080850191825242831695850186815260608601968752608086018881526002808c015460a089019081528b5460018082018e555f8e815296909620995160039091029099018054965194519a5199881667ffffffffffffffff1990971696909617938716909702929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000988616989098026fffffffff000000000000000000000000191697909717600160601b969094169590950292909217815593519084015551910155604080513381526020810183905260ff8916918101919091526001600160a01b03871660608201527f1f3b82e2f7b6770a93dfc4b461265cf3644da3a6b632389ad82257d8a1005d6b9060800160405180910390a1505050505050505050565b335f908152600a602052604090206103e861ffff831610611ac8576103e8611aca565b815b815461ffff919091166101000262ffff001990911617905550565b611aed611cca565b6001600160a01b038116611b2f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016108a8565b611b3881612393565b50565b82546060905f9081848211611b50575f611b5a565b611b5a858361384b565b90505f868211611b6a575f611b74565b611b74878361384b565b90505f611b81828461384b565b67ffffffffffffffff811115611b9957611b99613837565b604051908082528060200260200182016040528015611c0257816020015b611bef6040518060a001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f151581525090565b815260200190600190039081611bb75790505b509050825b82811115611cbc5789611c1b60018361384b565b81548110611c2b57611c2b61373c565b5f9182526020918290206040805160a081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015460ff161515608082015282611c8e838761384b565b81518110611c9e57611c9e61373c565b60200260200101819052508080611cb49061370f565b915050611c07565b509890975095505050505050565b5f546001600160a01b031633146114bc576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016108a8565b60075460609067ffffffffffffffff811115611d2d57611d2d613837565b604051908082528060200260200182016040528015611d56578160200160208202803683370190505b5090505f5b8151811015611f09575f60078281548110611d7857611d7861373c565b905f5260205f2001905084611e365780546001600160a01b031615611e075780546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015611dde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190613963565b611e13565b836001600160a01b0316315b838381518110611e2557611e2561373c565b602002602001018181525050611ef6565b80546001600160a01b031615611ed55780546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063dd62ed3e90604401602060405180830381865afa158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed09190613963565b611ed7565b5f5b838381518110611ee957611ee961373c565b6020026020010181815250505b5080611f0181613724565b915050611d5b565b505b92915050565b60605f835167ffffffffffffffff811115611f2e57611f2e613837565b604051908082528060200260200182016040528015611f57578160200160208202803683370190505b509150425f5b85518110156120ce575f875f01878381518110611f7c57611f7c61373c565b602002602001015181548110611f9457611f9461373c565b5f918252602082206003909102018054909250611fcd9063ffffffff64010000000082048116916801000000000000000090041661397a565b90505f8163ffffffff168563ffffffff1610611fe95781611feb565b845b83549091505f9061200990600160601b900463ffffffff1683613997565b84549091505f9061202a90640100000000900463ffffffff166103e86139b4565b8554600187015463ffffffff928316928581169261204a929116906139dc565b61205491906139dc565b61205e91906139f3565b9050808987815181106120735761207361373c565b60209081029190910101526120888189613950565b975089156120b65784546fffffffff0000000000000000000000001916600160601b63ffffffff8516021785555b505050505080806120c690613724565b915050611f5d565b5050935093915050565b5f805b60075481101561213357826001600160a01b0316600782815481106121025761210261373c565b5f918252602090912001546001600160a01b0316036121215792915050565b8061212b81613724565b9150506120db565b5060405162461bcd60e51b815260206004820152601260248201527f43757272656e6379206e6f7420666f756e64000000000000000000000000000060448201526064016108a8565b6040805160a0810182526001600160a01b0386811682528581166020830190815282840186815262ffffff868116606086019081525f6080870181815260025498517fc6a5026a0000000000000000000000000000000000000000000000000000000081528851881660048201529551871660248701529351604486015290519091166064840152905183166084830152939091169063c6a5026a9060a4016080604051808303815f875af1158015612237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225b9190613a12565b509198975050505050505050565b5f815f0361227857505f61136e565b83546003546001600160a01b0391821691168082036122a65761229c8286866128bf565b839250505061136e565b6001600160a01b038216612360576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b03821690632e1a7d4d906024015f604051808303815f87803b15801561230c575f80fd5b505af115801561231e573d5f803e3d5ffd5b50506040516001600160a01b038816925086156108fc02915086905f818181858888f19350505050158015612355573d5f803e3d5ffd5b50839250505061136e565b855461237d9082908490600160a01b900462ffffff1630886129ee565b925061238a8286856128bf565b50509392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600554600480546003546040516370a0823160e01b815230938101939093525f938493849391926001600160a01b0316906370a0823190602401602060405180830381865afa158015612437573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245b9190613963565b612465919061384b565b61246f919061384b565b905080841061247e5780612480565b835b925061248c838561384b565b915050915091565b81546003545f916001600160a01b03908116911681612501578334146124fc5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742f56616c7565206d69736d61746368000000000000000000000060448201526064016108a8565b61250d565b61250d82333087612b0f565b806001600160a01b0316826001600160a01b031603612530578392505050611f0b565b6001600160a01b03821661259857806001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612577575f80fd5b505af1158015612589573d5f803e3d5ffd5b50505050508392505050611f0b565b84546125b59083908390600160a01b900462ffffff1630886129ee565b95945050505050565b6003546103e8906125da90600160a01b900461ffff16846139dc565b6125e491906139f3565b60045f8282546125f49190613950565b90915550506001600160a01b0381165f908152600a60205260409020805460ff16156127aa5760058401546001600160a01b038381169116145f6103e88261264957600354600160d01b900461ffff16612658565b600354600160c01b900461ffff165b6126669061ffff16876139dc565b61267091906139f3565b83549091505f906103e89061268e90610100900461ffff16846139dc565b61269891906139f3565b90505f6126a5828461384b565b905080156126c65780886001015f8282546126c09190613950565b90915550505b81156126fd5781856001015f8282546126df9190613950565b925050819055508160055f8282546126f79190613950565b90915550505b86856003015f8282546127109190613950565b90915550506040805160a0810182523381526020808201998a52918101938452606081019283529415156080860190815260049687018054600180820183555f928352939091209651600590910290960180546001600160a01b0319166001600160a01b03909716969096178655975190850155905160028401555160038301555092519201805460ff1916921515929092179091555050565b6001600160a01b03821615610c07576001600160a01b0382165f9081526009602052604081206003549091906103e8906127ef90600160b01b900461ffff16876139dc565b6127f991906139f3565b905080826002015f82825461280e9190613950565b9250508190555084826003015f8282546128289190613950565b90915550506040805160a08101825233815260208082019788529181019283525f60608201818152608083018281526004968701805460018082018355918552959093209351600590950290930180546001600160a01b0319166001600160a01b039095169490941784559751908301559151600282015594516003860155519301805460ff191693151593909317909255505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916129339190613a58565b5f604051808303815f865af19150503d805f811461296c576040519150601f19603f3d011682016040523d82523d5f602084013e612971565b606091505b509150915081801561299b57508051158061299b57508080602001905181019061299b9190613a84565b6129e75760405162461bcd60e51b815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b5050505050565b6001545f90612a089087906001600160a01b031684612c3f565b6040805160e0810182526001600160a01b0388811682528781166020830190815262ffffff88811684860190815288841660608601908152608086018981525f60a0880181815260c0890191825260015499517f04e45aaf000000000000000000000000000000000000000000000000000000008152895189166004820152965188166024880152935190941660448601529051851660648501525160848401525160a483015251821660c4820152919216906304e45aaf9060e4016020604051808303815f875af1158015612ae0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b049190613963565b979650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f92839290881691612b8b9190613a58565b5f604051808303815f865af19150503d805f8114612bc4576040519150601f19603f3d011682016040523d82523d5f602084013e612bc9565b606091505b5091509150818015612bf3575080511580612bf3575080806020019051810190612bf39190613a84565b6115675760405162461bcd60e51b815260206004820152600360248201527f535446000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167f095ea7b30000000000000000000000000000000000000000000000000000000017905291515f92839290871691612cb39190613a58565b5f604051808303815f865af19150503d805f8114612cec576040519150601f19603f3d011682016040523d82523d5f602084013e612cf1565b606091505b5091509150818015612d1b575080511580612d1b575080806020019051810190612d1b9190613a84565b6129e75760405162461bcd60e51b815260206004820152600260248201527f534100000000000000000000000000000000000000000000000000000000000060448201526064016108a8565b5080545f8255905f5260205f2090810190611b389190612e3d565b6040518061016001604052805f6001600160a01b03168152602001606081526020016060815260200160608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b03168152602001612e1a6040518060c001604052805f151581526020015f61ffff1681526020015f81526020015f81526020015f8152602001606081525090565b905290565b5080545f8255600302905f5260205f2090810190611b389190612e78565b5b80821115612e745780547fffffffffffffffff000000000000000000000000000000000000000000000000168155600101612e3e565b5090565b5b80821115612e745780547fffffffffffffffffffffffffffffffff000000000000000000000000000000001681555f600182018190556002820155600301612e79565b6001600160a01b0381168114611b38575f80fd5b8015158114611b38575f80fd5b5f805f8060808587031215612ef0575f80fd5b8435612efb81612ebc565b93506020850135612f0b81612ed0565b93969395505050506040820135916060013590565b604080825283519082018190525f906020906060840190828701845b82811015612f8f57815180516001600160a01b0316855260208082015190860152604080820151908601526060808201519086015260809081015115159085015260a08401935090840190600101612f3c565b50505092019290925292915050565b5f60208284031215612fae575f80fd5b813561136e81612ebc565b63ffffffff81168114611b38575f80fd5b803561ffff81168114612fdb575f80fd5b919050565b5f805f805f60a08688031215612ff4575f80fd5b8535612fff81612fb9565b945061300d60208701612fca565b935061301b60408701612fca565b925061302960608701612fca565b915061303760808701612fca565b90509295509295909350565b5f805f60408486031215613055575f80fd5b833561306081612ebc565b9250602084013567ffffffffffffffff8082111561307c575f80fd5b818601915086601f83011261308f575f80fd5b81358181111561309d575f80fd5b8760206060830285010111156130b1575f80fd5b6020830194508093505050509250925092565b5f80604083850312156130d5575f80fd5b82356130e081612ebc565b915060208301356130f081612ebc565b809150509250929050565b5f8151808452602080850194508084015f5b838110156131295781518752958201959082019060010161310d565b509495945050505050565b5f8151808452602080850194508084015f805b8481101561318957825180516001600160a01b031689528481015162ffffff16858a0152604090810151830b9089015260609097019691830191600101613147565b50959695505050505050565b5f8151808452602080850194508084015f5b83811015613129578151805163ffffffff9081168952848201518116858a01526040808301518216908a0152606080830151909116908901526080808201519089015260a0908101519088015260c090960195908201906001016131a7565b5f60c08301825115158452602061ffff81850151168186015260408401516040860152606084015160608601526080840151608086015260a084015160c060a087015282815180855260e08801915083830194505f92505b808310156132b557845180516001600160a01b0316835260208082015190840152604080820151908401526060808201519084015260809081015115159083015260a082019150838501945060018301925061325e565b509695505050505050565b80516001600160a01b031682525f61016060208301518160208601526132e8828601826130fb565b9150506040830151848203604086015261330282826130fb565b9150506060830151848203606086015261331c8282613195565b9150506080830151848203608086015261333682826130fb565b91505060a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015161337e828701826001600160a01b03169052565b505061014080840151858303828701526133988382613206565b9695505050505050565b60e08152835160e08201525f602085015161012061010081818601526133cc6102008601846130fb565b925060408801516133e08387018215159052565b50606088015163ffffffff16610140860152608088015185840360df199081016101608801529092506134138484613134565b935060a089015192508086850301610180870152506134328383613195565b925060c0880151915061344c6101a086018361ffff169052565b60e088015161ffff9081166101c087015290880151166101e085015250828103602084015261347b81866132c0565b9150506134bc604083018480511515825261ffff60208201511660208301526040810151604083015260608101516060830152608081015160808301525050565b949350505050565b5f602082840312156134d4575f80fd5b5035919050565b5f805f606084860312156134ed575f80fd5b83356134f881612ebc565b9250602084013561350881612ebc565b929592945050506040919091013590565b5f60608284031215613529575f80fd5b50919050565b803560ff81168114612fdb575f80fd5b5f805f60608486031215613551575f80fd5b61355a8461352f565b95602085013595506040909401359392505050565b5f8060208385031215613580575f80fd5b823567ffffffffffffffff80821115613597575f80fd5b818501915085601f8301126135aa575f80fd5b8135818111156135b8575f80fd5b86602060c0830285010111156135cc575f80fd5b60209290920196919550909350505050565b5f80604083850312156135ef575f80fd5b82356135fa81612ebc565b915060208301356130f081612ed0565b5f805f806060858703121561361d575f80fd5b6136268561352f565b9350602085013567ffffffffffffffff80821115613642575f80fd5b818701915087601f830112613655575f80fd5b813581811115613663575f80fd5b8860208260051b8501011115613677575f80fd5b95986020929092019750949560400135945092505050565b5f805f805f60a086880312156136a3575f80fd5b6136ac8661352f565b9450602086013593506136c16040870161352f565b925060608601356136d181612ebc565b949793965091946080013592915050565b5f602082840312156136f2575f80fd5b61136e82612fca565b634e487b7160e01b5f52601160045260245ffd5b5f8161371d5761371d6136fb565b505f190190565b5f60018201613735576137356136fb565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b813561375b81612ebc565b6001600160a01b03811690508154816001600160a01b03198216178355602084013562ffffff8116811461378d575f80fd5b76ffffff00000000000000000000000000000000000000008160a01b16905080837fffffffffffffffffff00000000000000000000000000000000000000000000008416171784556040850135805f0b81146137e7575f80fd5b8060b81b77ff000000000000000000000000000000000000000000000016847fffffffffffffffff0000000000000000000000000000000000000000000000008516178317178555505050505050565b634e487b7160e01b5f52604160045260245ffd5b81810381811115611f0b57611f0b6136fb565b5f8135611f0b81612fb9565b813561387581612fb9565b63ffffffff8116905081548163ffffffff198216178355602084013561389a81612fb9565b67ffffffff000000008160201b169050808367ffffffffffffffff1984161717845560408501356138ca81612fb9565b6bffffffff00000000000000008160401b16846bffffffffffffffffffffffff198516178317178555505050506139386139066060840161385e565b82546fffffffff000000000000000000000000191660609190911b6fffffffff00000000000000000000000016178255565b6080820135600182015560a082013560028201555050565b80820180821115611f0b57611f0b6136fb565b5f60208284031215613973575f80fd5b5051919050565b63ffffffff818116838216019080821115611f0957611f096136fb565b63ffffffff828116828216039080821115611f0957611f096136fb565b63ffffffff8181168382160280821691908281146139d4576139d46136fb565b505092915050565b8082028115828204841417611f0b57611f0b6136fb565b5f82613a0d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f8060808587031215613a25575f80fd5b845193506020850151613a3781612ebc565b6040860151909350613a4881612fb9565b6060959095015193969295505050565b5f82515f5b81811015613a775760208186018101518583015201613a5d565b505f920191825250919050565b5f60208284031215613a94575f80fd5b815161136e81612ed056fea2646970667358221220e114725112b4a7c285d309ee221904a09a5b14d935c83ba7c5d4722800d208e764736f6c63430008140033
Deployed Bytecode Sourcemap
2667:14346:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8956:195;;;;;;;;;;-1:-1:-1;8956:195:9;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3970:34;;;;;;;;;;-1:-1:-1;3970:34:9;;;;;;;;;;;2414:14:12;;2407:22;2389:41;;2377:2;2362:18;3970:34:9;2249:187:12;6579:454:9;;;;;;;;;;-1:-1:-1;6579:454:9;;;;;:::i;:::-;;:::i;:::-;;10749:424;;;;;;;;;;-1:-1:-1;10749:424:9;;;;;:::i;:::-;;:::i;3582:33::-;;;;;;;;;;;;;;;;;;;3669:25:12;;;3657:2;3642:18;3582:33:9;3523:177:12;10086:292:9;;;;;;;;;;-1:-1:-1;10086:292:9;;;;;:::i;:::-;;:::i;7609:1343::-;;;;;;;;;;-1:-1:-1;7609:1343:9;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;9921:161::-;;;;;;;;;;-1:-1:-1;9921:161:9;;;;;:::i;:::-;;:::i;3818:33::-;;;;;;;;;;-1:-1:-1;3818:33:9;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12015:55:12;;;11997:74;;12119:8;12107:21;;;12102:2;12087:18;;12080:49;-1:-1:-1;12165:21:12;12145:18;;;12138:49;11985:2;11970:18;3818:33:9;11803:390:12;3664:33:9;;;;;;;;;;;;;;;;1466:27;;;;;;;;;;-1:-1:-1;1466:27:9;;;;-1:-1:-1;;;;;1466:27:9;;;;;;-1:-1:-1;;;;;12383:55:12;;;12365:74;;12353:2;12338:18;1466:27:9;12198:247:12;4400:543:9;;;;;;;;;;-1:-1:-1;4400:543:9;;;;;:::i;:::-;;:::i;3502:40::-;;;;;;;;;;-1:-1:-1;3502:40:9;;;;-1:-1:-1;;;3502:40:9;;;;;;;;;13085:6:12;13073:19;;;13055:38;;13043:2;13028:18;3502:40:9;12911:188:12;3882:39:9;;;;;;;;;;-1:-1:-1;3882:39:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3882:39:9;;;;;;;13335:25:12;;;13391:2;13376:18;;13369:34;;;;13419:18;;;13412:34;-1:-1:-1;;;;;13482:55:12;13477:2;13462:18;;13455:83;13322:3;13307:19;3882:39:9;13104:440:12;10444:115:9;;;;;;;;;;-1:-1:-1;10444:115:9;;;;;:::i;:::-;;:::i;9440:454::-;;;;;;;;;;-1:-1:-1;9440:454:9;;;;;:::i;:::-;;:::i;11848:81::-;;;;;;;;;;;;;:::i;3426:40::-;;;;;;;;;;-1:-1:-1;3426:40:9;;;;-1:-1:-1;;;3426:40:9;;;;;;2284:101:8;;;;;;;;;;;;;:::i;11361:382:9:-;;;;;;;;;;-1:-1:-1;11361:382:9;;;;;:::i;:::-;;:::i;10563:182::-;;;;;;;;;;-1:-1:-1;10563:182:9;;;;;:::i;:::-;;:::i;1629:85:8:-;;;;;;;;;;-1:-1:-1;1675:7:8;1701:6;-1:-1:-1;;;;;1701:6:8;1629:85;;1496:24:9;;;;;;;;;;-1:-1:-1;1496:24:9;;;;-1:-1:-1;;;;;1496:24:9;;;3854:25;;;;;;;;;;-1:-1:-1;3854:25:9;;;;;:::i;:::-;;:::i;:::-;;;;15647:10:12;15684:15;;;15666:34;;15736:15;;;15731:2;15716:18;;15709:43;15788:15;;;15768:18;;;15761:43;;;;15840:15;;15835:2;15820:18;;15813:43;15887:3;15872:19;;15865:35;;;;15931:3;15916:19;;15909:35;;;;15624:3;15609:19;3854:25:9;15358:592:12;3302:35:9;;;;;;;;;;-1:-1:-1;3302:35:9;;;;-1:-1:-1;;;3302:35:9;;;;;;3787:27;;;;;;;;;;-1:-1:-1;3787:27:9;;;;;;;;;;;11201:156;;;;;;;;;;-1:-1:-1;11201:156:9;;;;;:::i;:::-;;:::i;3232:39::-;;;;;;;;;;-1:-1:-1;3232:39:9;;;;-1:-1:-1;;;;;3232:39:9;;;3924:42;;;;;;;;;;-1:-1:-1;3924:42:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16618:14:12;;16611:22;16593:41;;16682:6;16670:19;;;16665:2;16650:18;;16643:47;16706:18;;;16699:34;;;;16764:2;16749:18;;16742:34;16807:3;16792:19;;16785:35;16580:3;16565:19;3924:42:9;16342:484:12;5674:754:9;;;;;;;;;;-1:-1:-1;5674:754:9;;;;;:::i;:::-;;:::i;:::-;;;;17791:25:12;;;17847:2;17832:18;;17825:34;;;;17875:18;;;17868:34;17779:2;17764:18;5674:754:9;17589:319:12;4947:661:9;;;;;;:::i;:::-;;:::i;3357:34::-;;;;;;;;;;-1:-1:-1;3357:34:9;;;;-1:-1:-1;;;3357:34:9;;;;;;9274:162;;;;;;;;;;-1:-1:-1;9274:162:9;;;;;:::i;:::-;;:::i;3748:36::-;;;;;;;;;;-1:-1:-1;3748:36:9;;;;;;;;;;;18806:10:12;18794:23;;;18776:42;;18764:2;18749:18;3748:36:9;18632:192:12;2534:215:8;;;;;;;;;;-1:-1:-1;2534:215:8;;;;;:::i;:::-;;:::i;8956:195:9:-;9039:17;9058:9;9081:66;9088:4;:46;;-1:-1:-1;;;;;9117:12:9;;;;;;:5;:12;;;;;:17;;9088:46;;;-1:-1:-1;;;;;9095:14:9;;;;;;:7;:14;;;;;:19;;9088:46;9136:4;9142;9081:6;:66::i;:::-;9074:73;;;;8956:195;;;;;;;:::o;6579:454::-;6634:8;;;;;;;6633:9;6625:38;;;;-1:-1:-1;;;6625:38:9;;19031:2:12;6625:38:9;;;19013:21:12;19070:2;19050:18;;;19043:30;19109:18;19089;;;19082:46;19145:18;;6625:38:9;;;;;;;;;6694:10;6668:17;6688;;;:5;:17;;;;;;;;-1:-1:-1;;;;;6733:16:9;;;;:7;:16;;;;;;6762:13;;;;6754:42;;;;-1:-1:-1;;;6754:42:9;;19376:2:12;6754:42:9;;;19358:21:12;19415:2;19395:18;;;19388:30;19454:18;19434;;;19427:46;19490:18;;6754:42:9;19174:340:12;6754:42:9;6820:12;;;;-1:-1:-1;;;;;6820:12:9;;;;6840:19;;;;6837:34;;6864:7;;;6579:454;:::o;6837:34::-;-1:-1:-1;;;;;6878:22:9;;;6875:58;;-1:-1:-1;;;;;6905:17:9;;;;;;:7;:17;;;;;:26;;:28;;;;;;:::i;:::-;;;;;;6875:58;6938:12;;;:22;;-1:-1:-1;;;;;;6938:22:9;-1:-1:-1;;;;;6938:22:9;;;;;6964:15;;;:17;;;-1:-1:-1;6964:17:9;;;:::i;:::-;;;;-1:-1:-1;;6991:38:9;;;6999:10;20252:34:12;;-1:-1:-1;;;;;20322:15:12;;;20317:2;20302:18;;20295:43;20374:15;;20354:18;;;20347:43;6991:38:9;;;;;;;20179:2:12;6991:38:9;;;6621:412;;;6579:454;:::o;10749:424::-;1522:13:8;:11;:13::i;:::-;4330:15:9::1;::::0;::::1;;4329:16;4320:46;;;::::0;-1:-1:-1;;;4320:46:9;;20603:2:12;4320:46:9::1;::::0;::::1;20585:21:12::0;20642:2;20622:18;;;20615:30;-1:-1:-1;;;20661:18:12;;;20654:45;20716:18;;4320:46:9::1;20401:339:12::0;4320:46:9::1;10963:16:::2;:36:::0;;-1:-1:-1;;10963:36:9::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;11003:15:::2;:34:::0;;11041:32;;-1:-1:-1;;;11003:34:9::2;::::0;;::::2;;11041:32:::0;;;-1:-1:-1;;;11041:32:9;;::::2;::::0;;;::::2;::::0;;;::::2;11125:44:::0;;-1:-1:-1;;;11077:44:9;;::::2;::::0;;;::::2;11125::::0;;;-1:-1:-1;;;11125:44:9;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;10749:424::o;10086:292::-;1522:13:8;:11;:13::i;:::-;4330:15:9::1;::::0;::::1;;4329:16;4320:46;;;::::0;-1:-1:-1;;;4320:46:9;;20603:2:12;4320:46:9::1;::::0;::::1;20585:21:12::0;20642:2;20622:18;;;20615:30;-1:-1:-1;;;20661:18:12;;;20654:45;20716:18;;4320:46:9::1;20401:339:12::0;4320:46:9::1;10225:18:::2;:40:::0;;-1:-1:-1;;;;;;10225:40:9::2;-1:-1:-1::0;;;;;10225:40:9;::::2;;::::0;;10270:17:::2;10277:10;-1:-1:-1::0;10270:17:9::2;:::i;:::-;10295:6;10291:84;10303:22:::0;;::::2;10291:84;;;10337:10;10354:11;;10366:1;10354:14;;;;;;;:::i;:::-;10337:33:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;10337:33:9;;;::::2;::::0;;;10354:14:::2;::::0;;::::2;::::0;;;::::2;::::0;10337:33;;;::::2;::::0;-1:-1:-1;10337:33:9::2;10354:14:::0;10337:33;::::2;:::i;:::-;;;10327:3;;;;;:::i;:::-;;;;10291:84;;;;10086:292:::0;;;:::o;7609:1343::-;7671:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7671:18:9;7691;;:::i;:::-;7711;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7711:18:9;-1:-1:-1;;;;;7756:12:9;;7736:17;7756:12;;;:5;:12;;;;;;;;7796:7;:14;;;;;7823:349;;;;;;;;7848:15;7823:349;;7756:12;;7796:14;;7823:349;;;7880:43;;7917:4;7880:21;:43::i;:::-;7823:349;;7941:8;;;;;;;7823:349;;;;;;;;;;7969:16;;;;7823:349;;;;;;;;8005:10;7823:349;;;;;;;;;;;;;;;;;;;;;;;;8005:10;;7823:349;-1:-1:-1;;7823:349:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7823:349:9;;;;;-1:-1:-1;;;7823:349:9;;;;;;;-1:-1:-1;;;7823:349:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8031:5;7823:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7823:349:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7823:349:9;;;-1:-1:-1;8059:14:9;;;-1:-1:-1;;;8059:14:9;;;;7823:349;;;;-1:-1:-1;;;8100:20:9;;;;7823:349;;;;-1:-1:-1;;;8147:20:9;;;;7823:349;;;;;8213:17;;7815:357;;-1:-1:-1;;;8202:29:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8202:29:9;;8177:54;;8239:6;8235:53;8251:8;:15;8247:1;:19;8235:53;;;8287:1;8273:8;8282:1;8273:11;;;;;;;;:::i;:::-;;;;;;;;;;:15;8268:3;;;;:::i;:::-;;;;8235:53;;;;8293:30;8325:21;8350:39;8367:4;8373:8;8383:5;8350:16;:39::i;:::-;8292:97;;;;8402:376;;;;;;;;8422:5;-1:-1:-1;;;;;8402:376:9;;;;;8443:35;8465:5;8472;8443:21;:35::i;:::-;8402:376;;;;8496:34;8518:4;8524:5;8496:21;:34::i;:::-;8402:376;;;;8545:4;:10;;8402:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8402:376:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8578:16;8402:376;;;;8617:16;8402:376;;;;8648:4;:10;;;8402:376;;;;8673:4;:10;;;8402:376;;;;8699:4;:11;;;8402:376;;;;8726:4;:12;;;;;;;;;;-1:-1:-1;;;;;8726:12:9;-1:-1:-1;;;;;8402:376:9;;;;;8757:7;:16;8765:7;-1:-1:-1;;;;;8757:16:9;-1:-1:-1;;;;;8757:16:9;;;;;;;;;;;;8402:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8402:376:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8402:376:9;;-1:-1:-1;;8402:376:9;;8791:157;;;;;;;;8812:13;;;;;8791:157;;;;8812:13;8841:15;;;;8791:157;;;;8812:13;8871;;;8791:157;;;;;;;8900:15;;;;8791:157;;;;8930:13;;;;;8791:157;;;;7609:1343;;;;-1:-1:-1;8791:157:9;;-1:-1:-1;;;;;;;7609:1343:9:o;9921:161::-;1522:13:8;:11;:13::i;:::-;4330:15:9::1;::::0;::::1;;4329:16;4320:46;;;::::0;-1:-1:-1;;;4320:46:9;;20603:2:12;4320:46:9::1;::::0;::::1;20585:21:12::0;20642:2;20622:18;;;20615:30;-1:-1:-1;;;20661:18:12;;;20654:45;20716:18;;4320:46:9::1;20401:339:12::0;4320:46:9::1;10039:39:::2;10061:7;10070;1604:6:::0;:31;;-1:-1:-1;;;;;1604:31:9;;;-1:-1:-1;;;;;;1604:31:9;;;;;;;1639:6;:27;;;;;;;;;;;1525:145;10039:39:::2;9921:161:::0;;:::o;3818:33::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3818:33:9;;;-1:-1:-1;3818:33:9;-1:-1:-1;;;3818:33:9;;;;-1:-1:-1;;;3818:33:9;;;;;;:::o;4400:543::-;4489:4;-1:-1:-1;;;;;4503:22:9;;4500:56;;4538:18;;-1:-1:-1;;;;;4538:18:9;;-1:-1:-1;4500:56:9;-1:-1:-1;;;;;4563:23:9;;4560:58;;4600:18;;-1:-1:-1;;;;;4600:18:9;;-1:-1:-1;4560:58:9;4637:9;-1:-1:-1;;;;;4625:21:9;:8;-1:-1:-1;;;;;4625:21:9;;4622:40;;-1:-1:-1;4655:7:9;4648:14;;4622:40;4666:23;4692:10;4703:21;4715:8;4703:11;:21::i;:::-;4692:33;;;;;;;;:::i;:::-;;;;;;;;4666:59;;4729:24;4756:10;4767:22;4779:9;4767:11;:22::i;:::-;4756:34;;;;;;;;:::i;:::-;;;;;;;;;4882:18;;4867:11;;4756:34;;;;;-1:-1:-1;4801:138:9;;4828:8;;4841:9;;4855:7;;-1:-1:-1;;;;;4867:11:9;;;4882:18;;4867:33;:68;;4921:14;;-1:-1:-1;;;4921:14:9;;;;4801:22;:138::i;4867:68::-;4903:15;;-1:-1:-1;;;4903:15:9;;;;4801:22;:138::i;:::-;4794:145;;;;4400:543;;;;;;:::o;10444:115::-;1522:13:8;:11;:13::i;:::-;10527:10:9::1;:28:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;10527:28:9;;;;10544:9;;10527:28;::::1;;10544:9:::0;10527:28;::::1;:::i;:::-;;;10444:115:::0;:::o;9440:454::-;9556:10;9524:21;9548:19;;;:7;:19;;;;;9586:13;;;;9548:19;;9617:16;;;:35;;9645:7;9617:35;;;9636:6;9617:35;9603:49;;9674:6;9657;:13;;;:23;;;;;;;:::i;:::-;;;;;;;;9702:6;9684:14;;:24;;;;;;;:::i;:::-;;;;;;;;9713:25;9741:10;9752:8;9741:20;;;;;;;;;;:::i;:::-;;;;;;;;9713:48;;9765:14;9782:47;9800:8;9810:10;9822:6;9782:17;:47::i;:::-;9765:64;;9855:13;9842:9;:26;;9834:56;;;;-1:-1:-1;;;9834:56:9;;22542:2:12;9834:56:9;;;22524:21:12;22581:2;22561:18;;;22554:30;-1:-1:-1;;;22600:18:12;;;22593:47;22657:18;;9834:56:9;22340:341:12;9834:56:9;9520:374;;;;;9440:454;;;:::o;11848:81::-;1522:13:8;:11;:13::i;:::-;11903:15:9::1;:22:::0;;-1:-1:-1;;11903:22:9::1;11921:4;11903:22;::::0;;11848:81::o;2284:101:8:-;1522:13;:11;:13::i;:::-;2348:30:::1;2375:1;2348:18;:30::i;:::-;2284:101::o:0;11361:382:9:-;1522:13:8;:11;:13::i;:::-;11463:11:9::1;11487:14;;11477:7;:24;:51;;11521:7;11477:51;;;11504:14;;11477:51;11463:65;;11551:6;11533:14;;:24;;;;;;;:::i;:::-;;;;;;;;11562:25;11590:10;11601:8;11590:20;;;;;;;;;;:::i;:::-;;;;;;;;11562:48;;11614:14;11631:47;11649:8;11659:10;11671:6;11631:17;:47::i;:::-;11614:64;;11704:13;11691:9;:26;;11683:56;;;::::0;-1:-1:-1;;;11683:56:9;;22542:2:12;11683:56:9::1;::::0;::::1;22524:21:12::0;22581:2;22561:18;;;22554:30;-1:-1:-1;;;22600:18:12;;;22593:47;22657:18;;11683:56:9::1;22340:341:12::0;11683:56:9::1;11459:284;;;11361:382:::0;;;:::o;10563:182::-;1522:13:8;:11;:13::i;:::-;4330:15:9::1;::::0;::::1;;4329:16;4320:46;;;::::0;-1:-1:-1;;;4320:46:9;;20603:2:12;4320:46:9::1;::::0;::::1;20585:21:12::0;20642:2;20622:18;;;20615:30;-1:-1:-1;;;20661:18:12;;;20654:45;20716:18;;4320:46:9::1;20401:339:12::0;4320:46:9::1;10657:12:::2;10664:5;;10657:12;:::i;:::-;10677:6;10673:69;10685:17:::0;;::::2;10673:69;;;10714:5;10726:6;;10733:1;10726:9;;;;;;;:::i;:::-;10714:23:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;10714:23:9;;;::::2;::::0;;;10726:9:::2;::::0;;::::2;::::0;;;::::2;::::0;10714:23:::2;;::::0;;::::2;::::0;-1:-1:-1;10714:23:9::2;10726:9:::0;10714:23;::::2;:::i;:::-;;;10704:3;;;;;:::i;:::-;;;;10673:69;;3854:25:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3854:25:9;;;;;;;;;;;;-1:-1:-1;;;3854:25:9;;;;;;;:::o;11201:156::-;1522:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;11310:16:9;;;::::1;11286:21;11310:16:::0;;;:7:::1;:16;::::0;;;;11330:23;;-1:-1:-1;;11330:23:9::1;::::0;::::1;;::::0;;;::::1;::::0;;11201:156::o;5674:754::-;5852:10;5768:16;5846:17;;;:5;:17;;;;;5896:10;:20;;5768:16;;;;5846:17;;5768:16;;5896:10;:20;;;;;;;;;;:::i;:::-;;;;;;;;5868:48;;5923:16;5943:39;5960:4;5966:9;;5943:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5977:4:9;;-1:-1:-1;5943:16:9;;-1:-1:-1;;5943:39:9:i;:::-;5921:61;;;6193:54;6235:4;:10;;;6222:4;:10;;;6208:11;:24;;;;:::i;:::-;:37;;;;:::i;:::-;6193:13;:54::i;:::-;6252:10;;;:24;;;6293:1;6280:10;;;:14;6164:83;;-1:-1:-1;6164:83:9;-1:-1:-1;6311:52:9;6329:8;6339:10;6164:83;6311:17;:52::i;:::-;6299:64;;6389:13;6376:9;:26;;6368:56;;;;-1:-1:-1;;;6368:56:9;;22542:2:12;6368:56:9;;;22524:21:12;22581:2;22561:18;;;22554:30;-1:-1:-1;;;22600:18:12;;;22593:47;22657:18;;6368:56:9;22340:341:12;6368:56:9;5821:607;;;5674:754;;;;;;;;:::o;4947:661::-;5067:8;;;;;;;5063:104;;5090:16;;5110:15;5090:16;;;;:35;;5082:60;;;;-1:-1:-1;;;5082:60:9;;24490:2:12;5082:60:9;;;24472:21:12;24529:2;24509:18;;;24502:30;24568:14;24548:18;;;24541:42;24600:18;;5082:60:9;24288:336:12;5082:60:9;5147:8;:15;;-1:-1:-1;;5147:15:9;;;;;5063:104;5171:25;5199:10;5210:8;5199:20;;;;;;;;;;:::i;:::-;;;;;;;;5171:48;;5224:17;5244:5;5250;5244:12;;;;;;;;;;:::i;:::-;;;;;;;;;5287:10;5281:17;;:5;:17;;;;;;5244:12;;;;;;-1:-1:-1;5281:17:9;5318:35;5335:8;5345:7;5318:16;:35::i;:::-;5303:50;;5377:11;5366:7;:22;;5358:52;;;;-1:-1:-1;;;5358:52:9;;22542:2:12;5358:52:9;;;22524:21:12;22581:2;22561:18;;;22554:30;-1:-1:-1;;;22600:18:12;;;22593:47;22657:18;;5358:52:9;22340:341:12;5358:52:9;5434:4;:14;;;5423:7;:25;;5415:61;;;;-1:-1:-1;;;5415:61:9;;24831:2:12;5415:61:9;;;24813:21:12;24870:2;24850:18;;;24843:30;24909:25;24889:18;;;24882:53;24952:18;;5415:61:9;24629:347:12;5415:61:9;5481:34;5490:4;5496:7;5505:9;5481:8;:34::i;:::-;15783:195;;;;;;;;15801:9;;;;;;15783:195;;15826:13;;;;;;;15783:195;;;;;;;15861:15;15783:195;;;;;;;;;;;;;;;;;;;;15958:14;;;;;15783:195;;;;;;15767:215;;15801:9;15767:215;;;;;-1:-1:-1;15767:215:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15767:215:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15767:215:9;;;;;-1:-1:-1;;;15767:215:9;;;;;;;;;;;;;;;;;;;;;;;;5559:45;;;5566:10;25269:34:12;;25334:2;25319:18;;25312:34;;;25394:4;25382:17;;25362:18;;;25355:45;;;;-1:-1:-1;;;;;25436:15:12;;25431:2;25416:18;;25409:43;5559:45:9;;25195:3:12;25180:19;5559:45:9;;;;;;;5059:549;;;;4947:661;;;;;:::o;9274:162::-;9364:10;9332:21;9356:19;;;:7;:19;;;;;9409:4;9397:16;;;;:35;;9428:4;9397:35;;;9416:9;9397:35;9379:53;;;;;;;;;-1:-1:-1;;9379:53:9;;;;;;-1:-1:-1;9274:162:9:o;2534:215:8:-;1522:13;:11;:13::i;:::-;-1:-1:-1;;;;;2618:22:8;::::1;2614:91;;2663:31;::::0;::::1;::::0;;2691:1:::1;2663:31;::::0;::::1;12365:74:12::0;12338:18;;2663:31:8::1;12198:247:12::0;2614:91:8::1;2714:28;2733:8;2714:18;:28::i;:::-;2534:215:::0;:::o;12500:310:9:-;12616:12;;12582;;12596:4;;;12641:6;;;:19;;12659:1;12641:19;;;12650:6;12652:4;12650:1;:6;:::i;:::-;12632:28;;12664:6;12675:4;12673:1;:6;:19;;12691:1;12673:19;;;12682:6;12684:4;12682:1;:6;:::i;:::-;12664:28;-1:-1:-1;12696:18:9;12727:3;12664:28;12727:1;:3;:::i;:::-;12717:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12717:14:9;;;;;;;;;;;;;;;;-1:-1:-1;12696:35:9;-1:-1:-1;12746:1:9;12735:50;12751:1;12749;:3;12735:50;;;12775:5;12781:3;12783:1;12781;:3;:::i;:::-;12775:10;;;;;;;;:::i;:::-;;;;;;;;;;12762:23;;;;;;;;12775:10;;;;;;;12762:23;;-1:-1:-1;;;;;12762:23:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;12768:3;12770:1;12768;:3;:::i;:::-;12762:10;;;;;;;;:::i;:::-;;;;;;:23;;;;12754:3;;;;;:::i;:::-;;;;12735:50;;;-1:-1:-1;12797:5:9;12804:1;;-1:-1:-1;12500:310:9;-1:-1:-1;;;;;;12500:310:9:o;1787:162:8:-;1675:7;1701:6;-1:-1:-1;;;;;1701:6:8;735:10:0;1846:23:8;1842:101;;1892:40;;;;;735:10:0;1892:40:8;;;12365:74:12;12338:18;;1892:40:8;12198:247:12;11959:494:9;12090:10;:17;12041:21;;12079:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12079:29:9;;12069:39;;12116:6;12112:320;12128:7;:14;12124:1;:18;12112:320;;;12154:25;12182:10;12193:1;12182:13;;;;;;;;:::i;:::-;;;;;;;;12154:41;;12204:6;12200:227;;12225:13;;-1:-1:-1;;;;;12225:13:9;:27;:92;;12286:13;;12280:37;;-1:-1:-1;;;12280:37:9;;-1:-1:-1;;;;;12383:55:12;;;12280:37:9;;;12365:74:12;12286:13:9;;;;12280:30;;12338:18:12;;12280:37:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12225:92;;;12263:5;-1:-1:-1;;;;;12255:22:9;;12225:92;12212:7;12220:1;12212:10;;;;;;;;:::i;:::-;;;;;;:105;;;;;12200:227;;;12341:13;;-1:-1:-1;;;;;12341:13:9;:27;:86;;12381:13;;12375:52;;;;;-1:-1:-1;;;;;25905:15:12;;;12375:52:9;;;25887:34:12;12421:4:9;25937:18:12;;;25930:43;12381:13:9;;;;12375:30;;25799:18:12;;12375:52:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12341:86;;;12371:1;12341:86;12328:7;12336:1;12328:10;;;;;;;;:::i;:::-;;;;;;:99;;;;;12200:227;-1:-1:-1;12144:3:9;;;;:::i;:::-;;;;12112:320;;;;11959:494;;;;;:::o;15990:686::-;16102:19;16123:10;16159:9;:16;16148:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16148:28:9;-1:-1:-1;16140:36:9;-1:-1:-1;16206:15:9;16180:16;16226:447;16242:9;:16;16238:1;:20;16226:447;;;16270:17;16290:4;:10;;16301:9;16311:1;16301:12;;;;;;;;:::i;:::-;;;;;;;16290:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;16351:13;;16290:24;;-1:-1:-1;16336:28:9;;16351:13;;;;;;;16336:12;;;;:28;:::i;:::-;16319:45;;16369:19;16403:7;16391:19;;:9;:19;;;:41;;16425:7;16391:41;;;16413:9;16391:41;16470:15;;16369:63;;-1:-1:-1;16437:15:9;;16455:30;;-1:-1:-1;;;16470:15:9;;;;16369:63;16455:30;:::i;:::-;16544:13;;16437:48;;-1:-1:-1;16490:11:9;;16544:20;;:13;;;;;16560:4;16544:20;:::i;:::-;16519:9;;;16505:11;;;16504:61;;;;;16505:34;;;;:23;;16519:9;;;16505:23;:::i;:::-;:34;;;;:::i;:::-;16504:61;;;;:::i;:::-;16490:75;;16581:6;16570:5;16576:1;16570:8;;;;;;;;:::i;:::-;;;;;;;;;;:17;16592:15;16601:6;16592:15;;:::i;:::-;;;16615:17;16612:56;;;16638:30;;-1:-1:-1;;16638:30:9;-1:-1:-1;;;16638:30:9;;;;;;;16612:56;16265:408;;;;;16260:3;;;;;:::i;:::-;;;;16226:447;;;;16136:540;15990:686;;;;;;:::o;12814:193::-;12873:4;12888:6;12884:87;12900:10;:17;12896:21;;12884:87;;;12952:5;-1:-1:-1;;;;;12930:27:9;:10;12941:1;12930:13;;;;;;;;:::i;:::-;;;;;;;;;;:18;-1:-1:-1;;;;;12930:18:9;:27;12927:44;;12970:1;12814:193;-1:-1:-1;;12814:193:9:o;12927:44::-;12919:3;;;;:::i;:::-;;;;12884:87;;;-1:-1:-1;12975:28:9;;-1:-1:-1;;;12975:28:9;;27249:2:12;12975:28:9;;;27231:21:12;27288:2;27268:18;;;27261:30;27327:20;27307:18;;;27300:48;27365:18;;12975:28:9;27047:342:12;2234:426:9;2436:162;;;;;;;;-1:-1:-1;;;;;2436:162:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2436:162:9;;;;;;2620:6;;:36;;;;;27712:13:12;;27708:22;;2620:36:9;;;27690:41:12;27773:24;;27769:33;;27747:20;;;27740:63;27841:24;;27819:20;;;27812:54;27908:24;;27904:39;;;27882:20;;;27875:69;27986:24;;27982:33;;27960:20;;;27953:63;-1:-1:-1;2620:6:9;;;;:28;;27601:19:12;;2620:36:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2603:53:9;;2234:426;-1:-1:-1;;;;;;;;2234:426:9:o;13581:611::-;13688:12;13710:8;13722:1;13710:13;13707:26;;-1:-1:-1;13732:1:9;13725:8;;13707:26;13753:13;;13785:18;;-1:-1:-1;;;;;13753:13:9;;;;13785:18;13811:12;;;13808:102;;13830:55;13858:4;13864:10;13876:8;13830:27;:55::i;:::-;13897:8;13890:15;;;;;;13808:102;-1:-1:-1;;;;;13917:18:9;;13914:126;;13942:30;;;;;;;;3669:25:12;;;-1:-1:-1;;;;;13942:20:9;;;;;3642:18:12;;13942:30:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13977:38:9;;-1:-1:-1;;;;;13977:28:9;;;-1:-1:-1;13977:38:9;;;;;-1:-1:-1;14006:8:9;;13977:38;;;;14006:8;13977:28;:38;;;;;;;;;;;;;;;;;;;;;14027:8;14020:15;;;;;;13914:126;14088:16;;14054:76;;14076:4;;14082;;-1:-1:-1;;;14088:16:9;;;;14114:4;14121:8;14054:21;:76::i;:::-;14044:86;;14134:54;14162:4;14168:10;14180:7;14134:27;:54::i;:::-;13703:489;;13581:611;;;;;:::o;2903:187:8:-;2976:16;2995:6;;-1:-1:-1;;;;;3011:17:8;;;-1:-1:-1;;;;;;3011:17:8;;;;;;3043:40;;2995:6;;;;;;;3043:40;;2976:16;3043:40;2966:124;2903:187;:::o;16680:329:9:-;16875:14;;16858;;;16811:18;;16805:50;;-1:-1:-1;;;16805:50:9;;16849:4;16805:50;;;12365:74:12;;;;16744:16:9;;;;;;16875:14;;-1:-1:-1;;;;;16811:18:9;;16805:35;;12338:18:12;;16805:50:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;:84;;;;:::i;:::-;16785:104;;16921:12;16907:11;:26;:55;;16950:12;16907:55;;;16936:11;16907:55;16893:69;-1:-1:-1;16980:25:9;16893:69;16980:11;:25;:::i;:::-;16966:39;;16781:228;16680:329;;;:::o;13011:566::-;13131:13;;13163:18;;13097:12;;-1:-1:-1;;;;;13131:13:9;;;;13163:18;13131:13;13186:165;;13230:8;13217:9;:21;13209:55;;;;-1:-1:-1;;;13209:55:9;;28740:2:12;13209:55:9;;;28722:21:12;28779:2;28759:18;;;28752:30;28818:23;28798:18;;;28791:51;28859:18;;13209:55:9;28538:345:12;13209:55:9;13186:165;;;13277:74;13309:4;13315:10;13335:4;13342:8;13277:31;:74::i;:::-;13367:4;-1:-1:-1;;;;;13359:12:9;:4;-1:-1:-1;;;;;13359:12:9;;13356:32;;13380:8;13373:15;;;;;;13356:32;-1:-1:-1;;;;;13396:18:9;;13393:93;;13427:4;-1:-1:-1;;;;;13421:19:9;;13449:8;13421:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13473:8;13466:15;;;;;;13393:93;13531:16;;13497:76;;13519:4;;13525;;-1:-1:-1;;;13531:16:9;;;;13557:4;13564:8;13497:21;:76::i;:::-;13490:83;13011:566;-1:-1:-1;;;;;13011:566:9:o;14276:1402::-;14459:15;;14477:4;;14448:26;;-1:-1:-1;;;14459:15:9;;;;14448:8;:26;:::i;:::-;:33;;;;:::i;:::-;14430:14;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;14510:18:9;;14486:21;14510:18;;;:7;:18;;;;;14654:13;;;;14651:614;;;14691:12;;;;-1:-1:-1;;;;;14691:25:9;;;:12;;:25;14674:14;14804:4;14691:25;14745:55;;14780:20;;-1:-1:-1;;;14780:20:9;;;;14745:55;;;14757:20;;-1:-1:-1;;;14757:20:9;;;;14745:55;14733:68;;;;:8;:68;:::i;:::-;:75;;;;:::i;:::-;14832:15;;14721:87;;-1:-1:-1;14813:9:9;;14850:4;;14825:22;;14832:15;;;;;14721:87;14825:22;:::i;:::-;:29;;;;:::i;:::-;14813:41;-1:-1:-1;14859:9:9;14871:11;14813:41;14871:4;:11;:::i;:::-;14859:23;-1:-1:-1;14890:8:9;;14887:65;;14920:4;14906;:10;;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;14887:65:9;14959:8;;14956:150;;14992:4;14975:6;:13;;;:21;;;;;;;:::i;:::-;;;;;;;;15041:4;15023:14;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;14956:150:9;15127:8;15110:6;:13;;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;15158:89:9;;;;;;;;15170:10;15158:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15140:11;;;;:109;;;;;;;;-1:-1:-1;15140:109:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15140:109:9;-1:-1:-1;;;;;15140:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15140:109:9;;;;;;-1:-1:-1;;15140:109:9;;;;;;;;;;;-1:-1:-1;;14276:1402:9:o;14651:614::-;-1:-1:-1;;;;;15368:23:9;;;15365:310;;-1:-1:-1;;;;;15422:16:9;;15398:21;15422:16;;;:5;:16;;;;;15471:14;;15422:16;;15398:21;15488:4;;15460:25;;-1:-1:-1;;;15471:14:9;;;;15460:8;:25;:::i;:::-;:32;;;;:::i;:::-;15443:49;;15515:9;15497:8;:14;;;:27;;;;;;;:::i;:::-;;;;;;;;15548:8;15529;:15;;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;15581:87:9;;;;;;;;15593:10;15581:87;;;;;;;;;;;;;;;-1:-1:-1;15581:87:9;;;;;;;;;;;;15561:13;;;;:109;;15581:87;15561:109;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15561:109:9;-1:-1:-1;;;;;15561:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15561:109:9;;;;;;;;;;;-1:-1:-1;;;14276:1402:9:o;1175:309:10:-;1335:59;;;-1:-1:-1;;;;;29080:55:12;;;1335:59:10;;;29062:74:12;29152:18;;;;29145:34;;;1335:59:10;;;;;;;;;;29035:18:12;;;;1335:59:10;;;;;;;-1:-1:-1;;;;;1335:59:10;1358:24;1335:59;;;1324:71;;-1:-1:-1;;;;1324:10:10;;;;:71;;1335:59;1324:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1288:107;;;;1413:7;:57;;;;-1:-1:-1;1425:11:10;;:16;;:44;;;1456:4;1445:24;;;;;;;;;;;;:::i;:::-;1405:72;;;;-1:-1:-1;;;1405:72:10;;30059:2:12;1405:72:10;;;30041:21:12;30098:1;30078:18;;;30071:29;30136:4;30116:18;;;30109:32;30158:18;;1405:72:10;29857:325:12;1405:72:10;1278:206;;1175:309;;;:::o;1674:556:9:-;1888:6;;1822:14;;1843:64;;1870:8;;-1:-1:-1;;;;;1888:6:9;1897:9;1843:26;:64::i;:::-;1965:213;;;;;;;;-1:-1:-1;;;;;1965:213:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1965:213:9;;;;;;;;;;;;2195:6;;:31;;;;;30495:13:12;;30491:22;;2195:31:9;;;30473:41:12;30556:24;;30552:33;;30530:20;;;30523:63;30628:24;;30624:39;;;30602:20;;;30595:69;30706:24;;30702:33;;30680:20;;;30673:63;30774:24;30752:20;;;30745:54;30837:24;30815:20;;;30808:54;30904:24;30900:33;;30878:20;;;30871:63;1965:213:9;;2195:6;;:23;;30384:19:12;;2195:31:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2183:43;1674:556;-1:-1:-1;;;;;;;1674:556:9:o;525:358:10:-;723:69;;;-1:-1:-1;;;;;31226:15:12;;;723:69:10;;;31208:34:12;31278:15;;;31258:18;;;31251:43;31310:18;;;;31303:34;;;723:69:10;;;;;;;;;;31120:18:12;;;;723:69:10;;;;;;;-1:-1:-1;;;;;723:69:10;746:28;723:69;;;712:81;;-1:-1:-1;;;;712:10:10;;;;:81;;723:69;712:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;664:129;;;;811:7;:57;;;;-1:-1:-1;823:11:10;;:16;;:44;;;854:4;843:24;;;;;;;;;;;;:::i;:::-;803:73;;;;-1:-1:-1;;;803:73:10;;31550:2:12;803:73:10;;;31532:21:12;31589:1;31569:18;;;31562:29;31627:5;31607:18;;;31600:33;31650:18;;803:73:10;31348:326:12;1837:307:10;1996:58;;;-1:-1:-1;;;;;29080:55:12;;;1996:58:10;;;29062:74:12;29152:18;;;;29145:34;;;1996:58:10;;;;;;;;;;29035:18:12;;;;1996:58:10;;;;;;;-1:-1:-1;;;;;1996:58:10;2019:23;1996:58;;;1985:70;;-1:-1:-1;;;;1985:10:10;;;;:70;;1996:58;1985:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1949:106;;;;2073:7;:57;;;;-1:-1:-1;2085:11:10;;:16;;:44;;;2116:4;2105:24;;;;;;;;;;;;:::i;:::-;2065:72;;;;-1:-1:-1;;;2065:72:10;;31881:2:12;2065:72:10;;;31863:21:12;31920:1;31900:18;;;31893:29;31958:4;31938:18;;;31931:32;31980:18;;2065:72:10;31679:325:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:154:12;-1:-1:-1;;;;;93:5:12;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:118;259:5;252:13;245:21;238:5;235:32;225:60;;281:1;278;271:12;296:519;379:6;387;395;403;456:3;444:9;435:7;431:23;427:33;424:53;;;473:1;470;463:12;424:53;512:9;499:23;531:31;556:5;531:31;:::i;:::-;581:5;-1:-1:-1;638:2:12;623:18;;610:32;651:30;610:32;651:30;:::i;:::-;296:519;;700:7;;-1:-1:-1;;;;754:2:12;739:18;;726:32;;805:2;790:18;777:32;;296:519::o;1497:747::-;1757:2;1769:21;;;1839:13;;1742:18;;;1861:22;;;1709:4;;1936;;1914:2;1899:18;;;1963:15;;;1709:4;2006:169;2020:6;2017:1;2014:13;2006:169;;;2108:13;;1146;;-1:-1:-1;;;;;1142:62:12;1130:75;;1255:4;1243:17;;;1237:24;1221:14;;;1214:48;1312:4;1300:17;;;1294:24;1278:14;;;1271:48;1369:4;1357:17;;;1351:24;1335:14;;;1328:48;1440:4;1428:17;;;1422:24;1415:32;1408:40;1392:14;;;1385:64;1481:4;1472:14;;2069:58;-1:-1:-1;2150:15:12;;;;2042:1;2035:9;2006:169;;;-1:-1:-1;;;2211:18:12;;2204:34;;;;2192:3;1497:747;-1:-1:-1;;1497:747:12:o;2441:247::-;2500:6;2553:2;2541:9;2532:7;2528:23;2524:32;2521:52;;;2569:1;2566;2559:12;2521:52;2608:9;2595:23;2627:31;2652:5;2627:31;:::i;2693:121::-;2778:10;2771:5;2767:22;2760:5;2757:33;2747:61;;2804:1;2801;2794:12;2819:159;2886:20;;2946:6;2935:18;;2925:29;;2915:57;;2968:1;2965;2958:12;2915:57;2819:159;;;:::o;2983:535::-;3073:6;3081;3089;3097;3105;3158:3;3146:9;3137:7;3133:23;3129:33;3126:53;;;3175:1;3172;3165:12;3126:53;3214:9;3201:23;3233:30;3257:5;3233:30;:::i;:::-;3282:5;-1:-1:-1;3306:37:12;3339:2;3324:18;;3306:37;:::i;:::-;3296:47;;3362:37;3395:2;3384:9;3380:18;3362:37;:::i;:::-;3352:47;;3418:37;3451:2;3440:9;3436:18;3418:37;:::i;:::-;3408:47;;3474:38;3507:3;3496:9;3492:19;3474:38;:::i;:::-;3464:48;;2983:535;;;;;;;;:::o;3705:781::-;3828:6;3836;3844;3897:2;3885:9;3876:7;3872:23;3868:32;3865:52;;;3913:1;3910;3903:12;3865:52;3952:9;3939:23;3971:31;3996:5;3971:31;:::i;:::-;4021:5;-1:-1:-1;4077:2:12;4062:18;;4049:32;4100:18;4130:14;;;4127:34;;;4157:1;4154;4147:12;4127:34;4195:6;4184:9;4180:22;4170:32;;4240:7;4233:4;4229:2;4225:13;4221:27;4211:55;;4262:1;4259;4252:12;4211:55;4302:2;4289:16;4328:2;4320:6;4317:14;4314:34;;;4344:1;4341;4334:12;4314:34;4400:7;4395:2;4387:4;4379:6;4375:17;4371:2;4367:26;4363:35;4360:48;4357:68;;;4421:1;4418;4411:12;4357:68;4452:2;4448;4444:11;4434:21;;4474:6;4464:16;;;;;3705:781;;;;;:::o;4491:388::-;4559:6;4567;4620:2;4608:9;4599:7;4595:23;4591:32;4588:52;;;4636:1;4633;4626:12;4588:52;4675:9;4662:23;4694:31;4719:5;4694:31;:::i;:::-;4744:5;-1:-1:-1;4801:2:12;4786:18;;4773:32;4814:33;4773:32;4814:33;:::i;:::-;4866:7;4856:17;;;4491:388;;;;;:::o;4884:435::-;4937:3;4975:5;4969:12;5002:6;4997:3;4990:19;5028:4;5057:2;5052:3;5048:12;5041:19;;5094:2;5087:5;5083:14;5115:1;5125:169;5139:6;5136:1;5133:13;5125:169;;;5200:13;;5188:26;;5234:12;;;;5269:15;;;;5161:1;5154:9;5125:169;;;-1:-1:-1;5310:3:12;;4884:435;-1:-1:-1;;;;;4884:435:12:o;5423:716::-;5484:3;5522:5;5516:12;5549:6;5544:3;5537:19;5575:4;5604:2;5599:3;5595:12;5588:19;;5641:2;5634:5;5630:14;5662:1;5683;5693:421;5709:6;5704:3;5701:15;5693:421;;;5772:13;;5814:9;;-1:-1:-1;;;;;5810:58:12;5798:71;;5913:11;;;5907:18;5927:8;5903:33;5889:12;;;5882:55;5960:4;6018:11;;;6012:18;5998:33;;5984:12;;;5977:55;6061:4;6052:14;;;;6089:15;;;;5735:1;5726:11;5693:421;;;-1:-1:-1;6130:3:12;;5423:716;-1:-1:-1;;;;;;5423:716:12:o;6144:915::-;6201:3;6239:5;6233:12;6266:6;6261:3;6254:19;6292:4;6321:2;6316:3;6312:12;6305:19;;6358:2;6351:5;6347:14;6379:1;6389:645;6403:6;6400:1;6397:13;6389:645;;;6462:13;;6537:9;;6498:10;6533:18;;;6521:31;;6596:11;;;6590:18;6586:27;;6572:12;;;6565:49;6637:4;6685:11;;;6679:18;6675:27;;6661:12;;;6654:49;6726:4;6774:11;;;6768:18;6764:27;;;6750:12;;;6743:49;6815:4;6859:11;;;6853:18;6839:12;;;6832:40;6895:4;6939:11;;;6933:18;6919:12;;;6912:40;6981:4;6972:14;;;;7009:15;;;;6425:1;6418:9;6389:645;;7159:888;7208:3;7247:4;7242:3;7238:14;7293:5;7287:12;7280:20;7273:28;7268:3;7261:41;7321:4;7382:6;7376:2;7369:5;7365:14;7359:21;7355:34;7350:2;7345:3;7341:12;7334:56;7439:4;7432:5;7428:16;7422:23;7415:4;7410:3;7406:14;7399:47;7495:4;7488:5;7484:16;7478:23;7471:4;7466:3;7462:14;7455:47;7551:4;7544:5;7540:16;7534:23;7527:4;7522:3;7518:14;7511:47;7604:4;7597:5;7593:16;7587:23;7642:4;7635;7630:3;7626:14;7619:28;7669:4;7702:12;7696:19;7737:6;7731:4;7724:20;7771:3;7766;7762:13;7753:22;;7816:2;7802:12;7798:21;7784:35;;7837:1;7828:10;;7847:173;7861:6;7858:1;7855:13;7847:173;;;7951:13;;1146;;-1:-1:-1;;;;;1142:62:12;1130:75;;1255:4;1243:17;;;1237:24;1221:14;;;1214:48;1312:4;1300:17;;;1294:24;1278:14;;;1271:48;1369:4;1357:17;;;1351:24;1335:14;;;1328:48;1440:4;1428:17;;;1422:24;1415:32;1408:40;1392:14;;;1385:64;1481:4;1472:14;;7910:62;;8007:2;7999:6;7995:15;7985:25;;7883:1;7880;7876:9;7871:14;;7847:173;;;-1:-1:-1;8036:5:12;7159:888;-1:-1:-1;;;;;;7159:888:12:o;8052:1399::-;8162:12;;-1:-1:-1;;;;;886:54:12;874:67;;8100:3;8128:6;8226:4;8219:5;8215:16;8209:23;8264:2;8257:4;8252:3;8248:14;8241:26;8288:56;8340:2;8335:3;8331:12;8317;8288:56;:::i;:::-;8276:68;;;8392:4;8385:5;8381:16;8375:23;8440:3;8434:4;8430:14;8423:4;8418:3;8414:14;8407:38;8468:50;8513:4;8497:14;8468:50;:::i;:::-;8454:64;;;8566:4;8559:5;8555:16;8549:23;8616:3;8608:6;8604:16;8597:4;8592:3;8588:14;8581:40;8644:56;8693:6;8677:14;8644:56;:::i;:::-;8630:70;;;8748:4;8741:5;8737:16;8731:23;8798:3;8790:6;8786:16;8779:4;8774:3;8770:14;8763:40;8826:52;8871:6;8855:14;8826:52;:::i;:::-;8812:66;;;8927:4;8920:5;8916:16;8910:23;8903:4;8898:3;8894:14;8887:47;8983:4;8976:5;8972:16;8966:23;8959:4;8954:3;8950:14;8943:47;9039:4;9032:5;9028:16;9022:23;9015:4;9010:3;9006:14;8999:47;9065:6;9118:2;9111:5;9107:14;9101:21;9096:2;9091:3;9087:12;9080:43;;9142:6;9196:2;9189:5;9185:14;9179:21;9209:48;9253:2;9248:3;9244:12;9228:14;-1:-1:-1;;;;;886:54:12;874:67;;820:127;9209:48;;;9276:6;9330:2;9323:5;9319:14;9313:21;9376:3;9368:6;9364:16;9359:2;9354:3;9350:12;9343:38;9397:48;9438:6;9422:14;9397:48;:::i;:::-;9390:55;8052:1399;-1:-1:-1;;;;;;8052:1399:12:o;9804:1809::-;10127:3;10116:9;10109:22;10174:6;10168:13;10162:3;10151:9;10147:19;10140:42;10090:4;10229;10221:6;10217:17;10211:24;10254:6;10279:3;10318:2;10313;10302:9;10298:18;10291:30;10344:63;10402:3;10391:9;10387:19;10373:12;10344:63;:::i;:::-;10330:77;;10456:4;10448:6;10444:17;10438:24;10471:51;10518:2;10507:9;10503:18;10487:14;1022:13;1015:21;1003:34;;952:91;10471:51;-1:-1:-1;10571:4:12;10559:17;;10553:24;5400:10;5389:22;10635:3;10620:19;;5377:35;10689:4;10677:17;;10671:24;10763:22;;;-1:-1:-1;;10759:31:12;;;10753:3;10738:19;;10731:60;10671:24;;-1:-1:-1;10814:60:12;10767:6;10671:24;10814:60;:::i;:::-;10800:74;;10923:4;10915:6;10911:17;10905:24;10883:46;;10994:2;10982:9;10974:6;10970:22;10966:31;10960:3;10949:9;10945:19;10938:60;;11021:56;11070:6;11054:14;11021:56;:::i;:::-;11007:70;;11126:4;11118:6;11114:17;11108:24;11086:46;;11141:54;11190:3;11179:9;11175:19;11159:14;7140:6;7129:18;7117:31;;7064:90;11141:54;11244:3;11232:16;;11226:23;7140:6;7129:18;;;11307:3;11292:19;;7117:31;11349:15;;;11343:22;7129:18;11423:3;11408:19;;7117:31;-1:-1:-1;11466:22:12;;;11459:4;11444:20;;11437:52;11506:39;11470:6;11530;11506:39;:::i;:::-;11498:47;;;11554:53;11601:4;11590:9;11586:20;11578:6;9547:5;9541:12;9534:20;9527:28;9522:3;9515:41;9617:6;9609:4;9602:5;9598:16;9592:23;9588:36;9581:4;9576:3;9572:14;9565:60;9674:4;9667:5;9663:16;9657:23;9650:4;9645:3;9641:14;9634:47;9730:4;9723:5;9719:16;9713:23;9706:4;9701:3;9697:14;9690:47;9786:4;9779:5;9775:16;9769:23;9762:4;9757:3;9753:14;9746:47;;;9456:343;11554:53;9804:1809;;;;;;:::o;11618:180::-;11677:6;11730:2;11718:9;11709:7;11705:23;11701:32;11698:52;;;11746:1;11743;11736:12;11698:52;-1:-1:-1;11769:23:12;;11618:180;-1:-1:-1;11618:180:12:o;12450:456::-;12527:6;12535;12543;12596:2;12584:9;12575:7;12571:23;12567:32;12564:52;;;12612:1;12609;12602:12;12564:52;12651:9;12638:23;12670:31;12695:5;12670:31;:::i;:::-;12720:5;-1:-1:-1;12777:2:12;12762:18;;12749:32;12790:33;12749:32;12790:33;:::i;:::-;12450:456;;12842:7;;-1:-1:-1;;;12896:2:12;12881:18;;;;12868:32;;12450:456::o;13549:194::-;13636:6;13689:2;13677:9;13668:7;13664:23;13660:32;13657:52;;;13705:1;13702;13695:12;13657:52;-1:-1:-1;13728:9:12;13549:194;-1:-1:-1;13549:194:12:o;13748:156::-;13814:20;;13874:4;13863:16;;13853:27;;13843:55;;13894:1;13891;13884:12;13909:318;13984:6;13992;14000;14053:2;14041:9;14032:7;14028:23;14024:32;14021:52;;;14069:1;14066;14059:12;14021:52;14092:27;14109:9;14092:27;:::i;:::-;14082:37;14166:2;14151:18;;14138:32;;-1:-1:-1;14217:2:12;14202:18;;;14189:32;;13909:318;-1:-1:-1;;;13909:318:12:o;14232:642::-;14342:6;14350;14403:2;14391:9;14382:7;14378:23;14374:32;14371:52;;;14419:1;14416;14409:12;14371:52;14459:9;14446:23;14488:18;14529:2;14521:6;14518:14;14515:34;;;14545:1;14542;14535:12;14515:34;14583:6;14572:9;14568:22;14558:32;;14628:7;14621:4;14617:2;14613:13;14609:27;14599:55;;14650:1;14647;14640:12;14599:55;14690:2;14677:16;14716:2;14708:6;14705:14;14702:34;;;14732:1;14729;14722:12;14702:34;14788:7;14783:2;14775:4;14767:6;14763:17;14759:2;14755:26;14751:35;14748:48;14745:68;;;14809:1;14806;14799:12;14745:68;14840:2;14832:11;;;;;14862:6;;-1:-1:-1;14232:642:12;;-1:-1:-1;;;;14232:642:12:o;15955:382::-;16020:6;16028;16081:2;16069:9;16060:7;16056:23;16052:32;16049:52;;;16097:1;16094;16087:12;16049:52;16136:9;16123:23;16155:31;16180:5;16155:31;:::i;:::-;16205:5;-1:-1:-1;16262:2:12;16247:18;;16234:32;16275:30;16234:32;16275:30;:::i;16831:753::-;16933:6;16941;16949;16957;17010:2;16998:9;16989:7;16985:23;16981:32;16978:52;;;17026:1;17023;17016:12;16978:52;17049:27;17066:9;17049:27;:::i;:::-;17039:37;;17127:2;17116:9;17112:18;17099:32;17150:18;17191:2;17183:6;17180:14;17177:34;;;17207:1;17204;17197:12;17177:34;17245:6;17234:9;17230:22;17220:32;;17290:7;17283:4;17279:2;17275:13;17271:27;17261:55;;17312:1;17309;17302:12;17261:55;17352:2;17339:16;17378:2;17370:6;17367:14;17364:34;;;17394:1;17391;17384:12;17364:34;17447:7;17442:2;17432:6;17429:1;17425:14;17421:2;17417:23;17413:32;17410:45;17407:65;;;17468:1;17465;17458:12;17407:65;16831:753;;17499:2;17491:11;;;;;-1:-1:-1;17521:6:12;;17574:2;17559:18;17546:32;;-1:-1:-1;16831:753:12;-1:-1:-1;;;16831:753:12:o;17913:525::-;18004:6;18012;18020;18028;18036;18089:3;18077:9;18068:7;18064:23;18060:33;18057:53;;;18106:1;18103;18096:12;18057:53;18129:27;18146:9;18129:27;:::i;:::-;18119:37;;18203:2;18192:9;18188:18;18175:32;18165:42;;18226:36;18258:2;18247:9;18243:18;18226:36;:::i;:::-;18216:46;;18312:2;18301:9;18297:18;18284:32;18325:31;18350:5;18325:31;:::i;:::-;17913:525;;;;-1:-1:-1;17913:525:12;;18427:3;18412:19;18399:33;;17913:525;-1:-1:-1;;17913:525:12:o;18443:184::-;18501:6;18554:2;18542:9;18533:7;18529:23;18525:32;18522:52;;;18570:1;18567;18560:12;18522:52;18593:28;18611:9;18593:28;:::i;19519:184::-;-1:-1:-1;;;19568:1:12;19561:88;19668:4;19665:1;19658:15;19692:4;19689:1;19682:15;19708:136;19747:3;19775:5;19765:39;;19784:18;;:::i;:::-;-1:-1:-1;;;19820:18:12;;19708:136::o;19849:135::-;19888:3;19909:17;;;19906:43;;19929:18;;:::i;:::-;-1:-1:-1;19976:1:12;19965:13;;19849:135::o;20745:184::-;-1:-1:-1;;;20794:1:12;20787:88;20894:4;20891:1;20884:15;20918:4;20915:1;20908:15;20934:1079;21101:5;21088:19;21116:33;21141:7;21116:33;:::i;:::-;-1:-1:-1;;;;;21172:7:12;21168:56;21158:66;;21249:4;21243:11;21356:2;-1:-1:-1;;;;;;21283:2:12;21279:75;21276:83;21270:4;21263:97;21408:2;21401:5;21397:14;21384:28;21456:8;21447:7;21443:22;21434:7;21431:35;21421:63;;21480:1;21477;21470:12;21421:63;21526:48;21516:7;21511:3;21507:17;21503:72;21493:82;;21685:2;21680;21611:66;21607:2;21603:75;21600:83;21597:91;21591:4;21584:105;21737:2;21730:5;21726:14;21713:28;21786:7;21783:1;21772:22;21763:7;21760:35;21750:63;;21809:1;21806;21799:12;21750:63;21996:7;21991:3;21987:17;21935:50;21931:74;21925:2;21856:66;21852:2;21848:75;21845:83;21841:2;21838:91;21835:171;21829:4;21822:185;;;;;20934:1079;;:::o;22018:184::-;-1:-1:-1;;;22067:1:12;22060:88;22167:4;22164:1;22157:15;22191:4;22188:1;22181:15;22207:128;22274:9;;;22295:11;;;22292:37;;;22309:18;;:::i;22686:174::-;22730:11;22782:3;22769:17;22795:30;22819:5;22795:30;:::i;23138:1015::-;23297:5;23284:19;23312:32;23336:7;23312:32;:::i;:::-;23376:10;23367:7;23363:24;23353:34;;23412:4;23406:11;23468:2;23454:10;23450:15;23446:2;23442:24;23439:32;23433:4;23426:46;23520:2;23513:5;23509:14;23496:28;23533:32;23557:7;23533:32;:::i;:::-;23606:18;23596:7;23592:2;23588:16;23584:41;23574:51;;23692:2;23687;23665:18;23661:23;23657:2;23653:32;23650:40;23647:48;23641:4;23634:62;23744:2;23737:5;23733:14;23720:28;23757:32;23781:7;23757:32;:::i;:::-;23894:26;23884:7;23880:2;23876:16;23872:49;23866:2;23836:26;23832:31;23828:2;23824:40;23821:48;23817:2;23814:56;23811:111;23805:4;23798:125;;;;;23932:95;23984:42;24022:2;24015:5;24011:14;23984:42;:::i;:::-;22957:11;;-1:-1:-1;;22993:75:12;23078:2;23074:14;;;;23090:34;23070:55;22990:136;22977:150;;22865:268;23932:95;24081:3;24074:5;24070:15;24057:29;24053:1;24047:4;24043:12;24036:51;24141:3;24134:5;24130:15;24117:29;24113:1;24107:4;24103:12;24096:51;23138:1015;;:::o;24158:125::-;24223:9;;;24244:10;;;24241:36;;;24257:18;;:::i;25463:184::-;25533:6;25586:2;25574:9;25565:7;25561:23;25557:32;25554:52;;;25602:1;25599;25592:12;25554:52;-1:-1:-1;25625:16:12;;25463:184;-1:-1:-1;25463:184:12:o;25984:172::-;26051:10;26081;;;26093;;;26077:27;;26116:11;;;26113:37;;;26130:18;;:::i;26161:175::-;26229:10;26272;;;26260;;;26256:27;;26295:12;;;26292:38;;;26310:18;;:::i;26341:249::-;26412:10;26454;;;26466;;;26450:27;26497:20;;;;26412:10;26536:24;;;26526:58;;26564:18;;:::i;:::-;26526:58;;26341:249;;;;:::o;26595:168::-;26668:9;;;26699;;26716:15;;;26710:22;;26696:37;26686:71;;26737:18;;:::i;26768:274::-;26808:1;26834;26824:189;;-1:-1:-1;;;26866:1:12;26859:88;26970:4;26967:1;26960:15;26998:4;26995:1;26988:15;26824:189;-1:-1:-1;27027:9:12;;26768:274::o;28027:506::-;28123:6;28131;28139;28147;28200:3;28188:9;28179:7;28175:23;28171:33;28168:53;;;28217:1;28214;28207:12;28168:53;28246:9;28240:16;28230:26;;28299:2;28288:9;28284:18;28278:25;28312:31;28337:5;28312:31;:::i;:::-;28412:2;28397:18;;28391:25;28362:5;;-1:-1:-1;28425:32:12;28391:25;28425:32;:::i;:::-;28523:2;28508:18;;;;28502:25;28027:506;;;;-1:-1:-1;;;28027:506:12:o;29190:412::-;29319:3;29357:6;29351:13;29382:1;29392:129;29406:6;29403:1;29400:13;29392:129;;;29504:4;29488:14;;;29484:25;;29478:32;29465:11;;;29458:53;29421:12;29392:129;;;-1:-1:-1;29576:1:12;29540:16;;29565:13;;;-1:-1:-1;29540:16:12;29190:412;-1:-1:-1;29190:412:12:o;29607:245::-;29674:6;29727:2;29715:9;29706:7;29702:23;29698:32;29695:52;;;29743:1;29740;29733:12;29695:52;29775:9;29769:16;29794:28;29816:5;29794:28;:::i
Swarm Source
ipfs://e114725112b4a7c285d309ee221904a09a5b14d935c83ba7c5d4722800d208e7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$2.03
Net Worth in ETH
0.001
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BASE | 100.00% | $2,028.21 | 0.001 | $2.03 |
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.