Source Code
Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 625341 | 840 days ago | 0 ETH | ||||
| 625341 | 840 days ago | 0 ETH | ||||
| 625335 | 840 days ago | 0 ETH | ||||
| 625335 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0.01129759 ETH | ||||
| 625324 | 840 days ago | 0.03464619 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625324 | 840 days ago | 0 ETH | ||||
| 625318 | 840 days ago | 0.01172615 ETH | ||||
| 625318 | 840 days ago | 0 ETH | ||||
| 625318 | 840 days ago | 0 ETH | ||||
| 625308 | 840 days ago | 0.03422977 ETH | ||||
| 625308 | 840 days ago | 0 ETH | ||||
| 625308 | 840 days ago | 0 ETH | ||||
| 625308 | 840 days ago | 0 ETH | ||||
| 625308 | 840 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ScaleV1_2
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;
import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import {IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol";
import {OFTCoreUpgradeable} from "@layerzerolabs/solidity-examples/contracts/contracts-upgradable/token/oft/OFTCoreUpgradeable.sol";
import {IOFTUpgradeable} from "@layerzerolabs/solidity-examples/contracts/contracts-upgradable/token/oft/IOFTUpgradeable.sol";
import {ILayerZeroEndpoint} from "@layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroEndpoint.sol";
import {SingleLinkedList, SingleLinkedListLib} from "../utils/SingleLinkedList.sol";
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
returns (uint amountToken, uint amountETH, uint liquidity);
function getAmountsOut(uint amountIn, address[] memory path)
external
view
returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] memory path)
external
view
returns (uint[] memory amounts);
}
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address);
}
interface IUniswapV2Pair {
function sync() external;
}
/**
* Omits certain logic specific to ETH in order to adhere to the size limit
*
*/
contract ScaleV1_2 is OFTCoreUpgradeable, IERC20Upgradeable {
using SingleLinkedListLib for SingleLinkedList;
/* -------------------------------------------------------------------------- */
/* events */
/* -------------------------------------------------------------------------- */
error InvalidParameters();
error RemoteStateOutOfSync(uint remoteState);
error ERC20InsufficientAllowance(address, address, uint);
error InsuffcientBalance(uint);
error OFTCoreUnknownPacketType();
error MaxTransaction();
error MaxWallet();
error TransfersDisabled();
event Reflect(uint256 baseAmountReflected, uint256 totalReflected);
event LaunchFee(address user, uint amount);
event TransmitToRemote(
uint16 indexed destinationChain,
uint totalReflections
);
event AnswerToRemote(uint16 indexed remoteChainId, uint answer);
event RequestRemoteState(uint16 indexed requestedChain);
event ReceiveRemoteState(
uint16 indexed sourceChain,
uint receivedRemoteState
);
event XReflect(uint256 baseAmountReflected, uint256 totalReflected);
/* -------------------------------------------------------------------------- */
/* constants */
/* -------------------------------------------------------------------------- */
string constant _name = "ScaleX.gg | Scale";
string constant _symbol = "S";
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
IUniswapV2Router02 public immutable UNISWAP_V2_ROUTER;
address constant DEAD = 0x000000000000000000000000000000000000dEaD;
address constant ZERO = 0x0000000000000000000000000000000000000000;
// supplies
uint256 constant TOTAL_SUPPLY = 1_000_000 ether;
uint256 constant PRESALE_SUPPLY = TOTAL_SUPPLY * 5_257 / MAX_BP;
uint256 constant TREASURY_VESTING = 200_000 ether;
uint256 constant TREASURY_LOCKED = 100_000 ether;
uint256 constant LZ_GAS_USAGE_LIMIT = 1_000_000;
uint256 constant MAX_BP = 10_000;
// fees
uint256 constant MAX_FEE = 1_500; /* 15% */
uint256 constant LAUNCH_FEE = 1_500; /* 15% */
uint256 constant LAUNCH_FEE_DURATION = 1 days;
// reflections
uint256 constant REFLECTION_GROWTH_FACTOR = 12;
uint256 constant MAX_BURN_REWARD_RATE = MAX_BP;
uint256 constant ASYMPTOTE = 10;
uint256 private constant MIN_MAX_WALLET = (TOTAL_SUPPLY * 160) / MAX_BP; // 1.6%
uint256 private constant MIN_MAX_TX = TOTAL_SUPPLY / 100;
uint16 public constant PT_TRANSMIT_AND_REQUEST = 1;
uint16 public constant PT_TRANSMIT = 2;
uint16 public constant PT_RESPONSE = 3;
/* -------------------------------------------------------------------------- */
/* states */
/* -------------------------------------------------------------------------- */
struct Fee {
// not to be swapped to native
uint8 reflection;
// sent off
uint8 marketing;
// to be swapped to native
uint8 omnichain /* used to cover gas for transmitting reflections across chains */;
uint8 treasury;
uint8 referral /* 50% user buying free reduction & 50% to referrer */;
uint8 lp /* local LP + chain expansion */;
uint8 buyback;
uint8 burn;
uint128 total;
}
struct EmissionRateChange {
uint256 startingTime;
uint256 duration;
uint256 targetValue;
}
// L0 chain IDs sorted by avg gas costs in decreasing order
SingleLinkedList public chains;
uint16 private lzChainId;
bool private liquidityInitialised;
uint256 public feesEnabled;
uint256 public swapThreshold; // denominated as reflected amount
uint256 public totalReflected;
uint256 private launchTime;
uint256 private isInSwap;
uint256 private isLowGasChain;
// wallet limits
uint256 private limitsEnabled;
uint256 private maxWallet;
uint256 private maxTx;
// for auto lp burn
uint256 private lastBurnTime;
uint256 private burnRewardRate;
uint256 private lpBurnRatePerDay;
uint256 private burnTimeDiffCap; // after this time, pending burn amount does not increase anymore
address private _uniswapPair;
address private marketingFeeReceiver;
address private lpFeeReceiver;
address private buybackFeeReceiver;
address private treasuryReceiver;
address private lpBurnReceiver;
Fee public buyFee;
Fee public sellFee;
mapping(address => uint256) private isRegistredPool;
mapping(address => uint256) private _baseBalance;
mapping(address => uint256) private txLimitsExcluded;
mapping(address => mapping(address => uint256)) private _allowances;
// --- V1
uint256 public crossChainReflectionsEnabled;
uint256 public transfersEnabled;
EmissionRateChange private erc;
mapping(address => uint256) private isEcosystemContract;
// --- V2
// --- Constructor
/// @custom:oz-upgrades-unsafe-allow constructor state-variable-immutable
constructor(address router) {
UNISWAP_V2_ROUTER = IUniswapV2Router02(router);
}
receive() external payable {}
function initialize(
address _lzEndpoint,
address newMarketingFeeReceiver,
address newLPfeeReceiver,
address newBuyBackFeeReceiver,
address newTreasuryReceiver,
address newLPBurnReceiver
) public payable initializer {
// initialise parents
__Ownable_init_unchained();
__LzAppUpgradeable_init_unchained(_lzEndpoint);
// set variables
swapThreshold = (TOTAL_SUPPLY * 20) / MAX_BP; /* 0.2% of total supply */
// limits
limitsEnabled = 1;
maxWallet = TOTAL_SUPPLY * 160 / MAX_BP;
maxTx = maxWallet;
// LZ setup
lzChainId = ILayerZeroEndpoint(_lzEndpoint).getChainId() + 100;
chains.addNode(lzChainId, 0);
marketingFeeReceiver = newMarketingFeeReceiver;
lpFeeReceiver = newLPfeeReceiver;
buybackFeeReceiver = newBuyBackFeeReceiver;
treasuryReceiver = newTreasuryReceiver;
lpBurnReceiver = newLPBurnReceiver;
// exclude project wallets from limits
txLimitsExcluded[marketingFeeReceiver] = 1;
txLimitsExcluded[buybackFeeReceiver] = 1;
txLimitsExcluded[treasuryReceiver] = 1;
txLimitsExcluded[lpBurnReceiver] = 1;
txLimitsExcluded[address(this)] = 1;
txLimitsExcluded[lpFeeReceiver] = 1;
buyFee = Fee({
reflection: 100,
omnichain: 100,
buyback: 0,
marketing: 100,
lp: 100,
treasury: 100,
referral: 0,
burn: 0,
total: 500
});
sellFee = Fee({
reflection: 100,
omnichain: 100,
buyback: 0,
marketing: 100,
lp: 100,
treasury: 100,
referral: 0,
burn: 0,
total: 500
});
// mint presale supply to treasury
if (block.chainid == 1) {
// only on Ethereum main net
_baseBalance[treasuryReceiver] = PRESALE_SUPPLY;
emit Transfer(address(0), treasuryReceiver, PRESALE_SUPPLY);
}
}
function addLiquidity(uint sharesForChain) external payable onlyOwner {
if (liquidityInitialised) revert();
liquidityInitialised = true;
uint liquiditySupply = TOTAL_SUPPLY - PRESALE_SUPPLY - TREASURY_VESTING - TREASURY_LOCKED;
uint tokensForLiquidity = (liquiditySupply * sharesForChain) / MAX_BP;
// fund address(this) with desired amount of liquidity tokens
_baseBalance[address(this)] = _baseBalance[address(this)] + tokensForLiquidity;
emit Transfer(address(0), address(this), tokensForLiquidity);
// create uniswap pair
_uniswapPair = IUniswapV2Factory(UNISWAP_V2_ROUTER.factory())
.createPair(address(this), UNISWAP_V2_ROUTER.WETH());
// set unlimited allowance for uniswap router
_allowances[address(this)][address(UNISWAP_V2_ROUTER)] = type(uint256).max;
// add desired amount of liquidity to pair
UNISWAP_V2_ROUTER.addLiquidityETH{value: msg.value}(
address(this), // address token,
tokensForLiquidity, // uint amountTokenDesired,
tokensForLiquidity, // uint amountTokenMin,
msg.value, // uint amountETHMin,
treasuryReceiver, // address to,
block.timestamp // uint deadline
);
// set fee variables
isRegistredPool[_uniswapPair] = 1;
feesEnabled = 1;
launchTime = block.timestamp;
// auto LP burn
lastBurnTime = block.timestamp;
lpBurnRatePerDay = 2_000;
burnRewardRate = 0;
burnTimeDiffCap = 1 days;
}
function manuallyBurnLP() public payable onlyOwner {
_burnLP();
}
/* -------------------------------------------------------------------------- */
/* ERC20 */
/* -------------------------------------------------------------------------- */
function approve(
address spender,
uint256 amount
) public override returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function approveMax(address spender) external returns (bool) {
return approve(spender, type(uint256).max);
}
function transfer(
address recipient,
uint256 amount
) external override returns (bool) {
return _transferFrom(msg.sender, recipient, amount);
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) external override returns (bool) {
if (_allowances[sender][msg.sender] != type(uint256).max) {
if (_allowances[sender][msg.sender] < amount)
revert ERC20InsufficientAllowance(
sender,
recipient,
_allowances[sender][msg.sender]
);
_allowances[sender][msg.sender] =
_allowances[sender][msg.sender] -
amount;
}
return _transferFrom(sender, recipient, amount);
}
/* -------------------------------------------------------------------------- */
/* OFT */
/* -------------------------------------------------------------------------- */
function token() external view override returns (address) {
return address(this);
}
function _debitFrom(
address _from,
uint16 /* dst chain id */,
bytes memory /* toAddress */,
uint _amount
) internal override returns (uint) {
if(transfersEnabled == 0 && txLimitsExcluded[_from] == 0) revert TransfersDisabled();
if (_from != msg.sender) {
if (_allowances[_from][msg.sender] < _amount)
revert ERC20InsufficientAllowance(_from, msg.sender, _amount);
unchecked {
_allowances[_from][msg.sender] =
_allowances[_from][msg.sender] -
_amount;
}
}
if (_baseBalance[_from] < _amount) revert InsuffcientBalance(_amount);
unchecked {
// burn
_baseBalance[_from] = _baseBalance[_from] - _amount;
}
return _amount;
}
function _creditTo(
uint16 /* src chain id */,
address _toAddress,
uint _amount
) internal override returns (uint) {
if(transfersEnabled == 0 && txLimitsExcluded[_toAddress] == 0) revert TransfersDisabled();
// mint
_baseBalance[_toAddress] = _baseBalance[_toAddress] + _amount;
return _amount;
}
/* -------------------------------------------------------------------------- */
/* Views */
/* -------------------------------------------------------------------------- */
function supportsInterface(
bytes4 interfaceId
) public view virtual override(OFTCoreUpgradeable) returns (bool) {
return
interfaceId == type(IOFTUpgradeable).interfaceId ||
interfaceId == type(IERC20Upgradeable).interfaceId ||
super.supportsInterface(interfaceId);
}
function totalSupply() external pure override returns (uint256) {
return TOTAL_SUPPLY;
}
function decimals() external pure returns (uint8) {
return 18;
}
function name() external pure returns (string memory) {
return _name;
}
function symbol() external pure returns (string memory) {
return _symbol;
}
function balanceOf(address account) public view override returns (uint256) {
return baseToReflectionAmount(_baseBalance[account]);
}
function baseBalanceOf(address account) public view returns(uint256) {
return _baseBalance[account];
}
function allowance(
address holder,
address spender
) external view override returns (uint256) {
return _allowances[holder][spender];
}
function baseToReflectionAmount(
uint256 baseAmount
) public view returns (uint256) {
// ASYMPTOTE = N = post reflection supply approaches total supply * N
// REFLECTION_GROWTH_FACTOR = M = speed of reflections
uint numerator = (ASYMPTOTE - 1) * ASYMPTOTE * TOTAL_SUPPLY * baseAmount;
uint denominator = (REFLECTION_GROWTH_FACTOR * totalReflected) + (ASYMPTOTE * TOTAL_SUPPLY);
return ASYMPTOTE * baseAmount - (numerator / denominator);
}
function reflectionToBaseAmount(
uint reflectionAmount
) public view returns (uint) {
uint numerator = reflectionAmount * ((TOTAL_SUPPLY * ASYMPTOTE) + (REFLECTION_GROWTH_FACTOR * totalReflected));
uint denominator = ASYMPTOTE * (TOTAL_SUPPLY + (REFLECTION_GROWTH_FACTOR * totalReflected));
return numerator / denominator;
}
function circulatingSupply() public view returns (uint256) {
return baseToReflectionAmount(TOTAL_SUPPLY - balanceOf(DEAD) - balanceOf(ZERO) - totalReflected);
}
function circulatingBaseSupply() public view returns (uint256) {
return TOTAL_SUPPLY - balanceOf(DEAD) - balanceOf(ZERO) - totalReflected;
}
function getMaxWalletAndTx() external view returns (bool, uint, uint) {
return (
feesEnabled != 0,
baseToReflectionAmount(maxWallet),
baseToReflectionAmount(maxTx)
);
}
function getLPBurnInfo() external view returns (uint, uint, uint, uint) {
return (lpBurnRatePerDay, lastBurnTime, burnRewardRate, burnTimeDiffCap);
}
/* -------------------------------------------------------------------------- */
/* Access restricted */
/* -------------------------------------------------------------------------- */
function clearStuckBalance() external payable onlyOwner {
(bool success, ) = payable(msg.sender).call{
value: address(this).balance
}("");
require(success);
}
function clearStuckToken() external payable onlyOwner {
_transferFrom(address(this), msg.sender, balanceOf(address(this)));
}
function setRegistredPool(
address pool,
uint state
) external payable onlyOwner {
isRegistredPool[pool] = state;
}
function setIsEcosystemContract(
address addr,
uint256 state
) public payable onlyOwner {
isEcosystemContract[addr] = state;
}
// --- Swap & fee settings (& cross chain reflections)
function setSwapSettings(
uint256 newtransfersEnabled,
uint256 newFeesEnabled,
uint256 newSwapThreshold,
uint256 newCrossChainReflectionsEnabled,
uint256 newLimitsEnabled,
uint256 newMaxWallet,
uint256 newMaxTx
) external payable onlyOwner {
// only able to disable transfers if something goes wrong durting launch
if(
launchTime != 0 &&
block.timestamp > launchTime + 1 days
) {
transfersEnabled = 1;
} else {
// if we flip from disabled to enabled
if(newtransfersEnabled > transfersEnabled) {
launchTime = block.timestamp;
lastBurnTime = block.timestamp;
lpBurnRatePerDay = 2_000;
}
transfersEnabled = newtransfersEnabled;
}
feesEnabled = newFeesEnabled;
limitsEnabled = newLimitsEnabled;
crossChainReflectionsEnabled = newCrossChainReflectionsEnabled;
swapThreshold = newSwapThreshold;
require(newMaxWallet >= MIN_MAX_WALLET && newMaxTx >= MIN_MAX_TX);
maxWallet = newMaxWallet;
maxTx = newMaxTx;
}
function changeFees(
Fee calldata _buyFee,
Fee calldata _sellFee
) external payable onlyOwner {
// can cast all numbers, or just the first to save gas I think, not sure what the saving differences are like
uint128 totalBuyFee = uint128(_buyFee.reflection) +
_buyFee.marketing +
_buyFee.omnichain +
_buyFee.treasury +
_buyFee.referral +
_buyFee.lp +
_buyFee.buyback +
_buyFee.burn;
uint128 totalSellFee = uint128(_sellFee.reflection) +
_sellFee.marketing +
_sellFee.omnichain +
_sellFee.treasury +
_sellFee.referral +
_sellFee.lp +
_sellFee.buyback +
_sellFee.burn;
if (
totalBuyFee != _buyFee.total ||
totalSellFee != _sellFee.total ||
totalBuyFee > MAX_FEE ||
totalSellFee > MAX_FEE
) revert InvalidParameters();
buyFee = _buyFee;
sellFee = _sellFee;
}
function setFeeReceivers(
address newMarketingFeeReceiver,
address newLPfeeReceiver,
address newBuybackFeeReceiver,
address newTreasuryReceiver,
address newLPBurnReceiver
) external payable onlyOwner {
if(newMarketingFeeReceiver != address(0))
marketingFeeReceiver = newMarketingFeeReceiver;
if(newLPfeeReceiver != address(0))
lpFeeReceiver = newLPfeeReceiver;
if(newBuybackFeeReceiver != address(0))
buybackFeeReceiver = newBuybackFeeReceiver;
if(newTreasuryReceiver != address(0))
treasuryReceiver = newTreasuryReceiver;
if(newLPBurnReceiver != address(0))
lpBurnReceiver = newLPBurnReceiver;
}
// --- Cross chain setup
function setTrustedRemoteWithInfo(
uint16 _remoteChainId,
bytes calldata _remoteAddress,
uint8 chainListPosition
) external payable onlyOwner {
// we only add the chain to the list of lower gas chains if it actually is a lower gas chain
if (chainListPosition != 0) {
chains.addNode(_remoteChainId, chainListPosition);
}
trustedRemoteLookup[_remoteChainId] = abi.encodePacked(
_remoteAddress,
address(this)
);
emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
}
function removeChain(uint data) external payable onlyOwner {
chains.removeNode(data);
}
// --- Wallet & Transaction limits
function setExcludeFromLimits(
address toExclude,
uint256 targetValue
) public payable onlyOwner {
txLimitsExcluded[toExclude] = targetValue;
}
// --- LP burns
function setLPBurnData(
uint256 newBurnRewardRate,
uint256 newBurnTimeDiffCap,
address receiver
) public payable onlyOwner {
if (newBurnRewardRate > MAX_BURN_REWARD_RATE)
revert InvalidParameters();
burnRewardRate = newBurnRewardRate;
lpBurnReceiver = receiver;
burnTimeDiffCap = newBurnTimeDiffCap;
}
function setEmissionRateChange(
uint256 newStartingTime,
uint256 newDuration,
uint256 newTargetValue
) public payable onlyOwner {
erc = EmissionRateChange(
newStartingTime,
newDuration,
newTargetValue
);
}
/* -------------------------------------------------------------------------- */
/* Internal */
/* -------------------------------------------------------------------------- */
function _transferFrom(
address sender,
address recipient,
uint256 amount
) internal returns (bool) {
bool senderIsPool = isRegistredPool[sender] != 0; // = buy
bool recipientIsPool = isRegistredPool[recipient] != 0; // = sell
if(
transfersEnabled == 0 && !(
txLimitsExcluded[sender] != 0 ||
(senderIsPool && txLimitsExcluded[recipient] != 0)
)
) revert TransfersDisabled();
// take launch fee first
uint baseLaunchFeeAmount;
// take launch fee
if (
feesEnabled != 0 &&
!senderIsPool &&
isInSwap == 0 &&
block.timestamp - launchTime < LAUNCH_FEE_DURATION
) {
isInSwap = 1;
// swap back
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = UNISWAP_V2_ROUTER.WETH();
uint reflectedLaunchFeeAmount = (amount *
LAUNCH_FEE *
(LAUNCH_FEE_DURATION - (block.timestamp - launchTime))) /
LAUNCH_FEE_DURATION /
MAX_BP;
baseLaunchFeeAmount = reflectionToBaseAmount(
reflectedLaunchFeeAmount
);
_baseBalance[address(this)] =
_baseBalance[address(this)] +
baseLaunchFeeAmount;
emit Transfer(sender, address(this), reflectedLaunchFeeAmount);
emit LaunchFee(sender, reflectedLaunchFeeAmount);
UNISWAP_V2_ROUTER
.swapExactTokensForETHSupportingFeeOnTransferTokens(
reflectedLaunchFeeAmount,
0,
path,
treasuryReceiver,
block.timestamp
);
isInSwap = 0;
}
// Swap own token balance against pool if conditions are fulfilled
// this has to be done before calculating baseAmount since it shifts
// the balance in the liquidity pool, thus altering the result
{
if (
isInSwap == 0 &&
// this only swaps if it's not a buy, amplifying impacts of sells and
// leaving buys untouched but also shifting gas costs of this to sellers only
isRegistredPool[msg.sender] == 0 &&
feesEnabled != 0 &&
_baseBalance[address(this)] >= swapThreshold
) {
isInSwap = 1;
Fee memory memorySellFee = sellFee;
uint256 stack_SwapThreshold = swapThreshold;
uint256 amountToBurn = (stack_SwapThreshold *
memorySellFee.burn) / memorySellFee.total;
uint256 amountToSwap = stack_SwapThreshold - amountToBurn;
// burn, no further checks needed here
uint256 baseAmountToBurn = reflectionToBaseAmount(amountToBurn);
_baseBalance[address(this)] =
_baseBalance[address(this)] -
baseAmountToBurn;
_baseBalance[DEAD] = _baseBalance[DEAD] + baseAmountToBurn;
// swap non-burned tokens to ETH
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = UNISWAP_V2_ROUTER.WETH();
UNISWAP_V2_ROUTER
.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSwap,
0,
path,
address(this),
block.timestamp
);
uint256 amountETH = address(this).balance;
// share of fees that should be swapped to ETH
uint256 totalSwapShare = memorySellFee.total -
memorySellFee.reflection -
memorySellFee.burn;
/*
* Send proceeds to respective wallets, except for omnichain which remains in contract.
*
* We don't need to use return values of low level calls here since we can just manually withdraw
* funds in case of failure; receiver wallets are owner supplied though and should only be EOAs
* anyway
*/
// marketing
payable(marketingFeeReceiver).call{
value: (amountETH * memorySellFee.marketing) /
totalSwapShare
}("");
// LP
payable(lpFeeReceiver).call{
value: (amountETH * memorySellFee.lp) / totalSwapShare
}("");
// buyback
payable(buybackFeeReceiver).call{
value: (amountETH * memorySellFee.buyback) / totalSwapShare
}("");
// treasury
payable(treasuryReceiver).call{
value: (amountETH * memorySellFee.treasury) / totalSwapShare
}("");
isInSwap = 0;
}
}
uint maxRequiredBaseInput;
if(
recipientIsPool &&
lpBurnRatePerDay != 0 &&
block.timestamp > lastBurnTime
) {
uint totalSellFee = sellFee.total; // gas savings
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = UNISWAP_V2_ROUTER.WETH();
uint outputIfSwappedBeforeBurn = UNISWAP_V2_ROUTER.getAmountsOut(
feesEnabled != 0
? amount * (MAX_BP - totalSellFee) / MAX_BP
: amount,
path
)[1];
_burnLP();
// required input to receive correct output after paying fees
maxRequiredBaseInput = reflectionToBaseAmount(
UNISWAP_V2_ROUTER.getAmountsIn(
outputIfSwappedBeforeBurn, path
)[0] * (
feesEnabled != 0
? MAX_BP / (MAX_BP - totalSellFee)
: 1
)
);
}
uint256 baseAmount = reflectionToBaseAmount(amount);
if (_baseBalance[sender] < baseAmount)
revert InsuffcientBalance(_baseBalance[sender]);
/**
* If we burn before selling, the pool receives eg 10 tokens on
* 80 (+12.5%) instead of 10 tokens on 100 (+10%) and therefore
* creates a higher price to sell at.
*
* We therefore tax the sold amount so that the received ETH amount
* is the same as if the burn didn't happen beforehand, essentially
* making the burn happen 'after' the swap.
*/
uint256 postBurnFeeBaseAmount = baseAmount;
if(maxRequiredBaseInput != 0 && maxRequiredBaseInput < baseAmount) {
postBurnFeeBaseAmount = maxRequiredBaseInput;
_baseBalance[address(this)] = _baseBalance[address(this)] + (baseAmount - maxRequiredBaseInput);
emit Transfer(sender, address(this), baseAmount - maxRequiredBaseInput);
}
/**
* @dev this modifies LP balance and thus also reflection amount that we
* previously calculated, however the actually transferred amount will
* still be based on the conversion from reflected amount to base amount
* at the time of the transaction initiation and will NOT account for
* changes made here
*/
uint256 baseAmountReceived = feesEnabled != 0 && isInSwap == 0
? _performReflectionAndTakeFees(postBurnFeeBaseAmount, sender, senderIsPool)
: postBurnFeeBaseAmount;
if(limitsEnabled != 0) {
if (
!senderIsPool &&
feesEnabled != 0 &&
txLimitsExcluded[sender] == 0 &&
baseAmount > maxTx
) revert MaxTransaction();
if (
feesEnabled != 0 &&
!recipientIsPool &&
txLimitsExcluded[recipient] == 0 &&
_baseBalance[recipient] + baseAmountReceived > maxWallet
) revert MaxWallet();
}
_baseBalance[sender] = _baseBalance[sender] - baseAmount;
_baseBalance[recipient] = _baseBalance[recipient] + baseAmountReceived;
emit Transfer(sender, recipient, baseToReflectionAmount(baseAmountReceived));
return true;
}
function _burnLP() internal {
uint mem_lastBurnTime = lastBurnTime;
uint256 pairBalance = _baseBalance[_uniswapPair]; // gas savings
uint256 timeDelta = block.timestamp <= mem_lastBurnTime + burnTimeDiffCap
? (block.timestamp - mem_lastBurnTime)
: 1 days;
uint256 tokensToRemove =
pairBalance *
timeDelta *
lpBurnRatePerDay /
(1 days * MAX_BP);
EmissionRateChange memory mem_erc = erc;
uint256 emissionRate = burnRewardRate;
if(
mem_erc.startingTime != 0 &&
mem_erc.startingTime <= block.timestamp
) {
if(mem_erc.startingTime + mem_erc.duration > block.timestamp) {
emissionRate =
mem_erc.targetValue > emissionRate
? emissionRate + ((block.timestamp - mem_erc.startingTime) * (mem_erc.targetValue - emissionRate) / mem_erc.duration)
: emissionRate - ((block.timestamp - mem_erc.startingTime) * (emissionRate - mem_erc.targetValue) / mem_erc.duration);
} else {
emissionRate = mem_erc.targetValue;
}
}
uint256 tokensToReward = tokensToRemove * emissionRate / MAX_BP;
uint256 tokensToBurn = tokensToRemove - tokensToReward;
lastBurnTime = block.timestamp;
_baseBalance[_uniswapPair] = pairBalance - tokensToRemove;
if(tokensToBurn != 0) {
emit Transfer( _uniswapPair, address(0), baseToReflectionAmount(tokensToBurn));
}
if(tokensToReward != 0) {
_baseBalance[lpBurnReceiver] = _baseBalance[lpBurnReceiver] + tokensToReward;
emit Transfer(_uniswapPair, lpBurnReceiver, baseToReflectionAmount(tokensToReward));
}
// Update the uniswap pair's reserves
IUniswapV2Pair(_uniswapPair).sync();
}
function _performReflectionAndTakeFees(
uint256 baseAmount,
address sender,
bool buying
) internal returns (uint256) {
Fee memory memoryBuyFee = buyFee;
Fee memory memorySellFee = sellFee;
// amount of fees in base amount (non-reflection adjusted)
uint256 baseFeeAmount = buying
? (baseAmount * memoryBuyFee.total) / MAX_BP
: (baseAmount * memorySellFee.total) / MAX_BP;
// reflect
uint256 baseAmountReflected = buying
? (baseAmount * memoryBuyFee.reflection) / MAX_BP
: (baseAmount * memorySellFee.reflection) / MAX_BP;
/**
* Omnichain
*
* - integrate local delta into state
* - send local delta to lower gas chains
* - request local state from lowest gas chain
* - set local state to minimum (=most recent) of local state & remote state
*/
totalReflected = totalReflected + baseAmountReflected;
emit Reflect(baseAmountReflected, totalReflected);
if(crossChainReflectionsEnabled != 0)
_transmitReflectionToOtherChainsAndFetchState();
uint256 baseBalanceToContract = baseFeeAmount - baseAmountReflected;
if (baseBalanceToContract != 0) {
_baseBalance[address(this)] =
_baseBalance[address(this)] +
baseBalanceToContract;
emit Transfer(
sender,
address(this),
baseToReflectionAmount(baseBalanceToContract)
);
}
return baseAmount - baseFeeAmount;
}
/* -------------------------------------------------------------------------- */
/* L0 */
/* -------------------------------------------------------------------------- */
/**
* @notice Multicast reflection state change to all chains that are tendencially
* cheaper than the local chain & fetch reflection state of cheapest chain to
* integrate into local state
*/
function _transmitReflectionToOtherChainsAndFetchState() internal {
if (chains.length < 2) return;
uint256[] memory lowerGasChains = chains.getBeheadedList();
uint256 lowerGasChainsLen = lowerGasChains.length; // gas savings
uint mem_totalReflected = totalReflected; // gas savings
bytes memory lzPayload = abi.encode(PT_TRANSMIT, mem_totalReflected);
for (uint iterator; iterator < lowerGasChainsLen - 1; ) {
(uint gasRequired /* zroFee */, ) = lzEndpoint.estimateFees(
uint16(lowerGasChains[iterator]),
address(this),
lzPayload,
false,
abi.encodePacked(uint16(1), LZ_GAS_USAGE_LIMIT)
);
if (address(this).balance > gasRequired) {
_lzSend(
// cheapest chain = destination chainId
uint16(lowerGasChains[iterator]),
// abi.encode()d bytes
lzPayload,
// (msg.sender will be this contract) refund address
// (LayerZero will refund any extra gas back to caller of send()
payable(this),
// future param
address(0x0),
// v1 adapterParams, specify custom destination gas qty
abi.encodePacked(uint16(1), LZ_GAS_USAGE_LIMIT),
address(this).balance
);
emit TransmitToRemote(
uint16(lowerGasChains[iterator]),
mem_totalReflected
);
unchecked {
iterator = iterator + 1;
}
} else {
// abort transmissions if gas is insufficient
return;
}
}
uint256 lowestGasChainId = lowerGasChains[lowerGasChainsLen - 1];
if (lzChainId != lowestGasChainId) {
lzPayload = abi.encode(PT_TRANSMIT_AND_REQUEST, mem_totalReflected);
(uint gasRequired /* zroFee */, ) = lzEndpoint.estimateFees(
uint16(lowestGasChainId),
address(this),
lzPayload,
false,
abi.encodePacked(uint16(1), LZ_GAS_USAGE_LIMIT)
);
if (address(this).balance > gasRequired) {
// fetch the state from the lowest gas chain
_lzSend(
// destination chainId
uint16(lowestGasChainId),
// abi.encoded bytes
lzPayload,
// refund address
payable(this),
// future param
address(0x0),
// v1 adapterParams, specify custom destination gas qty
abi.encodePacked(uint16(1), LZ_GAS_USAGE_LIMIT),
address(this).balance
);
emit TransmitToRemote(
uint16(lowestGasChainId),
mem_totalReflected
);
emit RequestRemoteState(uint16(lowestGasChainId));
}
}
}
function _nonblockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual override {
uint16 packetType;
assembly {
packetType := mload(add(_payload, 32))
}
if (packetType == PT_SEND) {
// token transfers between chains
_sendAck(_srcChainId, _srcAddress, _nonce, _payload);
} else if (packetType == PT_TRANSMIT_AND_REQUEST) {
_receiveReflectionAndSendLocalState(
_srcChainId,
_payload,
true /* is request? */
);
} else if (packetType == PT_TRANSMIT) {
_receiveReflectionAndSendLocalState(
_srcChainId,
_payload,
false /* is request? */
);
} else if (packetType == PT_RESPONSE) {
_receiveRemoteReflectionState(_payload);
} else {
revert OFTCoreUnknownPacketType();
}
}
function _receiveReflectionAndSendLocalState(
uint16 _srcChainId,
bytes memory _payload,
bool isReq
) internal {
(, /* packet type */ uint remoteState) = abi.decode(
_payload,
(uint16, uint)
);
// update local reflection data
if (remoteState > totalReflected) {
uint diff = remoteState - totalReflected;
totalReflected = remoteState;
emit XReflect(diff, totalReflected);
emit ReceiveRemoteState(_srcChainId, remoteState);
}
// transmission comes from higher gas chain that wants to know local state
if (isReq) {
// pack payload AFTER integrating remote delta
bytes memory lzPayload = abi.encode(PT_RESPONSE, totalReflected);
// send response to origin chain
_lzSend(
_srcChainId, // destination chainId
lzPayload, // abi.encode()'ed bytes
payable(this), // (msg.sender will be this contract) refund address
address(0x0), // future param, unused for this example
abi.encodePacked(uint16(1), LZ_GAS_USAGE_LIMIT), // v1 adapterParams, specify custom destination gas qty
address(this).balance
);
emit AnswerToRemote(_srcChainId, totalReflected);
}
}
/**
* @notice receive response to a request made to the lowest gas chain
* @param _payload contains (uint16 packetType, uint256 remoteReflectionState)
*/
function _receiveRemoteReflectionState(bytes memory _payload) internal {
(, /* packet type */ uint remoteReflectionState) = abi.decode(
_payload,
(uint16, uint)
);
// if remote that is less recent than local state, we just ignore instead
// of throwing so L0 does not have to store failed message
if (remoteReflectionState > totalReflected) {
// integrate remote changes if they are more recent than local state (=smaller value)
uint reflectionStateDiff = remoteReflectionState - totalReflected;
if (reflectionStateDiff != 0) {
totalReflected = remoteReflectionState;
emit XReflect(reflectionStateDiff, remoteReflectionState);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./ILayerZeroUserApplicationConfigUpgradeable.sol";
interface ILayerZeroEndpointUpgradeable is ILayerZeroUserApplicationConfigUpgradeable {
// @notice send a LayerZero message to the specified address at a LayerZero endpoint.
// @param _dstChainId - the destination chain identifier
// @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
// @param _payload - a custom bytes payload to send to the destination contract
// @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
// @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
// @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
// @notice used by the messaging library to publish verified payload
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source contract (as bytes) at the source chain
// @param _dstAddress - the address on destination chain
// @param _nonce - the unbound message ordering nonce
// @param _gasLimit - the gas limit for external contract execution
// @param _payload - verified payload to send to the destination contract
function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;
// @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
// @notice get the outboundNonce from this source chain which, consequently, is always an EVM
// @param _srcAddress - the source chain contract address
function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
// @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
// @param _dstChainId - the destination chain identifier
// @param _userApplication - the user app address on this EVM chain
// @param _payload - the custom message to send over LayerZero
// @param _payInZRO - if false, user app pays the protocol fee in native token
// @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
// @notice get this Endpoint's immutable source identifier
function getChainId() external view returns (uint16);
// @notice the interface to retry failed message on this Endpoint destination
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
// @param _payload - the payload to be retried
function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;
// @notice query if any STORED payload (message blocking) at the endpoint.
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
// @notice query if the _libraryAddress is valid for sending msgs.
// @param _userApplication - the user app address on this EVM chain
function getSendLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the _libraryAddress is valid for receiving msgs.
// @param _userApplication - the user app address on this EVM chain
function getReceiveLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the non-reentrancy guard for send() is on
// @return true if the guard is on. false otherwise
function isSendingPayload() external view returns (bool);
// @notice query if the non-reentrancy guard for receive() is on
// @return true if the guard is on. false otherwise
function isReceivingPayload() external view returns (bool);
// @notice get the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _userApplication - the contract address of the user application
// @param _configType - type of configuration. every messaging library has its own convention.
function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
// @notice get the send() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getSendVersion(address _userApplication) external view returns (uint16);
// @notice get the lzReceive() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getReceiveVersion(address _userApplication) external view returns (uint16);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
interface ILayerZeroReceiverUpgradeable {
// @notice LayerZero endpoint will invoke this function to deliver the message on the destination
// @param _srcChainId - the source endpoint identifier
// @param _srcAddress - the source sending contract address from the source chain
// @param _nonce - the ordered message nonce
// @param _payload - the signed payload is the UA bytes has encoded to be sent
function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
interface ILayerZeroUserApplicationConfigUpgradeable {
// @notice set the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _configType - type of configuration. every messaging library has its own convention.
// @param _config - configuration in the bytes. can encode arbitrary content.
function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;
// @notice set the send() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setSendVersion(uint16 _version) external;
// @notice set the lzReceive() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setReceiveVersion(uint16 _version) external;
// @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
// @param _srcChainId - the chainId of the source chain
// @param _srcAddress - the contract address of the source contract at the source chain
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "../interfaces/ILayerZeroReceiverUpgradeable.sol";
import "../interfaces/ILayerZeroUserApplicationConfigUpgradeable.sol";
import "../interfaces/ILayerZeroEndpointUpgradeable.sol";
import "../../util/BytesLib.sol";
/*
* a generic LzReceiver implementation
*/
abstract contract LzAppUpgradeable is Initializable, OwnableUpgradeable, ILayerZeroReceiverUpgradeable, ILayerZeroUserApplicationConfigUpgradeable {
using BytesLib for bytes;
// ua can not send payload larger than this by default, but it can be changed by the ua owner
uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;
ILayerZeroEndpointUpgradeable public lzEndpoint;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
mapping(uint16 => uint) public payloadSizeLimitLookup;
address public precrime;
event SetPrecrime(address precrime);
event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);
function __LzAppUpgradeable_init(address _endpoint) internal onlyInitializing {
__Ownable_init_unchained();
__LzAppUpgradeable_init_unchained(_endpoint);
}
function __LzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {
lzEndpoint = ILayerZeroEndpointUpgradeable(_endpoint);
}
function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {
// lzReceive must be called by the endpoint for security
require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");
bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
// if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract");
_blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
// abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;
function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual {
bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
_checkPayloadSize(_dstChainId, _payload.length);
lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
}
function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {
uint providedGasLimit = _getGasLimit(_adapterParams);
uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;
require(minGasLimit > 0, "LzApp: minGasLimit not set");
require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low");
}
function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
assembly {
gasLimit := mload(add(_adapterParams, 34))
}
}
function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
if (payloadSizeLimit == 0) { // use default if not set
payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
}
require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large");
}
//---------------------------UserApplication config----------------------------------------
function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {
return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
}
// generic config for LayerZero user Application
function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {
lzEndpoint.setConfig(_version, _chainId, _configType, _config);
}
function setSendVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setSendVersion(_version);
}
function setReceiveVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setReceiveVersion(_version);
}
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
}
// _path = abi.encodePacked(remoteAddress, localAddress)
// this function set the trusted path for the cross-chain communication
function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner {
trustedRemoteLookup[_srcChainId] = _path;
emit SetTrustedRemote(_srcChainId, _path);
}
function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
}
function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
bytes memory path = trustedRemoteLookup[_remoteChainId];
require(path.length != 0, "LzApp: no trusted path record");
return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
}
function setPrecrime(address _precrime) external onlyOwner {
precrime = _precrime;
emit SetPrecrime(_precrime);
}
function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {
require(_minGas > 0, "LzApp: invalid minGas");
minDstGasLookup[_dstChainId][_packetType] = _minGas;
emit SetMinDstGas(_dstChainId, _packetType, _minGas);
}
// if the size is 0, it means default size limit
function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
payloadSizeLimitLookup[_dstChainId] = _size;
}
//--------------------------- VIEW FUNCTION ----------------------------------------
function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
return keccak256(trustedSource) == keccak256(_srcAddress);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint[45] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./LzAppUpgradeable.sol";
import "../../util/ExcessivelySafeCall.sol";
/*
* the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
* this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
* NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
*/
abstract contract NonblockingLzAppUpgradeable is Initializable, LzAppUpgradeable {
using ExcessivelySafeCall for address;
function __NonblockingLzAppUpgradeable_init(address _endpoint) internal onlyInitializing {
__Ownable_init_unchained();
__LzAppUpgradeable_init_unchained(_endpoint);
}
function __NonblockingLzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {}
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;
event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);
// overriding the virtual function in LzReceiver
function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
(bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));
// try-catch all errors/exceptions
if (!success) {
_storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
}
}
function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual {
failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
}
function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {
// only internal transaction
require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
//@notice override this function
function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;
function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {
// assert there is message to retry
bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
// clear the stored message
failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
// execute the message. revert if it fails again
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTCoreUpgradeable is IERC165Upgradeable {
/**
* @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
* _dstChainId - L0 defined chain id to send tokens too
* _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
* _amount - amount of the tokens to transfer
* _useZro - indicates to use zro to pay L0 fees
* _adapterParam - flexible bytes array to indicate messaging adapter services in L0
*/
function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
/**
* @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
* `_from` the owner of token
* `_dstChainId` the destination chain identifier
* `_toAddress` can be any size depending on the `dstChainId`.
* `_amount` the quantity of tokens in wei
* `_refundAddress` the address LayerZero refunds if too much message fee is sent
* `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
* `_adapterParams` is a flexible bytes array to indicate messaging adapter services
*/
function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
/**
* @dev returns the circulating amount of tokens on current chain
*/
function circulatingSupply() external view returns (uint);
/**
* @dev returns the address of the ERC20 token
*/
function token() external view returns (address);
/**
* @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
* `_nonce` is the outbound nonce
*/
event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount);
/**
* @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
* `_nonce` is the inbound nonce.
*/
event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);
event SetUseCustomAdapterParams(bool _useCustomAdapterParams);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./IOFTCoreUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
/**
* @dev Interface of the OFT standard
*/
interface IOFTUpgradeable is IOFTCoreUpgradeable, IERC20Upgradeable {
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./IOFTCoreUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import "../../lzApp/NonblockingLzAppUpgradeable.sol";
abstract contract OFTCoreUpgradeable is Initializable, NonblockingLzAppUpgradeable, ERC165Upgradeable, IOFTCoreUpgradeable {
using BytesLib for bytes;
uint public constant NO_EXTRA_GAS = 0;
// packet type
uint16 public constant PT_SEND = 0;
bool public useCustomAdapterParams;
function __OFTCoreUpgradeable_init(address _lzEndpoint) internal onlyInitializing {
__Ownable_init_unchained();
__LzAppUpgradeable_init_unchained(_lzEndpoint);
}
function __OFTCoreUpgradeable_init_unchained() internal onlyInitializing {}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return interfaceId == type(IOFTCoreUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
// mock the payload for sendFrom()
bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount);
return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
}
function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) public payable virtual override {
_send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams);
}
function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner {
useCustomAdapterParams = _useCustomAdapterParams;
emit SetUseCustomAdapterParams(_useCustomAdapterParams);
}
function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
uint16 packetType;
assembly {
packetType := mload(add(_payload, 32))
}
if (packetType == PT_SEND) {
_sendAck(_srcChainId, _srcAddress, _nonce, _payload);
} else {
revert("OFTCore: unknown packet type");
}
}
function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
_checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);
uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount);
bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount);
_lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);
emit SendToChain(_dstChainId, _from, _toAddress, amount);
}
function _sendAck(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual {
(, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint));
address to = toAddressBytes.toAddress(0);
amount = _creditTo(_srcChainId, to, amount);
emit ReceiveFromChain(_srcChainId, to, amount);
}
function _checkAdapterParams(uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas) internal virtual {
if (useCustomAdapterParams) {
_checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas);
} else {
require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty.");
}
}
function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount) internal virtual returns(uint);
function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual returns(uint);
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./ILayerZeroUserApplicationConfig.sol";
interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
// @notice send a LayerZero message to the specified address at a LayerZero endpoint.
// @param _dstChainId - the destination chain identifier
// @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
// @param _payload - a custom bytes payload to send to the destination contract
// @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
// @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
// @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
// @notice used by the messaging library to publish verified payload
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source contract (as bytes) at the source chain
// @param _dstAddress - the address on destination chain
// @param _nonce - the unbound message ordering nonce
// @param _gasLimit - the gas limit for external contract execution
// @param _payload - verified payload to send to the destination contract
function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;
// @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
// @notice get the outboundNonce from this source chain which, consequently, is always an EVM
// @param _srcAddress - the source chain contract address
function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
// @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
// @param _dstChainId - the destination chain identifier
// @param _userApplication - the user app address on this EVM chain
// @param _payload - the custom message to send over LayerZero
// @param _payInZRO - if false, user app pays the protocol fee in native token
// @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
// @notice get this Endpoint's immutable source identifier
function getChainId() external view returns (uint16);
// @notice the interface to retry failed message on this Endpoint destination
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
// @param _payload - the payload to be retried
function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;
// @notice query if any STORED payload (message blocking) at the endpoint.
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
// @notice query if the _libraryAddress is valid for sending msgs.
// @param _userApplication - the user app address on this EVM chain
function getSendLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the _libraryAddress is valid for receiving msgs.
// @param _userApplication - the user app address on this EVM chain
function getReceiveLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the non-reentrancy guard for send() is on
// @return true if the guard is on. false otherwise
function isSendingPayload() external view returns (bool);
// @notice query if the non-reentrancy guard for receive() is on
// @return true if the guard is on. false otherwise
function isReceivingPayload() external view returns (bool);
// @notice get the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _userApplication - the contract address of the user application
// @param _configType - type of configuration. every messaging library has its own convention.
function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
// @notice get the send() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getSendVersion(address _userApplication) external view returns (uint16);
// @notice get the lzReceive() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getReceiveVersion(address _userApplication) external view returns (uint16);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface ILayerZeroUserApplicationConfig {
// @notice set the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _configType - type of configuration. every messaging library has its own convention.
// @param _config - configuration in the bytes. can encode arbitrary content.
function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;
// @notice set the send() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setSendVersion(uint16 _version) external;
// @notice set the lzReceive() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setReceiveVersion(uint16 _version) external;
// @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
// @param _srcChainId - the chainId of the source chain
// @param _srcAddress - the contract address of the source contract at the source chain
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}// SPDX-License-Identifier: Unlicense /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } }
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.7.6;
library ExcessivelySafeCall {
uint256 constant LOW_28_MASK =
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := call(
_gas, // gas
_target, // recipient
0, // ether value
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeStaticCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal view returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := staticcall(
_gas, // gas
_target, // recipient
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/**
* @notice Swaps function selectors in encoded contract calls
* @dev Allows reuse of encoded calldata for functions with identical
* argument types but different names. It simply swaps out the first 4 bytes
* for the new selector. This function modifies memory in place, and should
* only be used with caution.
* @param _newSelector The new 4-byte selector
* @param _buf The encoded contract args
*/
function swapSelector(bytes4 _newSelector, bytes memory _buf)
internal
pure
{
require(_buf.length >= 4);
uint256 _mask = LOW_28_MASK;
assembly {
// load the first word of
let _word := mload(add(_buf, 0x20))
// mask out the top 4 bytes
// /x
_word := and(_word, _mask)
_word := or(_newSelector, _word)
mstore(add(_buf, 0x20), _word)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.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.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;
// import "hardhat/console.sol";
struct ListElement {
uint data;
bytes32 pointer;
}
struct SingleLinkedList {
uint length;
ListElement head;
mapping(bytes32 => ListElement) elements;
}
library SingleLinkedListLib {
error CannotReplaceHead();
bytes32 constant ZERO_POINTER = keccak256(abi.encode(0));
function addNode(SingleLinkedList storage self, uint data, uint position) internal {
if(position == 0 && self.length != 0) revert CannotReplaceHead();
ListElement memory element = ListElement({data: data, pointer: ZERO_POINTER});
bytes32 elementHash = keccak256(abi.encode(data));
if(self.length == 0)
{
self.head = element;
self.elements[elementHash] = element;
}
else if(position >= self.length)
{
// find tail = element with a zero pointer
ListElement storage toCheck = self.head;
while(toCheck.pointer != ZERO_POINTER)
{
toCheck = self.elements[toCheck.pointer];
}
toCheck.pointer = elementHash; /* pointer to new element */
self.elements[elementHash] = element;
}
else
{
ListElement storage toCheck = self.head;
uint iterator;
while(iterator < position)
{
toCheck = self.elements[toCheck.pointer];
unchecked { iterator = iterator + 1; }
}
// after loop executed, iterator is position
// toCheck is predecessor
bytes32 oldPointer = toCheck.pointer;
toCheck.pointer = elementHash;
element.pointer = oldPointer;
self.elements[elementHash] = element;
}
self.length = self.length + 1;
}
function removeNode(SingleLinkedList storage self, uint data) internal {
// TODO
}
function getBeheadedList(SingleLinkedList storage self) internal view returns(uint[] memory) {
uint toReturnLen = self.length-1;
uint[] memory beheadedList = new uint[](self.length-1);
ListElement memory e = self.head;
for(uint iterator; iterator < toReturnLen;)
{
e = self.elements[e.pointer];
beheadedList[iterator] = e.data;
unchecked { iterator = iterator + 1; }
}
return beheadedList;
}
}{
"optimizer": {
"enabled": true,
"runs": 1
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotReplaceHead","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"InsuffcientBalance","type":"error"},{"inputs":[],"name":"InvalidParameters","type":"error"},{"inputs":[],"name":"MaxTransaction","type":"error"},{"inputs":[],"name":"MaxWallet","type":"error"},{"inputs":[],"name":"OFTCoreUnknownPacketType","type":"error"},{"inputs":[{"internalType":"uint256","name":"remoteState","type":"uint256"}],"name":"RemoteStateOutOfSync","type":"error"},{"inputs":[],"name":"TransfersDisabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"remoteChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"answer","type":"uint256"}],"name":"AnswerToRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LaunchFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","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":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"sourceChain","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"receivedRemoteState","type":"uint256"}],"name":"ReceiveRemoteState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"baseAmountReflected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalReflected","type":"uint256"}],"name":"Reflect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"requestedChain","type":"uint16"}],"name":"RequestRemoteState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"destinationChain","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"totalReflections","type":"uint256"}],"name":"TransmitToRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"baseAmountReflected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalReflected","type":"uint256"}],"name":"XReflect","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_RESPONSE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_TRANSMIT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_TRANSMIT_AND_REQUEST","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V2_ROUTER","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesForChain","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"}],"name":"baseToReflectionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint8","name":"reflection","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"omnichain","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"referral","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"buyback","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint128","name":"total","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chains","outputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"components":[{"internalType":"uint256","name":"data","type":"uint256"},{"internalType":"bytes32","name":"pointer","type":"bytes32"}],"internalType":"struct ListElement","name":"head","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"reflection","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"omnichain","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"referral","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"buyback","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint128","name":"total","type":"uint128"}],"internalType":"struct ScaleV1_2.Fee","name":"_buyFee","type":"tuple"},{"components":[{"internalType":"uint8","name":"reflection","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"omnichain","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"referral","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"buyback","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint128","name":"total","type":"uint128"}],"internalType":"struct ScaleV1_2.Fee","name":"_sellFee","type":"tuple"}],"name":"changeFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"circulatingBaseSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"clearStuckToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crossChainReflectionsEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPBurnInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWalletAndTx","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"newMarketingFeeReceiver","type":"address"},{"internalType":"address","name":"newLPfeeReceiver","type":"address"},{"internalType":"address","name":"newBuyBackFeeReceiver","type":"address"},{"internalType":"address","name":"newTreasuryReceiver","type":"address"},{"internalType":"address","name":"newLPBurnReceiver","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpointUpgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manuallyBurnLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionAmount","type":"uint256"}],"name":"reflectionToBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"data","type":"uint256"}],"name":"removeChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint8","name":"reflection","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"omnichain","type":"uint8"},{"internalType":"uint8","name":"treasury","type":"uint8"},{"internalType":"uint8","name":"referral","type":"uint8"},{"internalType":"uint8","name":"lp","type":"uint8"},{"internalType":"uint8","name":"buyback","type":"uint8"},{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint128","name":"total","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStartingTime","type":"uint256"},{"internalType":"uint256","name":"newDuration","type":"uint256"},{"internalType":"uint256","name":"newTargetValue","type":"uint256"}],"name":"setEmissionRateChange","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"toExclude","type":"address"},{"internalType":"uint256","name":"targetValue","type":"uint256"}],"name":"setExcludeFromLimits","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingFeeReceiver","type":"address"},{"internalType":"address","name":"newLPfeeReceiver","type":"address"},{"internalType":"address","name":"newBuybackFeeReceiver","type":"address"},{"internalType":"address","name":"newTreasuryReceiver","type":"address"},{"internalType":"address","name":"newLPBurnReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"state","type":"uint256"}],"name":"setIsEcosystemContract","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBurnRewardRate","type":"uint256"},{"internalType":"uint256","name":"newBurnTimeDiffCap","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setLPBurnData","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"state","type":"uint256"}],"name":"setRegistredPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newtransfersEnabled","type":"uint256"},{"internalType":"uint256","name":"newFeesEnabled","type":"uint256"},{"internalType":"uint256","name":"newSwapThreshold","type":"uint256"},{"internalType":"uint256","name":"newCrossChainReflectionsEnabled","type":"uint256"},{"internalType":"uint256","name":"newLimitsEnabled","type":"uint256"},{"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"},{"internalType":"uint8","name":"chainListPosition","type":"uint8"}],"name":"setTrustedRemoteWithInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a0346200008e57601f62005f6d38819003918201601f19168301916001600160401b0383118484101762000093578084926020946040528339810103126200008e57516001600160a01b038116908190036200008e57608052604051615ec39081620000aa82396080518181816113d2015281816123e10152818161499a01528181614c1c0152614e5b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80621d3567146104e557806301ffc9a7146104e05780630445b667146104db57806306fdde03146104d657806307e0db17146104d1578063095ea7b3146104cc5780630df37483146104c75780630fa451dd146104c257806310ddb137146104bd57806318160ddd146104b857806318abb635146104b357806323b872dd146104ae5780632a205e3d146104a95780632b14ca56146104a4578063313ce5671461049f578063364333f41461049a5780633732e214146104955780633d8b38f6146104905780633e8511201461048b5780633f1f4fa41461048657806342d65a8d146104815780634477051514610468578063470624021461047c57806347a5051714610477578063483d9dbf146104725780634bc853cf1461046d5780634c42899a14610468578063519056361461046357806351c6590a1461045e57806352d70bdb14610459578063536efe8b14610454578063571ac8b01461044f57806358a8b85f1461044a5780635b8c41e61461044557806362907a1814610440578063631166b81461043b57806366ad5c8a1461043657806370a0823114610431578063715018a61461042c57806371dd1f37146104275780637533d788146104225780638cfd8f5c1461041d5780638da5cb5b146104185780639358928b14610413578063950c8a741461040e5780639569290a1461040957806395d89b411461040457806397c3af0f146103ff5780639db986b2146103fa5780639f38369a146103f5578063a64e4f8a146103f0578063a6c3d165146103eb578063a81a85e7146103e6578063a82ed9ec146103e1578063a9059cbb146103dc578063b353aaa7146103d7578063baf3292d146103d2578063bef97c87146103cd578063c4461834146103c8578063c584075b146103c3578063cbed8b9c146103be578063cbf50bb6146103b9578063cc2a9a5b146103b4578063cd0ab1c1146103af578063d1deba1f146103aa578063d85a2828146103a5578063dd62ed3e146103a0578063df2a5b3b1461039b578063e0927fa514610396578063eab45d9c14610391578063eb8d72b71461038c578063ed629c5c14610387578063f06b6c1a14610382578063f2fde38b1461037d578063f5ecbdbc14610378578063f9a3dbdd146103735763fc0c546a0361000e57612dbe565b612da0565b612ce5565b612c54565b612bd9565b612bb6565b612a90565b612a2e565b612a12565b612925565b6128da565b6128a1565b61277a565b61275e565b612638565b612624565b612556565b61251b565b6124fe565b6124df565b61246f565b612446565b612410565b6123cb565b6123af565b612285565b612266565b6121bc565b612163565b611fe6565b611f7e565b611f60565b611f37565b611eab565b611e82565b611e27565b611dda565b611b54565b611afd565b611ab7565b611973565b61193d565b6118fe565b611865565b61178d565b61165b565b61163f565b611620565b61132e565b611117565b610f17565b611016565b610fd7565b610f99565b610f33565b610eac565b610e73565b610e34565b610de9565b610d92565b610d64565b610d48565b610ce2565b610bfd565b610ae7565b610a0f565b6109ea565b61097e565b61093a565b6108fb565b61087d565b6107dc565b610786565b61070b565b610680565b61058d565b61ffff8116036104f657565b600080fd5b9181601f840112156104f6578235916001600160401b0383116104f657602083818601950101116104f657565b9060806003198301126104f657600435610541816104ea565b916001600160401b03906024358281116104f65781610562916004016104fb565b9390939260443581811681036104f657926064359182116104f657610589916004016104fb565b9091565b346104f65761059b36610528565b919294939060018060a01b0360655416330361063b5761060061060892610019976105f96105df6105da8a61ffff166000526066602052604060002090565b611d36565b8051908184149182610631575b508161060e575b50612dd9565b36916117f1565b9236916117f1565b92613033565b905061061b3684866117f1565b60208151910120906020815191012014386105f3565b15159150386105ec565b60405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200006044820152606490fd5b346104f65760203660031901126104f65760043563ffffffff60e01b81168091036104f65780602091159081156106ef575b81156106c4575b506040519015158152f35b630a72677560e11b8114915081156106de575b50386106b9565b6301ffc9a760e01b149050386106d7565b6336372b0760e01b811491506106b2565b60009103126104f657565b346104f65760003660031901126104f657602061013354604051908152f35b60005b83811061073d5750506000910152565b818101518382015260200161072d565b906020916107668151809281855285808601910161072a565b601f01601f1916010190565b90602061078392818152019061074d565b90565b346104f65760003660031901126104f6576107d86040516107a6816116c3565b60118152705363616c65582e6767207c205363616c6560781b602082015260405191829160208352602083019061074d565b0390f35b346104f6576000602036600319011261085d576004356107fb816104ea565b6108036137e3565b6065546001600160a01b0316908290823b1561085957602461ffff918360405195869485936307e0db1760e01b85521660048401525af1801561085457610848575080f35b610851906116ab565b80f35b612e9b565b5080fd5b80fd5b6001600160a01b031690565b6001600160a01b038116036104f657565b346104f65760403660031901126104f65760043561089a8161086c565b602435903360005261014a602052816108b78260406000206139eb565b556040519182526001600160a01b03169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590602090a3602060405160018152f35b346104f65760403660031901126104f65761ffff60043561091b816104ea565b6109236137e3565b166000526068602052602435604060002055600080f35b346104f65760003660031901126104f657606061013254151561095f610139546141cc565b61096b61013a546141cc565b9060405192835260208301526040820152f35b346104f6576000602036600319011261085d5760043561099d816104ea565b6109a56137e3565b6065546001600160a01b0316908290823b1561085957602461ffff918360405195869485936310ddb13760e01b85521660048401525af1801561085457610848575080f35b346104f65760003660031901126104f657602060405169d3c21bcecceda10000008152f35b60a03660031901126104f657600435610a278161086c565b60243590610a348261086c565b604435610a408161086c565b60643590610a4d8261086c565b60843593610a5a8561086c565b610a626137e3565b6001600160a01b0393841680610acd575b50838116610abe575b50828116610aaf575b50818116610aa0575b508116610a9757005b61001990613011565b610aa990612fef565b38610a8e565b610ab890612fcd565b38610a85565b610ac790612fab565b38610a7c565b61014080546001600160a01b031916909117905538610a73565b346104f65760603660031901126104f657600435610b048161086c565b60243590610b118261086c565b6044359060018060a01b0381168060005261014a90816020526040600020610b3d6000199133906139eb565b5403610b64575b6107d8610b528587866146aa565b60405190151581529081906020820190565b60005260205281610b793360406000206139eb565b5410610bbc57906107d892610b5292610ba483610b9e33610b998561397f565b6139eb565b54612f9e565b610bb133610b998461397f565b559192819450610b44565b9050610be8610bce33610b998461397f565b54604051637f12200160e01b8152938493600485016140d0565b0390fd5b908152602081019190915260400190565b346104f65760a03660031901126104f657600435610c1a816104ea565b6001600160401b03906024358281116104f657610c3b9036906004016104fb565b916064359081151582036104f6576084359485116104f657610c64610c709536906004016104fb565b949093604435926132c1565b906107d860405192839283610bec565b6001600160801b031690565b60ff9182168152918116602083015291821660408201529181166060830152918216608082015291811660a083015291821660c0820152911660e08201526001600160801b039091166101008201526101200190565b346104f65760003660031901126104f6576107d86101465460405191829160ff9060018060801b038160401c1691808260381c1691818160301c1691808260281c1691818160201c1691808260181c1691818160101c1691808260081c1691168a610c8c565b346104f65760003660031901126104f657602060405160128152f35b60008060031936011261085d57610d796137e3565b8080808047335af1610d89614283565b501561085d5780f35b346104f65760003660031901126104f657602061013454604051908152f35b9060406003198301126104f657600435610dca816104ea565b91602435906001600160401b0382116104f657610589916004016104fb565b346104f657602061ffff610e25610dff36610db1565b9390911660005260668452610e176040600020611d36565b8481519101209236916117f1565b82815191012014604051908152f35b60403660031901126104f657600435610e4c8161086c565b610e546137e3565b6001600160a01b03166000908152610147602052604090206024359055005b346104f65760203660031901126104f65761ffff600435610e93816104ea565b1660005260686020526020604060002054604051908152f35b346104f657610eba36610db1565b610ec59291926137e3565b6065546000938492916001600160a01b031690813b15610f135783610f0195604051968795869485936342d65a8d60e01b855260048501612ec8565b03925af1801561085457610848575080f35b8380fd5b346104f65760003660031901126104f657602060405160008152f35b346104f65760003660031901126104f6576107d86101455460405191829160ff9060018060801b038160401c1691808260381c1691818160301c1691808260281c1691818160201c1691808260181c1691818160101c1691808260081c1691168a610c8c565b346104f65760203660031901126104f657600435610fb68161086c565b60018060a01b03166000526101486020526020604060002054604051908152f35b60403660031901126104f657600435610fef8161086c565b610ff76137e3565b6001600160a01b03166000908152610150602052604090206024359055005b60e03660031901126104f65761001960c4356110ac60a4356004356110396137e3565b610135548015159081611105575b50156110c65750611059600161014c55565b61106560243561013255565b61107160843561013855565b61107d60643561014b55565b61108960443561013355565b6903635c9adc5dea000000811015806110b2575b6110a6906142b3565b61013955565b61013a55565b5069021e19e0c9bab240000083101561109d565b6110da9061014c5481116110df5761014c55565b611059565b6110e94261013555565b6110f34261013b55565b6110ff6107d061013d55565b61014c55565b61110f915061361a565b421138611047565b60e03660031901126104f65760043561112f8161086c565b6024359061113c826104ea565b6001600160401b036044358181116104f65761115c9036906004016104fb565b9190926084359161116c8361086c565b60a435936111798561086c565b60c4359182116104f6576111a16111976111a99336906004016104fb565b97909236916117f1565b9536916117f1565b9160ff60fb54166000146112b457602283511061127057600080516020615dae8339815191529361125461126b9285611219602261ffff980151888c166000526067602052611205604060002060008052602052604060002090565b5490611212821515613653565b101561369c565b611225606435876140f2565b93849261124c8b61123e60405196879260208401613388565b03601f198101865285611730565b34938c6134ff565b60405193849360018060a01b0316971695836133ab565b0390a3005b60405162461bcd60e51b815260206004820152601c60248201527b4c7a4170703a20696e76616c69642061646170746572506172616d7360201b6044820152606490fd5b82516112da57600080516020615dae8339815191529361125461126b9261ffff95611219565b60405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608490fd5b6020806003193601126104f6576113436137e3565b6101315460101c60ff166104f657610131805462ff00001916620100001790556113796113716004356138fd565b612710900490565b9061138d826113873061399a565b54613646565b6113963061399a565b556040518281526000929030908490600080516020615e0e83398151915290602090a360405163c45a015560e01b81526001600160a01b0391907f00000000000000000000000000000000000000000000000000000000000000008316908481600481855afa908115610854578691611603575b506040516315ab88c960e31b81528581600481865afa9182156108545786926114689289916115e6575b506040516364e329cb60e11b81523060048201526001600160a01b03909116602482015295869283918a9183906044820190565b0393165af193841561085457611519946060946114aa9288926115b9575b505061013f80546001600160a01b0319166001600160a01b03909216919091179055565b6114c16114ba82610b993061397f565b6000199055565b6114cd61014354610860565b60405163f305d71960e01b81523060048201526024810184905260448101939093523460648401526001600160a01b031660848301524260a483015290928391908290819060c4820190565b039134905af180156108545761158b575b5061154861154261153d61013f54610860565b6139b5565b60019055565b611553600161013255565b61155d4261013555565b6115674261013b55565b6115736107d061013d55565b61157e600061013c55565b6108516201518061013e55565b6115ab9060603d81116115b2575b6115a38183611730565b8101906140b5565b505061152a565b503d611599565b6115d89250803d106115df575b6115d08183611730565b8101906140a0565b3880611486565b503d6115c6565b6115fd9150843d86116115df576115d08183611730565b38611434565b61161a9150853d87116115df576115d08183611730565b3861140a565b346104f65760003660031901126104f657602061014b54604051908152f35b60003660031901126104f6576116536137e3565b610019615061565b346104f65760203660031901126104f6576004356116788161086c565b3360005261014a60205260001990816108b78260406000206139eb565b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116116be57604052565b611695565b604081019081106001600160401b038211176116be57604052565b606081019081106001600160401b038211176116be57604052565b61012081019081106001600160401b038211176116be57604052565b60c081019081106001600160401b038211176116be57604052565b601f909101601f19168101906001600160401b038211908210176116be57604052565b60405190611760826116f9565b565b60405190611760826116c3565b9060405161177c816116c3565b602060018294805484520154910152565b346104f65760003660031901126104f657606061012d546040516117b0816116c3565b61012e54815261012f549060208101918252604051928352516020830152516040820152f35b6001600160401b0381116116be57601f01601f191660200190565b9291926117fd826117d6565b9161180b6040519384611730565b8294818452818301116104f6578281602093846000960137010152565b60209061184292826040519483868095519384920161072a565b82019081520301902090565b9060018060401b0316600052602052604060002090565b346104f65760603660031901126104f657600435611882816104ea565b6001600160401b036024358181116104f657366023820112156104f6576118b39036906024816004013591016117f1565b9060443590811681036104f6576118e86118ed926118e26107d89561ffff166000526097602052604060002090565b90611828565b61184e565b546040519081529081906020820190565b60403660031901126104f6576004356119168161086c565b61191e6137e3565b6001600160a01b03166000908152610149602052604090206024359055005b60603660031901126104f6576119516137e3565b61195c6040516116de565b60043561014d5560243561014e5560443561014f55005b346104f65761198136610528565b915091303303611a63576119a29361199a9136916117f1565b5036916117f1565b906020820161ffff81511680156000146119c257505090610019916157f7565b600181036119d657505090610019916159cb565b600281036119ea575050906100199161594a565b909150600303611a5157602082611a04935101019061592b565b9050610134908154808211611a1557005b80820390828211611a4c5782146100195781600080516020615e4e8339815191529355611a4760405192839283610bec565b0390a1005b612f58565b60405163a0e89db160e01b8152600490fd5b60405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608490fd5b346104f65760203660031901126104f657600435611ad48161086c565b60018060a01b03166000526101486020526020611af56040600020546141cc565b604051908152f35b346104f65760008060031936011261085d57611b176137e3565b603380546001600160a01b0319811690915581906001600160a01b0316600080516020615dce8339815191528280a380f35b60ff8116036104f657565b60603660031901126104f657600435611b6c816104ea565b6001600160401b036024358181116104f657611b8c9036906004016104fb565b9260ff604435611b9b81611b49565b611ba36137e3565b1680611ce8575b506040519260209084611bc1308887868501612f37565b03611bd4601f1991828101885287611730565b60009561ffff8516875260668452604087209381519384116116be57611c0484611bfe8754611cfc565b87612ee3565b8092601f8511600114611c655750509180611c549492889994600080516020615d6e8339815191529992611c5a575b50508160011b916000199060031b1c19161790555b60405193849384612ec8565b0390a180f35b015190503880611c33565b849392919316611c7a86600052602060002090565b9389905b828210611cd0575050926001928592600080516020615d6e8339815191529a9b96611c54989610611cb7575b505050811b019055611c48565b015160001960f88460031b161c19169055388080611caa565b80600186978294978701518155019601940190611c7e565b611cf69061ffff8316615b06565b38611baa565b90600182811c92168015611d2c575b6020831014611d1657565b634e487b7160e01b600052602260045260246000fd5b91607f1691611d0b565b9060405191826000825492611d4a84611cfc565b908184526001948581169081600014611db75750600114611d74575b505061176092500383611730565b9093915060005260209081600020936000915b818310611d9f57505061176093508201013880611d66565b85548884018501529485019487945091830191611d87565b91505061176094506020925060ff191682840152151560051b8201013880611d66565b346104f65760203660031901126104f65761ffff600435611dfa816104ea565b1660005260666020526107d8611e136040600020611d36565b60405191829160208352602083019061074d565b346104f65760403660031901126104f6576020611e79600435611e49816104ea565b61ffff60243591611e59836104ea565b166000526067835260406000209061ffff16600052602052604060002090565b54604051908152f35b346104f65760003660031901126104f6576033546040516001600160a01b039091168152602090f35b346104f65760008060031936011261085d5761dead81526101489081602052611ed760408220546141cc565b69d3c21bcecceda10000009181830393838511611a4c578160409181611f02945260205220546141cc565b01808203928311611a4c5761013454019003908111611a4c57611f276107d8916141cc565b6040519081529081906020820190565b346104f65760003660031901126104f6576069546040516001600160a01b039091168152602090f35b346104f65760203660031901126104f6576020611af56004356141cc565b346104f65760003660031901126104f6576107d8604051611f9e816116c3565b60018152605360f81b602082015260405191829160208352602083019061074d565b6101209060031901126104f657600490565b610120906101231901126104f65761012490565b6102403660031901126104f657611ffc36611fc0565b61200536611fd2565b61200d6137e3565b6120a361209461208561207661206761205861204961203461202e8a6142ba565b60ff1690565b61204361202e60208c016142ba565b906142c4565b61204361202e60408b016142ba565b61204361202e60608a016142ba565b61204361202e608089016142ba565b61204361202e60a088016142ba565b61204361202e60c087016142ba565b61204361202e60e086016142ba565b6120c461209461208561207661206761205861204961203461202e8a6142ba565b90610100916120dc6120d78487016142dd565b610c80565b6001600160801b0392831690811480159490612146575b50831561213a575b50821561212c575b505061211a57612115610019926142f1565b614394565b604051630e52390960e41b8152600490fd5b6105dc925016113880612103565b6105dc109250386120fb565b6121579194506120d79086016142dd565b828216141592386120f3565b60603660031901126104f65760443560043561217e8261086c565b6121866137e3565b612710811161211a5761013c5561014480546001600160a01b0319166001600160a01b0390921691909117905560243561013e55005b346104f65760203660031901126104f65761ffff6004356121dc816104ea565b1660005260666020526121f26040600020611d36565b805115612221578051601319810191908211611a4c576107d89161221591613763565b60405191829182610772565b60405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606490fd5b346104f65760003660031901126104f657602061013254604051908152f35b346104f65761229336610db1565b919061229d6137e3565b60405191602092806122b3308786888501612f37565b03936122c7601f1995868101845283611730565b60009461ffff8416865260668252604086209280519260018060401b0384116116be576122f884611bfe8754611cfc565b8092601f85116001146123465750509180611c549492889994600080516020615d6e8339815191529992611c5a5750508160011b916000199060031b1c191617905560405193849384612ec8565b84939291931661235b86600052602060002090565b9389905b828210612397575050926001928592600080516020615d6e8339815191529a9b96611c54989610611cb757505050811b019055611c48565b8060018697829497870151815501960194019061235f565b346104f65760003660031901126104f657602060405160038152f35b346104f65760003660031901126104f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104f65760403660031901126104f657602061243c6004356124328161086c565b60243590336146aa565b6040519015158152f35b346104f65760003660031901126104f6576065546040516001600160a01b039091168152602090f35b346104f65760203660031901126104f6577f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b60206004356124af8161086c565b6124b76137e3565b606980546001600160a01b0319166001600160a01b03929092169182179055604051908152a1005b346104f65760003660031901126104f657602061014c54604051908152f35b346104f65760003660031901126104f65760206040516127108152f35b346104f65760003660031901126104f657608061013d5461013b5461013c5461013e5491604051938452602084015260408301526060820152f35b346104f65760803660031901126104f657600435612573816104ea565b60243561257f816104ea565b6064356001600160401b0381116104f65761259e9036906004016104fb565b90926125a86137e3565b6065546001600160a01b031690813b156104f65760008094612601604051978896879586946332fb62e760e21b865261ffff80921660048701521660248501526044356044850152608060648501526084840191612ea7565b03925af180156108545761261157005b8061261e610019926116ab565b80610700565b60203660031901126104f6576100196137e3565b60c03660031901126104f6576004356126508161086c565b6126d260243561265f8161086c565b60443561266b8161086c565b6064356126778161086c565b608435916126848361086c565b60a435936126918561086c565b600054966126b660ff8960081c16158099819a612750575b8115612730575b50613872565b876126c9600160ff196000541617600055565b61271757613d3e565b6126d857005b6126e861ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61272b61010061ff00196000541617600055565b613d3e565b303b15915081612742575b50386126b0565b6001915060ff16143861273b565b600160ff82161091506126a9565b346104f65760003660031901126104f657602060405160028152f35b61278336610528565b9161ffff869492961660005260976020526127b781604060002060206040518092878b83378782019081520301902061184e565b54918215612850577fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e596611a47946128449161283e916000612832876118e88d8961282c8f6128188f61280b368c8e6117f1565b60208151910120146131d8565b61ffff166000526097602052604060002090565b916131bf565b5561199a36868c6117f1565b86615753565b6040519586958661322e565b60405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608490fd5b60008060031936011261085d576128b66137e3565b3081526101486020526128d66128cf60408320546141cc565b33306146aa565b5080f35b346104f65760403660031901126104f6576020611e796004356128fc8161086c565b602435906129098261086c565b6001600160a01b0316600090815261014a8452604090206139eb565b346104f65760603660031901126104f657600435612942816104ea565b60243561294e816104ea565b6044359161295a6137e3565b82156129d557611a477f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09361ffff83166000526067602052806129af8560406000209061ffff16600052602052604060002090565b556040519384938460409194939294606082019561ffff80921683521660208201520152565b60405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606490fd5b346104f65760003660031901126104f657602060405160018152f35b346104f65760203660031901126104f6576004358015158091036104f65760207f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a491612a786137e3565b60ff1960fb541660ff82161760fb55604051908152a1005b346104f657612a9e36610db1565b9190612aa86137e3565b60009161ffff81168352602060668152604084209060018060401b0386116116be57612ade86612ad88454611cfc565b84612ee3565b8490601f8711600114612b34575094611c5491818697600080516020615e6e8339815191529791612b29575b508260011b906000198460031b1c191617905560405193849384612ec8565b905085013538612b0a565b90601f198716612b4984600052602060002090565b9287905b828210612b9e57505091611c54939188600080516020615e6e83398151915298999410612b84575b5050600182811b019055611c48565b860135600019600385901b60f8161c191690553880612b75565b80600185968294968b01358155019501930190612b4d565b346104f65760003660031901126104f657602060ff60fb54166040519015158152f35b346104f65760008060031936011261085d5761dead81526101489081602052612c0560408220546141cc565b69d3c21bcecceda10000009181830393838511611a4c578160409181612c30945260205220546141cc565b01808203928311611a4c5761013454019003908111611a4c57604051908152602090f35b346104f65760203660031901126104f657600435612c718161086c565b612c796137e3565b6001600160a01b03811615612c91576100199061383b565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104f65760803660031901126104f657600435612d02816104ea565b600060243591612d11836104ea565b612d1c60443561086c565b606554604051633d7b2f6f60e21b815261ffff92831660048201529390911660248401523060448401526064803590840152829060849082906001600160a01b03165afa8015610854576107d891600091612d7f575b5060405191829182610772565b612d9a913d8091833e612d928183611730565b810190612e76565b38612d72565b346104f65760203660031901126104f6576020611af560043561422a565b346104f65760003660031901126104f6576020604051308152f35b15612de057565b60405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b81601f820112156104f6578051612e4a816117d6565b92612e586040519485611730565b818452602082840101116104f657610783916020808501910161072a565b906020828203126104f65781516001600160401b0381116104f6576107839201612e34565b6040513d6000823e3d90fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60409061ffff61078395931681528160208201520191612ea7565b90601f8111612ef157505050565b600091825260208220906020601f850160051c83019410612f2d575b601f0160051c01915b828110612f2257505050565b818155600101612f16565b9092508290612f0d565b826014949392823760609290921b6001600160601b03191691019081520190565b634e487b7160e01b600052601160045260246000fd5b9062015180918203918211611a4c57565b90612710918203918211611a4c57565b600019810191908211611a4c57565b91908203918211611a4c57565b61014180546001600160a01b0319166001600160a01b03909216919091179055565b61014280546001600160a01b0319166001600160a01b03909216919091179055565b61014380546001600160a01b0319166001600160a01b03909216919091179055565b61014480546001600160a01b0319166001600160a01b03909216919091179055565b9290915a604051633356ae4560e11b6020820190815261ffff8716602483015260806044830152949161309f8261309161307060a483018761074d565b6001600160401b03881660648401528281036023190160848401528861074d565b03601f198101845283611730565b60008091604051976130b089611715565b609689528260208a019560a036883751923090f1903d90609682116130f7575b6000908288523e156130e4575b5050505050565b6130ed94613100565b38808080806130dd565b609691506130d0565b91936131ac7fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c956131ba939561ffff815160208301209616958660005260976020526131728361316460208b6040600020826040519483868095519384920161072a565b82019081520301902061184e565b5561318f604051978897885260a0602089015260a088019061074d565b6001600160401b039092166040870152858203606087015261074d565b90838203608085015261074d565b0390a1565b6020919283604051948593843782019081520301902090565b156131df57565b60405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608490fd5b9160609361ffff6132519398979698168452608060208501526080840191612ea7565b6001600160401b0390951660408201520152565b91908260409103126104f6576020825192015190565b91926107839694959361ffff6132ac9316845260018060a01b0316602084015260a0604084015260a083019061074d565b93151560608201526080818503910152612ea7565b969591949693929361330460409687966132f088519586936000602086015260608b8601526080850191612ea7565b90606083015203601f198101845283611730565b61333961331a613315606554610860565b610860565b938651998a968795869563040a7bb160e41b875230906004880161327b565b03915afa928315610854576000918294613354575b50509190565b61337893945080919250903d10613381575b6133708183611730565b810190613265565b9190388061334e565b503d613366565b9291906133a66040916000865260606020870152606086019061074d565b930152565b9291906133a660209160408652604086019061074d565b156133c957565b60405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608490fd5b919390929361ffff831690600095828752606660205261346161344c60408920611d36565b95613459875115156133c2565b8751906135ab565b6065546001600160a01b039081169690873b156134fb57926134b39694926134e1926134c69a9997956040519b8c9a8b998a9862c5803160e81b8a5260048a015260c060248a015260c489019061074d565b60031993848983030160448a015261074d565b931660648601528960848601528483030160a485015261074d565b03925af18015610854576134f25750565b611760906116ab565b8880fd5b90939461ffff821680600052606660205261352d6135206040600020611d36565b93613459855115156133c2565b6065546001600160a01b039590861694853b156104f65761359098600098886134e19461357d9a6040519d8e9c8d9b8c9a62c5803160e81b8c5260048c015260c060248c015260c48b019061074d565b60031995868b83030160448c015261074d565b951660648801521660848601528483030160a485015261074d565b61ffff166000526068602052604060002054908115613610575b116135cc57565b606460405162461bcd60e51b815260206004820152602060248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152fd5b61271091506135c5565b90620151808201809211611a4c57565b90601f8201809211611a4c57565b9060018201809211611a4c57565b91908201809211611a4c57565b1561365a57565b60405162461bcd60e51b815260206004820152601a602482015279131e905c1c0e881b5a5b91d85cd31a5b5a5d081b9bdd081cd95d60321b6044820152606490fd5b156136a357565b60405162461bcd60e51b815260206004820152601b60248201527a4c7a4170703a20676173206c696d697420697320746f6f206c6f7760281b6044820152606490fd5b156136ed57565b60405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606490fd5b1561372a57565b60405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606490fd5b613777826137708161362a565b10156136e6565b6137848282511015613723565b8161379c575050604051600081526020810160405290565b60405191601f811691821560051b808486010193838501920101905b8084106137d05750508252601f01601f191660405290565b90928351815260208091019301906137b8565b6033546001600160a01b031633036137f757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b031982168117909255909116600080516020615dce833981519152600080a3565b1561387957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b9081600a0291600a830403611a4c57565b906105dc91828102928184041490151715611a4c57565b906924e8d26a370579f000009180830292830403611a4c57565b81810292918115918404141715611a4c57565b8015613937576127100490565b634e487b7160e01b600052601260045260246000fd5b8115613937570490565b908160209103126104f65751610783816104ea565b90606461ffff80931601918211611a4c57565b6001600160a01b0316600090815261014a6020526040902090565b6001600160a01b031660009081526101486020526040902090565b6001600160a01b031660009081526101476020526040902090565b6001600160a01b031660009081526101496020526040902090565b9060018060a01b0316600052602052604060002090565b6101458054909161ff001990911660089190911b61ff0016179055565b9055565b6101468054909161ff001990911660089190911b61ff0016179055565b62ff0000191660109190911b62ff0000161790565b613a1f60ff61014592168254613a40565b613a1f60ff61014692168254613a40565b613bb26101006117609260ff8151166101459060ff19825416179055613aa360ff602083015116613a02565b613ab9613ab4604083015160ff1690565b613a55565b613ae7613aca606083015160ff1690565b6101459063ff00000082549160181b169063ff0000001916179055565b613b18613af8608083015160ff1690565b610145805460ff60201b191660209290921b60ff60201b16919091179055565b613b49613b2960a083015160ff1690565b610145805460ff60281b191660289290921b60ff60281b16919091179055565b613b7a613b5a60c083015160ff1690565b610145805460ff60301b191660309290921b60ff60301b16919091179055565b613bab613b8b60e083015160ff1690565b610145805460ff60381b191660389290921b60ff60381b16919091179055565b0151610c80565b6101458054600160401b600160c01b03191660409290921b600160401b600160c01b0316919091179055565b613d126101006117609260ff8151166101469060ff19825416179055613c0a60ff602083015116613a23565b613c20613c1b604083015160ff1690565b613a66565b613c4e613c31606083015160ff1690565b6101469063ff00000082549160181b169063ff0000001916179055565b613c7f613c5f608083015160ff1690565b610146805460ff60201b191660209290921b60ff60201b16919091179055565b613cb0613c9060a083015160ff1690565b610146805460ff60281b191660289290921b60ff60281b16919091179055565b613ce1613cc160c083015160ff1690565b610146805460ff60301b191660309290921b60ff60301b16919091179055565b613bab613cf260e083015160ff1690565b610146805460ff60381b191660389290921b60ff60381b16919091179055565b6101468054600160401b600160c01b03191660409290921b600160401b600160c01b0316919091179055565b9492919390613d4b614086565b613d5486614053565b613d67686c6b935b8bbd40000061013355565b613d72600161013855565b613d866903635c9adc5dea00000061013955565b613d936101395461013a55565b604051926303408e4760e41b845260208460048160018060a01b03809b165afa801561085457613e4a96613e36613e4094613df4613de0613e3b95613e459a600091613fc5575b5061396c565b61ffff610131911661ffff19825416179055565b613e14613e0f613e086101315461ffff1690565b61ffff1690565b615c57565b61014080546001600160a01b0319166001600160a01b03909216919091179055565b612fab565b612fcd565b612fef565b613011565b613e61611542613e5c61014054610860565b6139d0565b613e73611542613e5c61014254610860565b610143613e86611542613e5c8354610860565b613e98611542613e5c61014454610860565b613ea4611542306139d0565b613eb6611542613e5c61014154610860565b613f5e613ec1611753565b6064815260646020820152606460408201526064606082015260006080820152606460a0820152600060c0820152600060e0820152613f0f61010091613f0a8382016101f49052565b613a77565b613f59613f1a611753565b606481529160646020840152606460408401526064606084015260006080840152606460a0840152600060c0840152600060e084015282016101f49052565b613bde565b60014614613f6a575050565b80696f52410cf20743900000613f8b613f86613f929454610860565b61399a565b5554610860565b166000600080516020615e0e83398151915260405180613fc08190696f52410cf20743900000602083019252565b0390a3565b613fe6915060203d8111613fec575b613fde8183611730565b810190613957565b38613dda565b503d613fd4565b15613ffa57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61406460ff60005460081c16613ff3565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b61409760ff60005460081c16613ff3565b6117603361383b565b908160209103126104f657516107838161086c565b908160609103126104f6578051916040602083015192015190565b6001600160a01b03918216815291166020820152604081019190915260600190565b61014c5415806141bb575b6141a957336001600160a01b03821603614154575b8161411c8261399a565b541061413b576141378261412f8361399a565b54039161399a565b5590565b6040516370f21a0f60e01b815260048101839052602490fd5b8161416233610b998461397f565b541061418b578161417633610b998461397f565b540361418533610b998461397f565b55614112565b610be8604051928392637f12200160e01b84523390600485016140d0565b604051638574adcf60e01b8152600490fd5b506141c5816139d0565b54156140fd565b6a4a723dc6b40b8a9a000000908082029182048103611a4c576101345480600c0290600c820403611a4c576a084595161401484a0000008101809111611a4c5761421861421e926138d5565b9261394d565b8103908111611a4c5790565b610134549081600c0291600c830403611a4c576a084595161401484a000000828101809111611a4c5761425c91613917565b69d3c21bcecceda1000000918201809211611a4c5761427d610783926138d5565b9061394d565b3d156142ae573d90614294826117d6565b916142a26040519384611730565b82523d6000602084013e565b606090565b156104f657565b3561078381611b49565b6001600160801b039182169082160191908211611a4c57565b356001600160801b03811681036104f65790565b613bb261010061176092803561430681611b49565b60ff610145911660ff1982541617905561432c602082013561432781611b49565b613a02565b61433d6040820135613ab481611b49565b61434e6060820135613aca81611b49565b61435f6080820135613af881611b49565b61437060a0820135613b2981611b49565b61437f613b5a60c083016142ba565b61438e613b8b60e083016142ba565b016142dd565b613d126101006117609280356143a981611b49565b60ff610146911660ff198254161790556143cf60208201356143ca81611b49565b613a23565b6143e06040820135613c1b81611b49565b6143f16060820135613c3181611b49565b6144026080820135613c5f81611b49565b61441360a0820135613c9081611b49565b614422613cc160c083016142ba565b61438e613cf260e083016142ba565b6001600160401b0381116116be5760051b60200190565b60405190614455826116de565b600282526040366020840137565b634e487b7160e01b600052603260045260246000fd5b8051156144865760200190565b614463565b8051600110156144865760400190565b80518210156144865760209160051b010190565b90815180825260208080930193019160005b8281106144cf575050505090565b83516001600160a01b0316855293810193928101926001016144c1565b90608092614512919695949683526000602084015260a0604084015260a08301906144af565b6001600160a01b0390951660608201520152565b60405190614533826116f9565b61176082610100610146546145b960ff808316855261455d818460081c16602087019060ff169052565b60ff601084901c821616604086015260ff601884901c821616606086015260ff602084901c821616608086015260ff602884901c82161660a086015260ff603084901c82161660c08601528260381c1660e085019060ff169052565b60401c6001600160801b0316910152565b604051906145d7826116f9565b61176082610100610145546145b960ff808316855261455d818460081c16602087019060ff169052565b6001600160801b039182169082160391908211611a4c57565b60209081818403126104f6578051906001600160401b0382116104f657019180601f840112156104f657825161464f81614431565b9361465d6040519586611730565b818552838086019260051b8201019283116104f6578301905b828210614684575050505090565b81518152908301908301614676565b6040906107839392815281602082015201906144af565b916146b4836139b5565b541580156146c1846139b5565b541590811561014c541580615006575b6141a957610132918254151580614fff575b80614ff4575b80614fdc575b614e24575b6101369586541580614e13575b80614e09575b80614df3575b614b45575b60009280614b39575b80614b2d575b614948575b61472f9061422a565b958661473a8a61399a565b541061491c578890879380151580614913575b6148b3575b508454151590816148a9575b50156148a15761476d926152ba565b925b610138546147ec575b5050506147c46147e49161479e600080516020615e0e83398151915294610b9e8861399a565b6147a78761399a565b556147b5816113878761399a565b6147be8661399a565b556141cc565b6040519081526001600160a01b0393841694909316929081906020820190565b0390a3600190565b80614897575b80614886575b8061487a575b614868575415159081614860575b508061484f575b80614837575b61482557388080614778565b604051630949534d60e31b8152600490fd5b50614845816113878561399a565b6101395410614819565b50614859836139d0565b5415614813565b90503861480c565b604051630d47ce9560e11b8152600490fd5b5061013a5484116147fe565b50614890866139d0565b54156147f8565b50805415156147f2565b50509261476f565b905054153861475e565b93506148e6846148d66148c53061399a565b546148d0838d612f9e565b90613646565b6148df3061399a565b5589612f9e565b60405190815230906001600160a01b03841690600080516020615e0e83398151915290602090a338614752565b5088811061474d565b610be86149288a61399a565b546040516370f21a0f60e01b815260048101919091529081906024820190565b610146549092906149649060401c6001600160801b0316610c80565b9061496d614448565b9061498a3061497b84614479565b6001600160a01b039091169052565b6040516315ab88c960e31b8152917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602084600481855afa93841561085457614a25946149ec918591614b0f575b5061497b8361448b565b875415614b07578281614a0a611371614a0489612f7f565b8b613917565b60405163d06ca61f60e01b8152968792839260048401614693565b0381855afa91821561085457614a478493614a6c968591614aed575b5061448b565b51614a50615061565b6040518096819482936307c0329d60e21b845260048401614693565b03915afa9081156108545761472f93614a93614ab593614aba958491614acb575b50614479565b51885490925015614ac257614aaa614aaf91612f7f565b61392a565b90613917565b61422a565b929050614726565b50600190613917565b614ae791503d8086833e614adf8183611730565b81019061461a565b38614a8d565b614b0191503d8087833e614adf8183611730565b38614a41565b828188614a0a565b614b27915060203d81116115df576115d08183611730565b386149e2565b5061013b544211614721565b5061013d54151561471b565b614b50600161013655565b614b58614526565b6101335460e08201614b77614b7161202e835160ff1690565b83613917565b91614bdb614ba4614b9e614b9761010088019661427d6120d78951610c80565b8094612f9e565b9261422a565b614bb181610b9e3061399a565b614bba3061399a565b5561dead600052610148602052600080516020615e2e833981519152611387565b61dead600052610148602052600080516020615e2e83398151915255614bff614448565b90614c0d3061497b84614479565b6040516315ab88c960e31b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169290602081600481875afa801561085457614c6a91600091614b0f575061497b8361448b565b823b156104f657614c99926000928360405180968195829463791ac94760e01b845242913091600486016144ec565b03925af193841561085457614dc360009594614d28614cf26120d78998978998978998614de0575b50614ce461202e614cea614cd6479851610c80565b614ce461202e8c5160ff1690565b90614601565b925160ff1690565b918580808088614d2d88614d28614d2261202e6020614d1961331561331561014054610860565b96015160ff1690565b89613917565b61394d565b905af150614d39614283565b508580808088614d6088614d28614d2261202e60a0614d1961331561331561014154610860565b905af150614d6c614283565b508580808088614d9388614d28614d2261202e60c0614d1961331561331561014254610860565b905af150614d9f614283565b50614aaf61202e6060614dba61331561331561014354610860565b97015160ff1690565b905af150614dcf614283565b50614ddb600061013655565b614712565b8061261e614ded926116ab565b38614cc1565b50614dfd3061399a565b5461013354111561470d565b5083541515614707565b50614e1d336139b5565b5415614701565b614e2f600161013655565b614e37614448565b614e443061497b83614479565b6040516315ab88c960e31b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169291602081600481875afa801561085457614ea391600091614fbe575b5061497b8461448b565b8a614ed4611371614ecb614eb68d6138e6565b614aaf614ec66101355442612f9e565b612f6e565b62015180900490565b91614eea614ee18461422a565b6113873061399a565b614ef33061399a565b5560405183815230929190911690600080516020615e0e83398151915290602090a3604080516001600160a01b038d168152602081018390527fb6e3a64045ef03ce5db2fb6ba595e1b2bcb2cabcf8cf3751a0374c38ce95d6269190a1614f5c61014354610860565b92803b156104f657614f8b93600080946040519687958694859363791ac94760e01b85524292600486016144ec565b03925af1801561085457614fab575b50614fa6600061013655565b6146f4565b8061261e614fb8926116ab565b38614f9a565b614fd6915060203d81116115df576115d08183611730565b38614e99565b5062015180614fee6101355442612f9e565b106146ef565b5061013654156146e9565b50846146e3565b50615010876139d0565b5415801590615020575b156146d1565b5081801561501a5750615032866139d0565b54151561501a565b60405190615047826116de565b61014d54825261014e54602083015261014f546040830152565b61512e61331561331561013b5461013f9061507f613f868354610860565b549061508e61013e5482613646565b42116152a7576150b76150ad6150a76150c19342612f9e565b84613917565b61013d5490613917565b63337f9800900490565b9061510c6150f16113716150d361503a565b61013c548151918215158061529d575b61520c575b50905085613917565b926150fc8482612f9e565b926151074261013b55565b612f9e565b615119613f868554610860565b55806151c5575b5080615168575b5054610860565b803b156104f6576000809160046040518094819363fff6cae960e01b83525af180156108545761515b5750565b8061261e611760926116ab565b610144906151768254610860565b61518c615186836113878461399a565b9161399a565b55600080516020615e0e8339815191526151bc6147c46151b66151af8754610860565b9554610860565b936141cc565b0390a338615127565b600090600080516020615e0e8339815191526152036151e76151b68754610860565b6040519081526001600160a01b03909316929081906020820190565b0390a338615120565b602081019261521e4291855190613646565b11156152905760408101908282511160001461526457926152556148d092614aaf8561524e61525d985142612f9e565b9251612f9e565b90519061394d565b80386150e8565b9261525561528592614aaf61527d61528b975142612f9e565b915186612f9e565b90612f9e565b61525d565b905060409150015161525d565b50428311156150e3565b506150c16150b76150ad620151806150a7565b61078392916153726152ca6145ca565b6152d2614526565b85156153ee576152f56113716152ef6120d7610100860151610c80565b87613917565b955b156153d3575061137161531161202e615317935160ff1690565b85613917565b7fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac61536061013461535261534c858354613646565b61013455565b546040519182918583610bec565b0390a161014b546153c6575b84612f9e565b8061537f575b5050612f9e565b80615390615399926113873061399a565b6147be3061399a565b60405190815230916001600160a01b031690600080516020615e0e83398151915290602090a33880615378565b6153ce615464565b61536c565b6153e9915061531161202e611371925160ff1690565b615317565b6154056113716152ef6120d7610100850151610c80565b956152f7565b600160f01b8152620f4240600282015260220190565b92610783949261ffff61544f9316855260018060a01b0316602085015260a0604085015260a084019061074d565b9160006060820152608081840391015261074d565b600261012d541061176057615477615cd7565b9081519061013454926040918251906020826154a188838301919060206040840193600281520152565b03916154b5601f1993848101865285611730565b60005b6154c188612f8f565b8110156155da5761552d876154da613315606554610860565b6154ef6154e7858b61449b565b5161ffff1690565b908883519261550f846155038b820161540b565b038b8101865285611730565b845163040a7bb160e41b815295869485938493309060048601615421565b03915afa908115610854576000916155bc575b504711156155b1578061558261555b6154e76001948a61449b565b89516155788161556c89820161540b565b03898101835282611730565b4791893091613427565b615592613e086154e7838a61449b565b88518b8152600080516020615dee83398151915290602090a2016154b8565b509650505050505050565b6155d39150883d8a11613381576133708183611730565b5038615540565b5096956155f69293506155f09095949195612f8f565b9061449b565b519361ffff92858461560c6101315461ffff1690565b160361561b575b505050505050565b6156988180519561564a8761563e878b8301919060206040840193600181520152565b03878101895288611730565b615658613315606554610860565b9816978151906156798261566d8b820161540b565b03888101845283611730565b825163040a7bb160e41b8152938492839182918b308f60048601615421565b03915afa90811561085457600091615735575b50471115615613576156f4600080516020615dee833981519152946156de6156ea615702968a998651938491820161540b565b03908101835282611730565b4791309089613427565b519081529081906020820190565b0390a27f230478c51246d0634f4195a13660a4cadeac13f0a9dda431cf222657ca4e3cd2600080a2388080808080615613565b61574c9150823d8411613381576133708183611730565b50386156ab565b60208201805161ffff168061576e57505090611760916157f7565b6001810361578257505090611760916159cb565b60028103615796575050906117609161594a565b909150600303611a51576020826157b0935101019061592b565b90506101349081548082116157c5575b505050565b80820390828211611a4c5782146157c05781600080516020615e4e83398151915293556131ba60405192839283610bec565b815182016060838203126104f65761581260208401516104ea565b6040830151906001600160401b0382116104f65760609160208061583a930191860101612e34565b9201519160148151106158905761ffff61587d60207fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf93015160601c94856158cd565b6040519081529216918060208101613fc0565b60405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606490fd5b61014c54158061590a575b6141a9576001600160a01b0381166000908152610148602052604090205482810191908210611a4c576141379061399a565b506001600160a01b03811660009081526101496020526040902054156158d8565b91908260409103126104f65760208251615944816104ea565b92015190565b9061595e906020808251830101910161592b565b9190506101348054808411615974575b50505050565b830390838211611a4c57600080516020615d8e83398151915292600080516020615e4e833981519152856020948161ffff95556159b660405192839283610bec565b0390a16040519485521692a23880808061596e565b9061ffff615a037f66364361b7719378adaaece82e4f3dd05fb4403905005e073184bdda8bde2985926020808251830101910161592b565b9050610134908154808211615a79575b5050615a69615a38825460405191829160208301919060206040840193600381520152565b03615a4b601f1991828101845283611730565b615a5f60405191826156de6020820161540b565b4791309088613427565b54604051908152921691602090a2565b615a92600080516020615e4e8339815191529183612f9e565b615a9c8361013455565b835490615aae60405192839283610bec565b0390a160405190815282851690600080516020615d8e83398151915290602090a23880615a13565b60405160208101906000825260208152615aef816116c3565b51902090565b600052610130602052604060002090565b90801580615c4b575b615c3957615b1b615ad6565b91615b24611762565b9080825260208201938452604051615b5781615b496020820194859190602083019252565b03601f198101835282611730565b5190209261012d9283548015600014615baa57505050615b8f615ba09293615b8a83602090805161012e55015161012f55565b615af5565b906020600191805184550151910155565b613a1f8154613638565b8110615bf357505061012e5b600181015490615bc4615ad6565b8214615bd95750615bd490615af5565b615bb6565b615b8f915093806001615bee95960155615af5565b615ba0565b61012e94929394906000905b808210615c2157505091615b8f916001615bee95940190828254925552615af5565b9091615c31600180920154615af5565b920190615bff565b604051639f388f4f60e01b8152600490fd5b5061012d541515615b0f565b61012d90815415908115615c3957615c6d615ad6565b615c75611762565b9180835260208301918252604051615c9a81615b496020820194859190602083019252565b5190209215615cc05750615b8f615ba092615b8a83602090805161012e55015161012f55565b615bee92615b8f9161012f90828254925552615af5565b61012d546000198101908111611a4c57615cf081614431565b90615cfe6040519283611730565b808252601f19615d0d82614431565b016020903682850137604051615d22816116c3565b61012e54815261012f54828201526000905b838210615d42575050505090565b615d58615d53846001930151615af5565b61176f565b918251615d65828861449b565b520190615d3456fe8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572cee9fc88b383d33b29217576c2de6c2fb525518ae00dc253433482bacd6b0d300639a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0507b26d2faef43dd0872db8d8b90145607f42e66a0afb558c4f4219986ce68deddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef72cc341f8f047e2af0ffb69c33751f04fe14ab2ca72f91169a7ce11e05ee8a6e17a5e39f679219ca11323d647947a4ab5bf87d9eabaadcb2592dde4e9c5b6d3dfa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470daba264697066735822122075a8d12347510a55d1fbd7bb67bce811937853280dade45cbf0050eb6a67fa3864736f6c634300081300330000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80621d3567146104e557806301ffc9a7146104e05780630445b667146104db57806306fdde03146104d657806307e0db17146104d1578063095ea7b3146104cc5780630df37483146104c75780630fa451dd146104c257806310ddb137146104bd57806318160ddd146104b857806318abb635146104b357806323b872dd146104ae5780632a205e3d146104a95780632b14ca56146104a4578063313ce5671461049f578063364333f41461049a5780633732e214146104955780633d8b38f6146104905780633e8511201461048b5780633f1f4fa41461048657806342d65a8d146104815780634477051514610468578063470624021461047c57806347a5051714610477578063483d9dbf146104725780634bc853cf1461046d5780634c42899a14610468578063519056361461046357806351c6590a1461045e57806352d70bdb14610459578063536efe8b14610454578063571ac8b01461044f57806358a8b85f1461044a5780635b8c41e61461044557806362907a1814610440578063631166b81461043b57806366ad5c8a1461043657806370a0823114610431578063715018a61461042c57806371dd1f37146104275780637533d788146104225780638cfd8f5c1461041d5780638da5cb5b146104185780639358928b14610413578063950c8a741461040e5780639569290a1461040957806395d89b411461040457806397c3af0f146103ff5780639db986b2146103fa5780639f38369a146103f5578063a64e4f8a146103f0578063a6c3d165146103eb578063a81a85e7146103e6578063a82ed9ec146103e1578063a9059cbb146103dc578063b353aaa7146103d7578063baf3292d146103d2578063bef97c87146103cd578063c4461834146103c8578063c584075b146103c3578063cbed8b9c146103be578063cbf50bb6146103b9578063cc2a9a5b146103b4578063cd0ab1c1146103af578063d1deba1f146103aa578063d85a2828146103a5578063dd62ed3e146103a0578063df2a5b3b1461039b578063e0927fa514610396578063eab45d9c14610391578063eb8d72b71461038c578063ed629c5c14610387578063f06b6c1a14610382578063f2fde38b1461037d578063f5ecbdbc14610378578063f9a3dbdd146103735763fc0c546a0361000e57612dbe565b612da0565b612ce5565b612c54565b612bd9565b612bb6565b612a90565b612a2e565b612a12565b612925565b6128da565b6128a1565b61277a565b61275e565b612638565b612624565b612556565b61251b565b6124fe565b6124df565b61246f565b612446565b612410565b6123cb565b6123af565b612285565b612266565b6121bc565b612163565b611fe6565b611f7e565b611f60565b611f37565b611eab565b611e82565b611e27565b611dda565b611b54565b611afd565b611ab7565b611973565b61193d565b6118fe565b611865565b61178d565b61165b565b61163f565b611620565b61132e565b611117565b610f17565b611016565b610fd7565b610f99565b610f33565b610eac565b610e73565b610e34565b610de9565b610d92565b610d64565b610d48565b610ce2565b610bfd565b610ae7565b610a0f565b6109ea565b61097e565b61093a565b6108fb565b61087d565b6107dc565b610786565b61070b565b610680565b61058d565b61ffff8116036104f657565b600080fd5b9181601f840112156104f6578235916001600160401b0383116104f657602083818601950101116104f657565b9060806003198301126104f657600435610541816104ea565b916001600160401b03906024358281116104f65781610562916004016104fb565b9390939260443581811681036104f657926064359182116104f657610589916004016104fb565b9091565b346104f65761059b36610528565b919294939060018060a01b0360655416330361063b5761060061060892610019976105f96105df6105da8a61ffff166000526066602052604060002090565b611d36565b8051908184149182610631575b508161060e575b50612dd9565b36916117f1565b9236916117f1565b92613033565b905061061b3684866117f1565b60208151910120906020815191012014386105f3565b15159150386105ec565b60405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200006044820152606490fd5b346104f65760203660031901126104f65760043563ffffffff60e01b81168091036104f65780602091159081156106ef575b81156106c4575b506040519015158152f35b630a72677560e11b8114915081156106de575b50386106b9565b6301ffc9a760e01b149050386106d7565b6336372b0760e01b811491506106b2565b60009103126104f657565b346104f65760003660031901126104f657602061013354604051908152f35b60005b83811061073d5750506000910152565b818101518382015260200161072d565b906020916107668151809281855285808601910161072a565b601f01601f1916010190565b90602061078392818152019061074d565b90565b346104f65760003660031901126104f6576107d86040516107a6816116c3565b60118152705363616c65582e6767207c205363616c6560781b602082015260405191829160208352602083019061074d565b0390f35b346104f6576000602036600319011261085d576004356107fb816104ea565b6108036137e3565b6065546001600160a01b0316908290823b1561085957602461ffff918360405195869485936307e0db1760e01b85521660048401525af1801561085457610848575080f35b610851906116ab565b80f35b612e9b565b5080fd5b80fd5b6001600160a01b031690565b6001600160a01b038116036104f657565b346104f65760403660031901126104f65760043561089a8161086c565b602435903360005261014a602052816108b78260406000206139eb565b556040519182526001600160a01b03169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590602090a3602060405160018152f35b346104f65760403660031901126104f65761ffff60043561091b816104ea565b6109236137e3565b166000526068602052602435604060002055600080f35b346104f65760003660031901126104f657606061013254151561095f610139546141cc565b61096b61013a546141cc565b9060405192835260208301526040820152f35b346104f6576000602036600319011261085d5760043561099d816104ea565b6109a56137e3565b6065546001600160a01b0316908290823b1561085957602461ffff918360405195869485936310ddb13760e01b85521660048401525af1801561085457610848575080f35b346104f65760003660031901126104f657602060405169d3c21bcecceda10000008152f35b60a03660031901126104f657600435610a278161086c565b60243590610a348261086c565b604435610a408161086c565b60643590610a4d8261086c565b60843593610a5a8561086c565b610a626137e3565b6001600160a01b0393841680610acd575b50838116610abe575b50828116610aaf575b50818116610aa0575b508116610a9757005b61001990613011565b610aa990612fef565b38610a8e565b610ab890612fcd565b38610a85565b610ac790612fab565b38610a7c565b61014080546001600160a01b031916909117905538610a73565b346104f65760603660031901126104f657600435610b048161086c565b60243590610b118261086c565b6044359060018060a01b0381168060005261014a90816020526040600020610b3d6000199133906139eb565b5403610b64575b6107d8610b528587866146aa565b60405190151581529081906020820190565b60005260205281610b793360406000206139eb565b5410610bbc57906107d892610b5292610ba483610b9e33610b998561397f565b6139eb565b54612f9e565b610bb133610b998461397f565b559192819450610b44565b9050610be8610bce33610b998461397f565b54604051637f12200160e01b8152938493600485016140d0565b0390fd5b908152602081019190915260400190565b346104f65760a03660031901126104f657600435610c1a816104ea565b6001600160401b03906024358281116104f657610c3b9036906004016104fb565b916064359081151582036104f6576084359485116104f657610c64610c709536906004016104fb565b949093604435926132c1565b906107d860405192839283610bec565b6001600160801b031690565b60ff9182168152918116602083015291821660408201529181166060830152918216608082015291811660a083015291821660c0820152911660e08201526001600160801b039091166101008201526101200190565b346104f65760003660031901126104f6576107d86101465460405191829160ff9060018060801b038160401c1691808260381c1691818160301c1691808260281c1691818160201c1691808260181c1691818160101c1691808260081c1691168a610c8c565b346104f65760003660031901126104f657602060405160128152f35b60008060031936011261085d57610d796137e3565b8080808047335af1610d89614283565b501561085d5780f35b346104f65760003660031901126104f657602061013454604051908152f35b9060406003198301126104f657600435610dca816104ea565b91602435906001600160401b0382116104f657610589916004016104fb565b346104f657602061ffff610e25610dff36610db1565b9390911660005260668452610e176040600020611d36565b8481519101209236916117f1565b82815191012014604051908152f35b60403660031901126104f657600435610e4c8161086c565b610e546137e3565b6001600160a01b03166000908152610147602052604090206024359055005b346104f65760203660031901126104f65761ffff600435610e93816104ea565b1660005260686020526020604060002054604051908152f35b346104f657610eba36610db1565b610ec59291926137e3565b6065546000938492916001600160a01b031690813b15610f135783610f0195604051968795869485936342d65a8d60e01b855260048501612ec8565b03925af1801561085457610848575080f35b8380fd5b346104f65760003660031901126104f657602060405160008152f35b346104f65760003660031901126104f6576107d86101455460405191829160ff9060018060801b038160401c1691808260381c1691818160301c1691808260281c1691818160201c1691808260181c1691818160101c1691808260081c1691168a610c8c565b346104f65760203660031901126104f657600435610fb68161086c565b60018060a01b03166000526101486020526020604060002054604051908152f35b60403660031901126104f657600435610fef8161086c565b610ff76137e3565b6001600160a01b03166000908152610150602052604090206024359055005b60e03660031901126104f65761001960c4356110ac60a4356004356110396137e3565b610135548015159081611105575b50156110c65750611059600161014c55565b61106560243561013255565b61107160843561013855565b61107d60643561014b55565b61108960443561013355565b6903635c9adc5dea000000811015806110b2575b6110a6906142b3565b61013955565b61013a55565b5069021e19e0c9bab240000083101561109d565b6110da9061014c5481116110df5761014c55565b611059565b6110e94261013555565b6110f34261013b55565b6110ff6107d061013d55565b61014c55565b61110f915061361a565b421138611047565b60e03660031901126104f65760043561112f8161086c565b6024359061113c826104ea565b6001600160401b036044358181116104f65761115c9036906004016104fb565b9190926084359161116c8361086c565b60a435936111798561086c565b60c4359182116104f6576111a16111976111a99336906004016104fb565b97909236916117f1565b9536916117f1565b9160ff60fb54166000146112b457602283511061127057600080516020615dae8339815191529361125461126b9285611219602261ffff980151888c166000526067602052611205604060002060008052602052604060002090565b5490611212821515613653565b101561369c565b611225606435876140f2565b93849261124c8b61123e60405196879260208401613388565b03601f198101865285611730565b34938c6134ff565b60405193849360018060a01b0316971695836133ab565b0390a3005b60405162461bcd60e51b815260206004820152601c60248201527b4c7a4170703a20696e76616c69642061646170746572506172616d7360201b6044820152606490fd5b82516112da57600080516020615dae8339815191529361125461126b9261ffff95611219565b60405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608490fd5b6020806003193601126104f6576113436137e3565b6101315460101c60ff166104f657610131805462ff00001916620100001790556113796113716004356138fd565b612710900490565b9061138d826113873061399a565b54613646565b6113963061399a565b556040518281526000929030908490600080516020615e0e83398151915290602090a360405163c45a015560e01b81526001600160a01b0391907f0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb8316908481600481855afa908115610854578691611603575b506040516315ab88c960e31b81528581600481865afa9182156108545786926114689289916115e6575b506040516364e329cb60e11b81523060048201526001600160a01b03909116602482015295869283918a9183906044820190565b0393165af193841561085457611519946060946114aa9288926115b9575b505061013f80546001600160a01b0319166001600160a01b03909216919091179055565b6114c16114ba82610b993061397f565b6000199055565b6114cd61014354610860565b60405163f305d71960e01b81523060048201526024810184905260448101939093523460648401526001600160a01b031660848301524260a483015290928391908290819060c4820190565b039134905af180156108545761158b575b5061154861154261153d61013f54610860565b6139b5565b60019055565b611553600161013255565b61155d4261013555565b6115674261013b55565b6115736107d061013d55565b61157e600061013c55565b6108516201518061013e55565b6115ab9060603d81116115b2575b6115a38183611730565b8101906140b5565b505061152a565b503d611599565b6115d89250803d106115df575b6115d08183611730565b8101906140a0565b3880611486565b503d6115c6565b6115fd9150843d86116115df576115d08183611730565b38611434565b61161a9150853d87116115df576115d08183611730565b3861140a565b346104f65760003660031901126104f657602061014b54604051908152f35b60003660031901126104f6576116536137e3565b610019615061565b346104f65760203660031901126104f6576004356116788161086c565b3360005261014a60205260001990816108b78260406000206139eb565b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116116be57604052565b611695565b604081019081106001600160401b038211176116be57604052565b606081019081106001600160401b038211176116be57604052565b61012081019081106001600160401b038211176116be57604052565b60c081019081106001600160401b038211176116be57604052565b601f909101601f19168101906001600160401b038211908210176116be57604052565b60405190611760826116f9565b565b60405190611760826116c3565b9060405161177c816116c3565b602060018294805484520154910152565b346104f65760003660031901126104f657606061012d546040516117b0816116c3565b61012e54815261012f549060208101918252604051928352516020830152516040820152f35b6001600160401b0381116116be57601f01601f191660200190565b9291926117fd826117d6565b9161180b6040519384611730565b8294818452818301116104f6578281602093846000960137010152565b60209061184292826040519483868095519384920161072a565b82019081520301902090565b9060018060401b0316600052602052604060002090565b346104f65760603660031901126104f657600435611882816104ea565b6001600160401b036024358181116104f657366023820112156104f6576118b39036906024816004013591016117f1565b9060443590811681036104f6576118e86118ed926118e26107d89561ffff166000526097602052604060002090565b90611828565b61184e565b546040519081529081906020820190565b60403660031901126104f6576004356119168161086c565b61191e6137e3565b6001600160a01b03166000908152610149602052604090206024359055005b60603660031901126104f6576119516137e3565b61195c6040516116de565b60043561014d5560243561014e5560443561014f55005b346104f65761198136610528565b915091303303611a63576119a29361199a9136916117f1565b5036916117f1565b906020820161ffff81511680156000146119c257505090610019916157f7565b600181036119d657505090610019916159cb565b600281036119ea575050906100199161594a565b909150600303611a5157602082611a04935101019061592b565b9050610134908154808211611a1557005b80820390828211611a4c5782146100195781600080516020615e4e8339815191529355611a4760405192839283610bec565b0390a1005b612f58565b60405163a0e89db160e01b8152600490fd5b60405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608490fd5b346104f65760203660031901126104f657600435611ad48161086c565b60018060a01b03166000526101486020526020611af56040600020546141cc565b604051908152f35b346104f65760008060031936011261085d57611b176137e3565b603380546001600160a01b0319811690915581906001600160a01b0316600080516020615dce8339815191528280a380f35b60ff8116036104f657565b60603660031901126104f657600435611b6c816104ea565b6001600160401b036024358181116104f657611b8c9036906004016104fb565b9260ff604435611b9b81611b49565b611ba36137e3565b1680611ce8575b506040519260209084611bc1308887868501612f37565b03611bd4601f1991828101885287611730565b60009561ffff8516875260668452604087209381519384116116be57611c0484611bfe8754611cfc565b87612ee3565b8092601f8511600114611c655750509180611c549492889994600080516020615d6e8339815191529992611c5a575b50508160011b916000199060031b1c19161790555b60405193849384612ec8565b0390a180f35b015190503880611c33565b849392919316611c7a86600052602060002090565b9389905b828210611cd0575050926001928592600080516020615d6e8339815191529a9b96611c54989610611cb7575b505050811b019055611c48565b015160001960f88460031b161c19169055388080611caa565b80600186978294978701518155019601940190611c7e565b611cf69061ffff8316615b06565b38611baa565b90600182811c92168015611d2c575b6020831014611d1657565b634e487b7160e01b600052602260045260246000fd5b91607f1691611d0b565b9060405191826000825492611d4a84611cfc565b908184526001948581169081600014611db75750600114611d74575b505061176092500383611730565b9093915060005260209081600020936000915b818310611d9f57505061176093508201013880611d66565b85548884018501529485019487945091830191611d87565b91505061176094506020925060ff191682840152151560051b8201013880611d66565b346104f65760203660031901126104f65761ffff600435611dfa816104ea565b1660005260666020526107d8611e136040600020611d36565b60405191829160208352602083019061074d565b346104f65760403660031901126104f6576020611e79600435611e49816104ea565b61ffff60243591611e59836104ea565b166000526067835260406000209061ffff16600052602052604060002090565b54604051908152f35b346104f65760003660031901126104f6576033546040516001600160a01b039091168152602090f35b346104f65760008060031936011261085d5761dead81526101489081602052611ed760408220546141cc565b69d3c21bcecceda10000009181830393838511611a4c578160409181611f02945260205220546141cc565b01808203928311611a4c5761013454019003908111611a4c57611f276107d8916141cc565b6040519081529081906020820190565b346104f65760003660031901126104f6576069546040516001600160a01b039091168152602090f35b346104f65760203660031901126104f6576020611af56004356141cc565b346104f65760003660031901126104f6576107d8604051611f9e816116c3565b60018152605360f81b602082015260405191829160208352602083019061074d565b6101209060031901126104f657600490565b610120906101231901126104f65761012490565b6102403660031901126104f657611ffc36611fc0565b61200536611fd2565b61200d6137e3565b6120a361209461208561207661206761205861204961203461202e8a6142ba565b60ff1690565b61204361202e60208c016142ba565b906142c4565b61204361202e60408b016142ba565b61204361202e60608a016142ba565b61204361202e608089016142ba565b61204361202e60a088016142ba565b61204361202e60c087016142ba565b61204361202e60e086016142ba565b6120c461209461208561207661206761205861204961203461202e8a6142ba565b90610100916120dc6120d78487016142dd565b610c80565b6001600160801b0392831690811480159490612146575b50831561213a575b50821561212c575b505061211a57612115610019926142f1565b614394565b604051630e52390960e41b8152600490fd5b6105dc925016113880612103565b6105dc109250386120fb565b6121579194506120d79086016142dd565b828216141592386120f3565b60603660031901126104f65760443560043561217e8261086c565b6121866137e3565b612710811161211a5761013c5561014480546001600160a01b0319166001600160a01b0390921691909117905560243561013e55005b346104f65760203660031901126104f65761ffff6004356121dc816104ea565b1660005260666020526121f26040600020611d36565b805115612221578051601319810191908211611a4c576107d89161221591613763565b60405191829182610772565b60405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606490fd5b346104f65760003660031901126104f657602061013254604051908152f35b346104f65761229336610db1565b919061229d6137e3565b60405191602092806122b3308786888501612f37565b03936122c7601f1995868101845283611730565b60009461ffff8416865260668252604086209280519260018060401b0384116116be576122f884611bfe8754611cfc565b8092601f85116001146123465750509180611c549492889994600080516020615d6e8339815191529992611c5a5750508160011b916000199060031b1c191617905560405193849384612ec8565b84939291931661235b86600052602060002090565b9389905b828210612397575050926001928592600080516020615d6e8339815191529a9b96611c54989610611cb757505050811b019055611c48565b8060018697829497870151815501960194019061235f565b346104f65760003660031901126104f657602060405160038152f35b346104f65760003660031901126104f6576040517f0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb6001600160a01b03168152602090f35b346104f65760403660031901126104f657602061243c6004356124328161086c565b60243590336146aa565b6040519015158152f35b346104f65760003660031901126104f6576065546040516001600160a01b039091168152602090f35b346104f65760203660031901126104f6577f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b60206004356124af8161086c565b6124b76137e3565b606980546001600160a01b0319166001600160a01b03929092169182179055604051908152a1005b346104f65760003660031901126104f657602061014c54604051908152f35b346104f65760003660031901126104f65760206040516127108152f35b346104f65760003660031901126104f657608061013d5461013b5461013c5461013e5491604051938452602084015260408301526060820152f35b346104f65760803660031901126104f657600435612573816104ea565b60243561257f816104ea565b6064356001600160401b0381116104f65761259e9036906004016104fb565b90926125a86137e3565b6065546001600160a01b031690813b156104f65760008094612601604051978896879586946332fb62e760e21b865261ffff80921660048701521660248501526044356044850152608060648501526084840191612ea7565b03925af180156108545761261157005b8061261e610019926116ab565b80610700565b60203660031901126104f6576100196137e3565b60c03660031901126104f6576004356126508161086c565b6126d260243561265f8161086c565b60443561266b8161086c565b6064356126778161086c565b608435916126848361086c565b60a435936126918561086c565b600054966126b660ff8960081c16158099819a612750575b8115612730575b50613872565b876126c9600160ff196000541617600055565b61271757613d3e565b6126d857005b6126e861ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61272b61010061ff00196000541617600055565b613d3e565b303b15915081612742575b50386126b0565b6001915060ff16143861273b565b600160ff82161091506126a9565b346104f65760003660031901126104f657602060405160028152f35b61278336610528565b9161ffff869492961660005260976020526127b781604060002060206040518092878b83378782019081520301902061184e565b54918215612850577fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e596611a47946128449161283e916000612832876118e88d8961282c8f6128188f61280b368c8e6117f1565b60208151910120146131d8565b61ffff166000526097602052604060002090565b916131bf565b5561199a36868c6117f1565b86615753565b6040519586958661322e565b60405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608490fd5b60008060031936011261085d576128b66137e3565b3081526101486020526128d66128cf60408320546141cc565b33306146aa565b5080f35b346104f65760403660031901126104f6576020611e796004356128fc8161086c565b602435906129098261086c565b6001600160a01b0316600090815261014a8452604090206139eb565b346104f65760603660031901126104f657600435612942816104ea565b60243561294e816104ea565b6044359161295a6137e3565b82156129d557611a477f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09361ffff83166000526067602052806129af8560406000209061ffff16600052602052604060002090565b556040519384938460409194939294606082019561ffff80921683521660208201520152565b60405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606490fd5b346104f65760003660031901126104f657602060405160018152f35b346104f65760203660031901126104f6576004358015158091036104f65760207f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a491612a786137e3565b60ff1960fb541660ff82161760fb55604051908152a1005b346104f657612a9e36610db1565b9190612aa86137e3565b60009161ffff81168352602060668152604084209060018060401b0386116116be57612ade86612ad88454611cfc565b84612ee3565b8490601f8711600114612b34575094611c5491818697600080516020615e6e8339815191529791612b29575b508260011b906000198460031b1c191617905560405193849384612ec8565b905085013538612b0a565b90601f198716612b4984600052602060002090565b9287905b828210612b9e57505091611c54939188600080516020615e6e83398151915298999410612b84575b5050600182811b019055611c48565b860135600019600385901b60f8161c191690553880612b75565b80600185968294968b01358155019501930190612b4d565b346104f65760003660031901126104f657602060ff60fb54166040519015158152f35b346104f65760008060031936011261085d5761dead81526101489081602052612c0560408220546141cc565b69d3c21bcecceda10000009181830393838511611a4c578160409181612c30945260205220546141cc565b01808203928311611a4c5761013454019003908111611a4c57604051908152602090f35b346104f65760203660031901126104f657600435612c718161086c565b612c796137e3565b6001600160a01b03811615612c91576100199061383b565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104f65760803660031901126104f657600435612d02816104ea565b600060243591612d11836104ea565b612d1c60443561086c565b606554604051633d7b2f6f60e21b815261ffff92831660048201529390911660248401523060448401526064803590840152829060849082906001600160a01b03165afa8015610854576107d891600091612d7f575b5060405191829182610772565b612d9a913d8091833e612d928183611730565b810190612e76565b38612d72565b346104f65760203660031901126104f6576020611af560043561422a565b346104f65760003660031901126104f6576020604051308152f35b15612de057565b60405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b81601f820112156104f6578051612e4a816117d6565b92612e586040519485611730565b818452602082840101116104f657610783916020808501910161072a565b906020828203126104f65781516001600160401b0381116104f6576107839201612e34565b6040513d6000823e3d90fd5b908060209392818452848401376000828201840152601f01601f1916010190565b60409061ffff61078395931681528160208201520191612ea7565b90601f8111612ef157505050565b600091825260208220906020601f850160051c83019410612f2d575b601f0160051c01915b828110612f2257505050565b818155600101612f16565b9092508290612f0d565b826014949392823760609290921b6001600160601b03191691019081520190565b634e487b7160e01b600052601160045260246000fd5b9062015180918203918211611a4c57565b90612710918203918211611a4c57565b600019810191908211611a4c57565b91908203918211611a4c57565b61014180546001600160a01b0319166001600160a01b03909216919091179055565b61014280546001600160a01b0319166001600160a01b03909216919091179055565b61014380546001600160a01b0319166001600160a01b03909216919091179055565b61014480546001600160a01b0319166001600160a01b03909216919091179055565b9290915a604051633356ae4560e11b6020820190815261ffff8716602483015260806044830152949161309f8261309161307060a483018761074d565b6001600160401b03881660648401528281036023190160848401528861074d565b03601f198101845283611730565b60008091604051976130b089611715565b609689528260208a019560a036883751923090f1903d90609682116130f7575b6000908288523e156130e4575b5050505050565b6130ed94613100565b38808080806130dd565b609691506130d0565b91936131ac7fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c956131ba939561ffff815160208301209616958660005260976020526131728361316460208b6040600020826040519483868095519384920161072a565b82019081520301902061184e565b5561318f604051978897885260a0602089015260a088019061074d565b6001600160401b039092166040870152858203606087015261074d565b90838203608085015261074d565b0390a1565b6020919283604051948593843782019081520301902090565b156131df57565b60405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608490fd5b9160609361ffff6132519398979698168452608060208501526080840191612ea7565b6001600160401b0390951660408201520152565b91908260409103126104f6576020825192015190565b91926107839694959361ffff6132ac9316845260018060a01b0316602084015260a0604084015260a083019061074d565b93151560608201526080818503910152612ea7565b969591949693929361330460409687966132f088519586936000602086015260608b8601526080850191612ea7565b90606083015203601f198101845283611730565b61333961331a613315606554610860565b610860565b938651998a968795869563040a7bb160e41b875230906004880161327b565b03915afa928315610854576000918294613354575b50509190565b61337893945080919250903d10613381575b6133708183611730565b810190613265565b9190388061334e565b503d613366565b9291906133a66040916000865260606020870152606086019061074d565b930152565b9291906133a660209160408652604086019061074d565b156133c957565b60405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608490fd5b919390929361ffff831690600095828752606660205261346161344c60408920611d36565b95613459875115156133c2565b8751906135ab565b6065546001600160a01b039081169690873b156134fb57926134b39694926134e1926134c69a9997956040519b8c9a8b998a9862c5803160e81b8a5260048a015260c060248a015260c489019061074d565b60031993848983030160448a015261074d565b931660648601528960848601528483030160a485015261074d565b03925af18015610854576134f25750565b611760906116ab565b8880fd5b90939461ffff821680600052606660205261352d6135206040600020611d36565b93613459855115156133c2565b6065546001600160a01b039590861694853b156104f65761359098600098886134e19461357d9a6040519d8e9c8d9b8c9a62c5803160e81b8c5260048c015260c060248c015260c48b019061074d565b60031995868b83030160448c015261074d565b951660648801521660848601528483030160a485015261074d565b61ffff166000526068602052604060002054908115613610575b116135cc57565b606460405162461bcd60e51b815260206004820152602060248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152fd5b61271091506135c5565b90620151808201809211611a4c57565b90601f8201809211611a4c57565b9060018201809211611a4c57565b91908201809211611a4c57565b1561365a57565b60405162461bcd60e51b815260206004820152601a602482015279131e905c1c0e881b5a5b91d85cd31a5b5a5d081b9bdd081cd95d60321b6044820152606490fd5b156136a357565b60405162461bcd60e51b815260206004820152601b60248201527a4c7a4170703a20676173206c696d697420697320746f6f206c6f7760281b6044820152606490fd5b156136ed57565b60405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606490fd5b1561372a57565b60405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606490fd5b613777826137708161362a565b10156136e6565b6137848282511015613723565b8161379c575050604051600081526020810160405290565b60405191601f811691821560051b808486010193838501920101905b8084106137d05750508252601f01601f191660405290565b90928351815260208091019301906137b8565b6033546001600160a01b031633036137f757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b031982168117909255909116600080516020615dce833981519152600080a3565b1561387957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b9081600a0291600a830403611a4c57565b906105dc91828102928184041490151715611a4c57565b906924e8d26a370579f000009180830292830403611a4c57565b81810292918115918404141715611a4c57565b8015613937576127100490565b634e487b7160e01b600052601260045260246000fd5b8115613937570490565b908160209103126104f65751610783816104ea565b90606461ffff80931601918211611a4c57565b6001600160a01b0316600090815261014a6020526040902090565b6001600160a01b031660009081526101486020526040902090565b6001600160a01b031660009081526101476020526040902090565b6001600160a01b031660009081526101496020526040902090565b9060018060a01b0316600052602052604060002090565b6101458054909161ff001990911660089190911b61ff0016179055565b9055565b6101468054909161ff001990911660089190911b61ff0016179055565b62ff0000191660109190911b62ff0000161790565b613a1f60ff61014592168254613a40565b613a1f60ff61014692168254613a40565b613bb26101006117609260ff8151166101459060ff19825416179055613aa360ff602083015116613a02565b613ab9613ab4604083015160ff1690565b613a55565b613ae7613aca606083015160ff1690565b6101459063ff00000082549160181b169063ff0000001916179055565b613b18613af8608083015160ff1690565b610145805460ff60201b191660209290921b60ff60201b16919091179055565b613b49613b2960a083015160ff1690565b610145805460ff60281b191660289290921b60ff60281b16919091179055565b613b7a613b5a60c083015160ff1690565b610145805460ff60301b191660309290921b60ff60301b16919091179055565b613bab613b8b60e083015160ff1690565b610145805460ff60381b191660389290921b60ff60381b16919091179055565b0151610c80565b6101458054600160401b600160c01b03191660409290921b600160401b600160c01b0316919091179055565b613d126101006117609260ff8151166101469060ff19825416179055613c0a60ff602083015116613a23565b613c20613c1b604083015160ff1690565b613a66565b613c4e613c31606083015160ff1690565b6101469063ff00000082549160181b169063ff0000001916179055565b613c7f613c5f608083015160ff1690565b610146805460ff60201b191660209290921b60ff60201b16919091179055565b613cb0613c9060a083015160ff1690565b610146805460ff60281b191660289290921b60ff60281b16919091179055565b613ce1613cc160c083015160ff1690565b610146805460ff60301b191660309290921b60ff60301b16919091179055565b613bab613cf260e083015160ff1690565b610146805460ff60381b191660389290921b60ff60381b16919091179055565b6101468054600160401b600160c01b03191660409290921b600160401b600160c01b0316919091179055565b9492919390613d4b614086565b613d5486614053565b613d67686c6b935b8bbd40000061013355565b613d72600161013855565b613d866903635c9adc5dea00000061013955565b613d936101395461013a55565b604051926303408e4760e41b845260208460048160018060a01b03809b165afa801561085457613e4a96613e36613e4094613df4613de0613e3b95613e459a600091613fc5575b5061396c565b61ffff610131911661ffff19825416179055565b613e14613e0f613e086101315461ffff1690565b61ffff1690565b615c57565b61014080546001600160a01b0319166001600160a01b03909216919091179055565b612fab565b612fcd565b612fef565b613011565b613e61611542613e5c61014054610860565b6139d0565b613e73611542613e5c61014254610860565b610143613e86611542613e5c8354610860565b613e98611542613e5c61014454610860565b613ea4611542306139d0565b613eb6611542613e5c61014154610860565b613f5e613ec1611753565b6064815260646020820152606460408201526064606082015260006080820152606460a0820152600060c0820152600060e0820152613f0f61010091613f0a8382016101f49052565b613a77565b613f59613f1a611753565b606481529160646020840152606460408401526064606084015260006080840152606460a0840152600060c0840152600060e084015282016101f49052565b613bde565b60014614613f6a575050565b80696f52410cf20743900000613f8b613f86613f929454610860565b61399a565b5554610860565b166000600080516020615e0e83398151915260405180613fc08190696f52410cf20743900000602083019252565b0390a3565b613fe6915060203d8111613fec575b613fde8183611730565b810190613957565b38613dda565b503d613fd4565b15613ffa57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61406460ff60005460081c16613ff3565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b61409760ff60005460081c16613ff3565b6117603361383b565b908160209103126104f657516107838161086c565b908160609103126104f6578051916040602083015192015190565b6001600160a01b03918216815291166020820152604081019190915260600190565b61014c5415806141bb575b6141a957336001600160a01b03821603614154575b8161411c8261399a565b541061413b576141378261412f8361399a565b54039161399a565b5590565b6040516370f21a0f60e01b815260048101839052602490fd5b8161416233610b998461397f565b541061418b578161417633610b998461397f565b540361418533610b998461397f565b55614112565b610be8604051928392637f12200160e01b84523390600485016140d0565b604051638574adcf60e01b8152600490fd5b506141c5816139d0565b54156140fd565b6a4a723dc6b40b8a9a000000908082029182048103611a4c576101345480600c0290600c820403611a4c576a084595161401484a0000008101809111611a4c5761421861421e926138d5565b9261394d565b8103908111611a4c5790565b610134549081600c0291600c830403611a4c576a084595161401484a000000828101809111611a4c5761425c91613917565b69d3c21bcecceda1000000918201809211611a4c5761427d610783926138d5565b9061394d565b3d156142ae573d90614294826117d6565b916142a26040519384611730565b82523d6000602084013e565b606090565b156104f657565b3561078381611b49565b6001600160801b039182169082160191908211611a4c57565b356001600160801b03811681036104f65790565b613bb261010061176092803561430681611b49565b60ff610145911660ff1982541617905561432c602082013561432781611b49565b613a02565b61433d6040820135613ab481611b49565b61434e6060820135613aca81611b49565b61435f6080820135613af881611b49565b61437060a0820135613b2981611b49565b61437f613b5a60c083016142ba565b61438e613b8b60e083016142ba565b016142dd565b613d126101006117609280356143a981611b49565b60ff610146911660ff198254161790556143cf60208201356143ca81611b49565b613a23565b6143e06040820135613c1b81611b49565b6143f16060820135613c3181611b49565b6144026080820135613c5f81611b49565b61441360a0820135613c9081611b49565b614422613cc160c083016142ba565b61438e613cf260e083016142ba565b6001600160401b0381116116be5760051b60200190565b60405190614455826116de565b600282526040366020840137565b634e487b7160e01b600052603260045260246000fd5b8051156144865760200190565b614463565b8051600110156144865760400190565b80518210156144865760209160051b010190565b90815180825260208080930193019160005b8281106144cf575050505090565b83516001600160a01b0316855293810193928101926001016144c1565b90608092614512919695949683526000602084015260a0604084015260a08301906144af565b6001600160a01b0390951660608201520152565b60405190614533826116f9565b61176082610100610146546145b960ff808316855261455d818460081c16602087019060ff169052565b60ff601084901c821616604086015260ff601884901c821616606086015260ff602084901c821616608086015260ff602884901c82161660a086015260ff603084901c82161660c08601528260381c1660e085019060ff169052565b60401c6001600160801b0316910152565b604051906145d7826116f9565b61176082610100610145546145b960ff808316855261455d818460081c16602087019060ff169052565b6001600160801b039182169082160391908211611a4c57565b60209081818403126104f6578051906001600160401b0382116104f657019180601f840112156104f657825161464f81614431565b9361465d6040519586611730565b818552838086019260051b8201019283116104f6578301905b828210614684575050505090565b81518152908301908301614676565b6040906107839392815281602082015201906144af565b916146b4836139b5565b541580156146c1846139b5565b541590811561014c541580615006575b6141a957610132918254151580614fff575b80614ff4575b80614fdc575b614e24575b6101369586541580614e13575b80614e09575b80614df3575b614b45575b60009280614b39575b80614b2d575b614948575b61472f9061422a565b958661473a8a61399a565b541061491c578890879380151580614913575b6148b3575b508454151590816148a9575b50156148a15761476d926152ba565b925b610138546147ec575b5050506147c46147e49161479e600080516020615e0e83398151915294610b9e8861399a565b6147a78761399a565b556147b5816113878761399a565b6147be8661399a565b556141cc565b6040519081526001600160a01b0393841694909316929081906020820190565b0390a3600190565b80614897575b80614886575b8061487a575b614868575415159081614860575b508061484f575b80614837575b61482557388080614778565b604051630949534d60e31b8152600490fd5b50614845816113878561399a565b6101395410614819565b50614859836139d0565b5415614813565b90503861480c565b604051630d47ce9560e11b8152600490fd5b5061013a5484116147fe565b50614890866139d0565b54156147f8565b50805415156147f2565b50509261476f565b905054153861475e565b93506148e6846148d66148c53061399a565b546148d0838d612f9e565b90613646565b6148df3061399a565b5589612f9e565b60405190815230906001600160a01b03841690600080516020615e0e83398151915290602090a338614752565b5088811061474d565b610be86149288a61399a565b546040516370f21a0f60e01b815260048101919091529081906024820190565b610146549092906149649060401c6001600160801b0316610c80565b9061496d614448565b9061498a3061497b84614479565b6001600160a01b039091169052565b6040516315ab88c960e31b8152917f0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb6001600160a01b031690602084600481855afa93841561085457614a25946149ec918591614b0f575b5061497b8361448b565b875415614b07578281614a0a611371614a0489612f7f565b8b613917565b60405163d06ca61f60e01b8152968792839260048401614693565b0381855afa91821561085457614a478493614a6c968591614aed575b5061448b565b51614a50615061565b6040518096819482936307c0329d60e21b845260048401614693565b03915afa9081156108545761472f93614a93614ab593614aba958491614acb575b50614479565b51885490925015614ac257614aaa614aaf91612f7f565b61392a565b90613917565b61422a565b929050614726565b50600190613917565b614ae791503d8086833e614adf8183611730565b81019061461a565b38614a8d565b614b0191503d8087833e614adf8183611730565b38614a41565b828188614a0a565b614b27915060203d81116115df576115d08183611730565b386149e2565b5061013b544211614721565b5061013d54151561471b565b614b50600161013655565b614b58614526565b6101335460e08201614b77614b7161202e835160ff1690565b83613917565b91614bdb614ba4614b9e614b9761010088019661427d6120d78951610c80565b8094612f9e565b9261422a565b614bb181610b9e3061399a565b614bba3061399a565b5561dead600052610148602052600080516020615e2e833981519152611387565b61dead600052610148602052600080516020615e2e83398151915255614bff614448565b90614c0d3061497b84614479565b6040516315ab88c960e31b81527f0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb6001600160a01b03169290602081600481875afa801561085457614c6a91600091614b0f575061497b8361448b565b823b156104f657614c99926000928360405180968195829463791ac94760e01b845242913091600486016144ec565b03925af193841561085457614dc360009594614d28614cf26120d78998978998978998614de0575b50614ce461202e614cea614cd6479851610c80565b614ce461202e8c5160ff1690565b90614601565b925160ff1690565b918580808088614d2d88614d28614d2261202e6020614d1961331561331561014054610860565b96015160ff1690565b89613917565b61394d565b905af150614d39614283565b508580808088614d6088614d28614d2261202e60a0614d1961331561331561014154610860565b905af150614d6c614283565b508580808088614d9388614d28614d2261202e60c0614d1961331561331561014254610860565b905af150614d9f614283565b50614aaf61202e6060614dba61331561331561014354610860565b97015160ff1690565b905af150614dcf614283565b50614ddb600061013655565b614712565b8061261e614ded926116ab565b38614cc1565b50614dfd3061399a565b5461013354111561470d565b5083541515614707565b50614e1d336139b5565b5415614701565b614e2f600161013655565b614e37614448565b614e443061497b83614479565b6040516315ab88c960e31b81526001600160a01b037f0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb81169291602081600481875afa801561085457614ea391600091614fbe575b5061497b8461448b565b8a614ed4611371614ecb614eb68d6138e6565b614aaf614ec66101355442612f9e565b612f6e565b62015180900490565b91614eea614ee18461422a565b6113873061399a565b614ef33061399a565b5560405183815230929190911690600080516020615e0e83398151915290602090a3604080516001600160a01b038d168152602081018390527fb6e3a64045ef03ce5db2fb6ba595e1b2bcb2cabcf8cf3751a0374c38ce95d6269190a1614f5c61014354610860565b92803b156104f657614f8b93600080946040519687958694859363791ac94760e01b85524292600486016144ec565b03925af1801561085457614fab575b50614fa6600061013655565b6146f4565b8061261e614fb8926116ab565b38614f9a565b614fd6915060203d81116115df576115d08183611730565b38614e99565b5062015180614fee6101355442612f9e565b106146ef565b5061013654156146e9565b50846146e3565b50615010876139d0565b5415801590615020575b156146d1565b5081801561501a5750615032866139d0565b54151561501a565b60405190615047826116de565b61014d54825261014e54602083015261014f546040830152565b61512e61331561331561013b5461013f9061507f613f868354610860565b549061508e61013e5482613646565b42116152a7576150b76150ad6150a76150c19342612f9e565b84613917565b61013d5490613917565b63337f9800900490565b9061510c6150f16113716150d361503a565b61013c548151918215158061529d575b61520c575b50905085613917565b926150fc8482612f9e565b926151074261013b55565b612f9e565b615119613f868554610860565b55806151c5575b5080615168575b5054610860565b803b156104f6576000809160046040518094819363fff6cae960e01b83525af180156108545761515b5750565b8061261e611760926116ab565b610144906151768254610860565b61518c615186836113878461399a565b9161399a565b55600080516020615e0e8339815191526151bc6147c46151b66151af8754610860565b9554610860565b936141cc565b0390a338615127565b600090600080516020615e0e8339815191526152036151e76151b68754610860565b6040519081526001600160a01b03909316929081906020820190565b0390a338615120565b602081019261521e4291855190613646565b11156152905760408101908282511160001461526457926152556148d092614aaf8561524e61525d985142612f9e565b9251612f9e565b90519061394d565b80386150e8565b9261525561528592614aaf61527d61528b975142612f9e565b915186612f9e565b90612f9e565b61525d565b905060409150015161525d565b50428311156150e3565b506150c16150b76150ad620151806150a7565b61078392916153726152ca6145ca565b6152d2614526565b85156153ee576152f56113716152ef6120d7610100860151610c80565b87613917565b955b156153d3575061137161531161202e615317935160ff1690565b85613917565b7fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac61536061013461535261534c858354613646565b61013455565b546040519182918583610bec565b0390a161014b546153c6575b84612f9e565b8061537f575b5050612f9e565b80615390615399926113873061399a565b6147be3061399a565b60405190815230916001600160a01b031690600080516020615e0e83398151915290602090a33880615378565b6153ce615464565b61536c565b6153e9915061531161202e611371925160ff1690565b615317565b6154056113716152ef6120d7610100850151610c80565b956152f7565b600160f01b8152620f4240600282015260220190565b92610783949261ffff61544f9316855260018060a01b0316602085015260a0604085015260a084019061074d565b9160006060820152608081840391015261074d565b600261012d541061176057615477615cd7565b9081519061013454926040918251906020826154a188838301919060206040840193600281520152565b03916154b5601f1993848101865285611730565b60005b6154c188612f8f565b8110156155da5761552d876154da613315606554610860565b6154ef6154e7858b61449b565b5161ffff1690565b908883519261550f846155038b820161540b565b038b8101865285611730565b845163040a7bb160e41b815295869485938493309060048601615421565b03915afa908115610854576000916155bc575b504711156155b1578061558261555b6154e76001948a61449b565b89516155788161556c89820161540b565b03898101835282611730565b4791893091613427565b615592613e086154e7838a61449b565b88518b8152600080516020615dee83398151915290602090a2016154b8565b509650505050505050565b6155d39150883d8a11613381576133708183611730565b5038615540565b5096956155f69293506155f09095949195612f8f565b9061449b565b519361ffff92858461560c6101315461ffff1690565b160361561b575b505050505050565b6156988180519561564a8761563e878b8301919060206040840193600181520152565b03878101895288611730565b615658613315606554610860565b9816978151906156798261566d8b820161540b565b03888101845283611730565b825163040a7bb160e41b8152938492839182918b308f60048601615421565b03915afa90811561085457600091615735575b50471115615613576156f4600080516020615dee833981519152946156de6156ea615702968a998651938491820161540b565b03908101835282611730565b4791309089613427565b519081529081906020820190565b0390a27f230478c51246d0634f4195a13660a4cadeac13f0a9dda431cf222657ca4e3cd2600080a2388080808080615613565b61574c9150823d8411613381576133708183611730565b50386156ab565b60208201805161ffff168061576e57505090611760916157f7565b6001810361578257505090611760916159cb565b60028103615796575050906117609161594a565b909150600303611a51576020826157b0935101019061592b565b90506101349081548082116157c5575b505050565b80820390828211611a4c5782146157c05781600080516020615e4e83398151915293556131ba60405192839283610bec565b815182016060838203126104f65761581260208401516104ea565b6040830151906001600160401b0382116104f65760609160208061583a930191860101612e34565b9201519160148151106158905761ffff61587d60207fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf93015160601c94856158cd565b6040519081529216918060208101613fc0565b60405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606490fd5b61014c54158061590a575b6141a9576001600160a01b0381166000908152610148602052604090205482810191908210611a4c576141379061399a565b506001600160a01b03811660009081526101496020526040902054156158d8565b91908260409103126104f65760208251615944816104ea565b92015190565b9061595e906020808251830101910161592b565b9190506101348054808411615974575b50505050565b830390838211611a4c57600080516020615d8e83398151915292600080516020615e4e833981519152856020948161ffff95556159b660405192839283610bec565b0390a16040519485521692a23880808061596e565b9061ffff615a037f66364361b7719378adaaece82e4f3dd05fb4403905005e073184bdda8bde2985926020808251830101910161592b565b9050610134908154808211615a79575b5050615a69615a38825460405191829160208301919060206040840193600381520152565b03615a4b601f1991828101845283611730565b615a5f60405191826156de6020820161540b565b4791309088613427565b54604051908152921691602090a2565b615a92600080516020615e4e8339815191529183612f9e565b615a9c8361013455565b835490615aae60405192839283610bec565b0390a160405190815282851690600080516020615d8e83398151915290602090a23880615a13565b60405160208101906000825260208152615aef816116c3565b51902090565b600052610130602052604060002090565b90801580615c4b575b615c3957615b1b615ad6565b91615b24611762565b9080825260208201938452604051615b5781615b496020820194859190602083019252565b03601f198101835282611730565b5190209261012d9283548015600014615baa57505050615b8f615ba09293615b8a83602090805161012e55015161012f55565b615af5565b906020600191805184550151910155565b613a1f8154613638565b8110615bf357505061012e5b600181015490615bc4615ad6565b8214615bd95750615bd490615af5565b615bb6565b615b8f915093806001615bee95960155615af5565b615ba0565b61012e94929394906000905b808210615c2157505091615b8f916001615bee95940190828254925552615af5565b9091615c31600180920154615af5565b920190615bff565b604051639f388f4f60e01b8152600490fd5b5061012d541515615b0f565b61012d90815415908115615c3957615c6d615ad6565b615c75611762565b9180835260208301918252604051615c9a81615b496020820194859190602083019252565b5190209215615cc05750615b8f615ba092615b8a83602090805161012e55015161012f55565b615bee92615b8f9161012f90828254925552615af5565b61012d546000198101908111611a4c57615cf081614431565b90615cfe6040519283611730565b808252601f19615d0d82614431565b016020903682850137604051615d22816116c3565b61012e54815261012f54828201526000905b838210615d42575050505090565b615d58615d53846001930151615af5565b61176f565b918251615d65828861449b565b520190615d3456fe8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572cee9fc88b383d33b29217576c2de6c2fb525518ae00dc253433482bacd6b0d300639a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0507b26d2faef43dd0872db8d8b90145607f42e66a0afb558c4f4219986ce68deddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef72cc341f8f047e2af0ffb69c33751f04fe14ab2ca72f91169a7ce11e05ee8a6e17a5e39f679219ca11323d647947a4ab5bf87d9eabaadcb2592dde4e9c5b6d3dfa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470daba264697066735822122075a8d12347510a55d1fbd7bb67bce811937853280dade45cbf0050eb6a67fa3864736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb
-----Decoded View---------------
Arg [0] : router (address): 0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008cfe327cec66d1c090dd72bd0ff11d690c33a2eb
Deployed Bytecode Sourcemap
2012:41532:19:-:0;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;1860:10:3;2012:41532:19;;929:10:16;1836:35:3;2012:41532:19;;;;1946:32:3;2306:62;1946:32;2120:175;2012:41532:19;1946:32:3;;2012:41532:19;;;;1946:19:3;2012:41532:19;;;;;;;1946:32:3;2012:41532:19;:::i;:::-;;;2128:42:3;;;;:70;;;;2012:41532:19;2128:124:3;;;;2012:41532:19;2120:175:3;;:::i;:::-;2012:41532:19;;;:::i;:::-;;;;;:::i;:::-;2306:62:3;;:::i;2128:124::-;2012:41532:19;;;;;;;:::i;:::-;;;;;;2202:22:3;2012:41532:19;;;;;;2228:24:3;2202:50;2128:124;;;:70;2174:24;;;-1:-1:-1;2128:70:3;;;2012:41532:19;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;;;;;;14999:48;2012:41532;14999:48;;:115;;;;;2012:41532;14999:168;;;;2012:41532;;;;;;;;;;14999:168;-1:-1:-1;;;957:52:7;;;-1:-1:-1;957:92:7;;;;14999:168:19;;;;;957:92:7;-1:-1:-1;;;1168:51:17;;-1:-1:-1;957:92:7;;;14999:115:19;-1:-1:-1;;;15064:50:19;;;-1:-1:-1;14999:115:19;;2012:41532;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;5957:28;2012:41532;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;2012:41532:19;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;2012:41532:19;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;4946:10:3;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;4946:35:3;;;;;2012:41532:19;;;;;;;;;;;;;;4946:35:3;;2012:41532:19;;4946:35:3;;2012:41532:19;4946:35:3;;;;;;;;2012:41532:19;;;4946:35:3;;;;:::i;:::-;2012:41532:19;;4946:35:3;;:::i;:::-;2012:41532:19;;;;;;;-1:-1:-1;;;;;2012:41532:19;;:::o;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;11849:10;;-1:-1:-1;4210:6:19;11837:11;4210:6;;;11837:32;4210:6;2012:41532;-1:-1:-1;4210:6:19;11837:32;:::i;:::-;2012:41532;;;;;;-1:-1:-1;;;;;2012:41532:19;;11849:10;;11894:37;;4210:6;;11894:37;4210:6;2012:41532;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;2012:41532:19;-1:-1:-1;2012:41532:19;6831:22:3;2012:41532:19;;;;;-1:-1:-1;2012:41532:19;;-1:-1:-1;2012:41532:19;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;17362:11;2012:41532;17362:16;;17393:33;17416:9;2012:41532;17393:33;:::i;:::-;17441:29;17464:5;2012:41532;17441:29;:::i;:::-;2012:41532;;;;;;;;;;;;;;;;;;;-1:-1:-1;2012:41532:19;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;5076:10:3;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;5076:38:3;;;;;2012:41532:19;;;;;;;;;;;;;;5076:38:3;;2012:41532:19;;5076:38:3;;2012:41532:19;5076:38:3;;;;;;;;2012:41532:19;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;3925:15;2012:41532;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;21282:101;;2012:41532;;;;;21394:80;;2012:41532;;;;;21485:95;;2012:41532;;;;;21591:89;;2012:41532;;;;21691:83;;2012:41532;21691:83;21740:34;;;:::i;21591:89::-;21642:38;;;:::i;:::-;21591:89;;;21485:95;21538:42;;;:::i;:::-;21485:95;;;21394:80;21442:32;;;:::i;:::-;21394:80;;;21282:101;21337:46;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;;;;;;21282:101;;;2012:41532;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;4210:6;-1:-1:-1;4210:6:19;12443:11;4210:6;;2012:41532;4210:6;2012:41532;-1:-1:-1;4210:6:19;12443:31;12478:17;;12463:10;;12443:31;;:::i;:::-;2012:41532;12443:52;12439:438;;2012:41532;;12896:40;;;;;:::i;:::-;2012:41532;;;;;;;;;;;;;;;12439:438;-1:-1:-1;4210:6:19;2012:41532;4210:6;12463:10;12516:31;12463:10;2012:41532;-1:-1:-1;4210:6:19;12516:31;:::i;:::-;2012:41532;12516:40;12512:230;;12463:10;2012:41532;12463:10;12896:40;12463:10;12808:57;12463:10;12808:31;12463:10;12808:19;;;:::i;:::-;:31;:::i;:::-;2012:41532;12808:57;:::i;:::-;12757:31;12463:10;12757:19;;;:::i;:31::-;2012:41532;12439:438;;;;;;;12512:230;12463:10;;12582:160;12692:31;12463:10;12692:19;;;:::i;:31::-;2012:41532;;;-1:-1:-1;;;12582:160:19;;2012:41532;;;;12582:160;;;:::i;:::-;;;;2012:41532;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;6788:18;2012:41532;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;15361:2;2012:41532;;;;;;;;;;;;;1303:62:12;;:::i;:::-;18060:21:19;;;;;18022:10;18014:82;;;;:::i;:::-;;2012:41532;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;6027:29;2012:41532;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;2012:41532:19;7117:19:3;2012:41532:19;;;;-1:-1:-1;2012:41532:19;;:::i;:::-;;;;;;7166:24:3;2012:41532:19;;;;:::i;:::-;;;;;;7194:22:3;7166:50;2012:41532:19;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;-1:-1:-1;4210:6:19;;;18401:15;2012:41532;4210:6;2012:41532;4210:6;;2012:41532;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;-1:-1:-1;2012:41532:19;927:53:3;2012:41532:19;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;:::i;:::-;1303:62:12;;;;;:::i;:::-;5241:10:3;2012:41532:19;-1:-1:-1;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;5241:55:3;;;;;2012:41532:19;5241:55:3;2012:41532:19;;;;;;;;;;;;;5241:55:3;;2012:41532:19;5241:55:3;;;:::i;:::-;;;;;;;;;;;2012:41532:19;;;5241:55:3;2012:41532:19;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;6764:17;2012:41532;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;4210:6:19;15810:12;2012:41532;4210:6;2012:41532;4210:6;-1:-1:-1;4210:6:19;2012:41532;4210:6;2012:41532;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;-1:-1:-1;4210:6:19;;;18568:19;2012:41532;4210:6;2012:41532;4210:6;;2012:41532;;;;;;;;-1:-1:-1;;2012:41532:19;;;;19897:16;2012:41532;;19862:24;2012:41532;;;;1303:62:12;;:::i;:::-;19099:10:19;2012:41532;19099:15;;;:70;;;;2012:41532;-1:-1:-1;19082:484:19;;;19196:20;;19215:1;19196:20;2012:41532;;19196:20;19576:28;2012:41532;;19576:28;2012:41532;;19576:28;19615:32;2012:41532;;19615:32;2012:41532;;19615:32;19658:62;2012:41532;;19658:62;2012:41532;;19658:62;19733:32;2012:41532;;19733:32;2012:41532;;19733:32;4210:6;19794:30;;;:56;;;19082:484;19786:65;;;:::i;:::-;19862:24;2012:41532;;19862:24;19897:16;2012:41532;;19794:56;-1:-1:-1;4210:6:19;19828:22;;;19794:56;;19082:484;19516:38;2012:41532;19326:16;2012:41532;19304:38;;19301:201;;19326:16;2012:41532;;19516:38;19082:484;;19301:201;19363:28;19376:15;19099:10;2012:41532;;19363:28;19412:30;19376:15;19412:30;2012:41532;;19412:30;19461:24;19480:5;19461:24;2012:41532;;19461:24;19326:16;2012:41532;;19099:70;19150:19;;;;:::i;:::-;19132:15;:37;19099:70;;;2012:41532;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::i;:::-;;;3625:22:7;2012:41532:19;;3621:224:7;2012:41532:19;;;3774:2:3;2012:41532:19;;3749:27:3;2012:41532:19;;-1:-1:-1;;;;;;;;;;;3819:75:3;3020:9:7;3046:51;3819:75:3;;3550:71;3774:2;2012:41532:19;3819:75:3;;;2012:41532:19;;;493:1:7;2012:41532:19;3429:15:3;2012:41532:19;;3429:35:3;2012:41532:19;493:1:7;2012:41532:19;;;;;;;;;;;3429:35:3;2012:41532:19;3494:15:3;3486:54;3494:15;;;3486:54;:::i;:::-;3558:31;;3550:71;:::i;:::-;2800:51:7;2012:41532:19;;2800:51:7;;:::i;:::-;2012:41532:19;;;2887:39:7;2012:41532:19;2887:39:7;2012:41532:19;;2887:39:7;;;;;;;:::i;:::-;;2012:41532:19;;2887:39:7;;;;;;:::i;:::-;3020:9;;;;:::i;:::-;2012:41532:19;;;;;;;;;;;;;3046:51:7;;;:::i;:::-;;;;2012:41532:19;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;3621:224:7;2012:41532:19;;;;-1:-1:-1;;;;;;;;;;;3621:224:7;3020:9;3046:51;3621:224;2012:41532:19;3621:224:7;;;2012:41532:19;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;1303:62:12;;:::i;:::-;9821:20:19;2012:41532;;;;;9817:34;;9821:20;2012:41532;;-1:-1:-1;;4210:6:19;;;2012:41532;;10028:43;10029:32;2012:41532;;10029:32;:::i;:::-;734:5:3;4210:6:19;;;;10028:43;10206:4;10185:48;10206:4;10185:27;10206:4;10185:27;:::i;:::-;2012:41532;10185:48;:::i;:::-;10155:27;10206:4;10155:27;:::i;:::-;2012:41532;;;;;;-1:-1:-1;;2012:41532:19;10206:4;;-1:-1:-1;;;;;;;;;;;;;10249:55:19;2012:41532;;10249:55;2012:41532;;-1:-1:-1;;;10382:27:19;;-1:-1:-1;;;;;2012:41532:19;10382:17;;2012:41532;;;10382:27;2012:41532;;;;10382:27;;;;;;;;;;;2012:41532;-1:-1:-1;2012:41532:19;;-1:-1:-1;;;10451:24:19;;;2012:41532;;;10451:24;;;;;;;;;;10364:112;10451:24;;;;;2012:41532;-1:-1:-1;2012:41532:19;;-1:-1:-1;;;10364:112:19;;10206:4;2012:41532;10364:112;;2012:41532;-1:-1:-1;;;;;2012:41532:19;;;4108:13;;;2012:41532;;;;;;;;;;4108:13;;;;;10364:112;;2012:41532;;10364:112;;;;;;;10683:365;10364:112;10683:365;10364:112;10349:127;10364:112;;;;;2012:41532;-1:-1:-1;;10349:127:19;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;10349:127;10544:74;:54;10206:4;10544:26;10206:4;10544:26;:::i;:54::-;-1:-1:-1;;2012:41532:19;;;10544:74;2012:41532;10959:16;2012:41532;;:::i;:::-;;;-1:-1:-1;;;10683:365:19;;10206:4;2012:41532;10683:365;;2012:41532;4108:13;;;2012:41532;;;4108:13;;;2012:41532;;;;10724:9;4108:13;;;2012:41532;-1:-1:-1;;;;;2012:41532:19;4108:13;;;2012:41532;11005:15;4108:13;;;2012:41532;;;;;-1:-1:-1;2012:41532:19;;;;4108:13;;;;;10683:365;;10724:9;;10683:365;;;;;;;;;2012:41532;;11091:33;:29;2012:41532;10349:127;2012:41532;;:::i;:::-;11091:29;:::i;:::-;9885:4;2012:41532;;;11091:33;11135:15;9885:4;11135:15;2012:41532;;11135:15;11161:28;11005:15;19099:10;2012:41532;;11161:28;11227:30;11005:15;19412:30;2012:41532;;11227:30;11268:24;19480:5;19461:24;2012:41532;;11268:24;11304:18;10266:1;11304:18;2012:41532;;11304:18;11333:24;11351:6;11333:24;2012:41532;;10683:365;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;10364:112;;;;;;-1:-1:-1;10364:112:19;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;10451:24;;;;;;;;;;;;;;:::i;:::-;;;;10382:27;;;;;;;;;;;;;;:::i;:::-;;;;2012:41532;;;;;;-1:-1:-1;;2012:41532:19;;;;;7083:43;2012:41532;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;1303:62:12;;:::i;:::-;11373:79:19;;:::i;2012:41532::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;11849:10;-1:-1:-1;4210:6:19;11837:11;2012:41532;4210:6;12478:17;;4210:6;;11837:32;4210:6;;-1:-1:-1;4210:6:19;11837:32;:::i;2012:41532::-;;;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;:::o;:::-;;:::i;:::-;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;:::o;:::-;4210:6;2012:41532;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;:::o;:::-;;;;;-1:-1:-1;;2012:41532:19;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;:::o;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;5814:30;2012:41532;;;;;;:::i;:::-;5814:30;2012:41532;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;-1:-1:-1;;2012:41532:19;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;911:85:4;;;2012:41532:19;911:85:4;2012:41532:19;;;;911:85:4;2012:41532:19;;;;;;;911:85:4;2012:41532:19;;:::i;:::-;911:85:4;:::i;:::-;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;-1:-1:-1;4210:6:19;;;22714:16;2012:41532;4210:6;2012:41532;4210:6;;2012:41532;;;;;;;;-1:-1:-1;;2012:41532:19;;;;1303:62:12;;:::i;:::-;2012:41532:19;;;;:::i;:::-;;;23360:120;2012:41532;;;;;;;;;;;;;;;;;:::i;:::-;2326:4:4;;;;929:10:16;2302:29:4;2012:41532:19;;;;;;;;;:::i;:::-;;;;;:::i;:::-;40274:73;;;;2012:41532;40274:73;;2012:41532;40363:21;;40359:759;40363:21;;;40359:759;;;;;;:::i;:::-;4763:1;40522:37;;4763:1;;40687:4;;;;;;:::i;40518:600::-;4808:1;40746:25;;4808:1;;40899:5;;;;;;:::i;40742:376::-;40959:25;;-1:-1:-1;4853:1:19;40959:25;4853:1;;40274:73;2012:41532;42869:73;2012:41532;;42869:73;;;;:::i;:::-;43134:14;;;2012:41532;;;43110:38;;;43106:428;;40955:163;43106:428;2012:41532;;;;;;;;;43344:179;;43106:428;43344:179;2012:41532;-1:-1:-1;;;;;;;;;;;2012:41532:19;;43455:52;2012:41532;;43455:52;;;;;:::i;:::-;;;;43344:179;2012:41532;;:::i;40955:163::-;2012:41532;;-1:-1:-1;;;41080:26:19;;;;;2012:41532;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;4210:6:19;15685:12;2012:41532;4210:6;2012:41532;15662:45;4210:6;-1:-1:-1;4210:6:19;2012:41532;15662:45;:::i;:::-;4210:6;2012:41532;;;;;;;;;;;;;;;;;;1303:62:12;;:::i;:::-;2758:6;2012:41532:19;;-1:-1:-1;;;;;;2012:41532:19;;;;;;;-1:-1:-1;;;;;2012:41532:19;-1:-1:-1;;;;;;;;;;;2012:41532:19;;2806:40:12;2012:41532:19;;;;;;;;;:::o;:::-;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;2012:41532:19;22113:22;22109:104;;2012:41532;;;;;;22329:4;;22261:84;22329:4;22261:84;;;;;;:::i;:::-;;;2012:41532;;22261:84;;;;;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;;;;;22223:19;2012:41532;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;22361:55;2012:41532;;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;;;;;;;;12478:17;;;2012:41532;;;;;;;;;;;;22361:55;;;;;:::i;:::-;;;;2012:41532;;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;22361:55;2012:41532;;;;;;;;;;;;;;;;;;;12478:17;;2012:41532;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22109:104;22152:49;2012:41532;;;;22152:49;:::i;:::-;22109:104;;;2012:41532;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;2012:41532:19;;;;-1:-1:-1;2012:41532:19;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;-1:-1:-1;2012:41532:19;799:51:3;2012:41532:19;;;;;-1:-1:-1;2012:41532:19;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;856:65:3;2012:41532:19;;;;;:::i;:::-;;;;;;;;:::i;:::-;;-1:-1:-1;2012:41532:19;856:65:3;2012:41532:19;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;856:65:3;2012:41532:19;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;1513:6:12;2012:41532:19;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;3752:42;4210:6;;15685:12;4210:6;;;;15662:45;4210:6;;;2012:41532;15662:45;:::i;:::-;3925:15;2012:41532;;;;;;;;;;4210:6;;;;15662:45;4210:6;;;;;2012:41532;15662:45;:::i;:::-;2012:41532;;;;;;;;;17066:14;2012:41532;;;;;;;;;16992:89;2012:41532;16992:89;;:::i;:::-;4210:6;2012:41532;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;986:23:3;2012:41532:19;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;2012:41532:19;;;;;;;:::i;:::-;;;;:::i;:::-;1303:62:12;;:::i;:::-;20198:242:19;:214;:183;:157;:125;:93;:60;:27;20206:18;;;:::i;:::-;2012:41532;;;;20198:27;:60;20241:17;;;;;:::i;20198:60::-;;;:::i;:::-;:93;20274:17;;;;;:::i;20198:93::-;:125;20307:16;;;;;:::i;20198:125::-;:157;20339:16;;;;;:::i;20198:157::-;:183;20371:10;;;;;:::i;20198:183::-;:214;20397:15;;;;;:::i;20198:214::-;:242;20428:12;;;;;:::i;20198:242::-;20476:250;:221;:189;:162;:129;:96;:62;:28;20484:19;;;:::i;20476:250::-;20772:13;;;20757:28;20772:13;;;;;:::i;:::-;20757:28;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;20757:28;;;;;;;:75;;2012:41532;20757:113;;;;;2012:41532;20757:152;;;;;2012:41532;20739:208;;;;4269:5;;;;:::i;:::-;;:::i;20739:208::-;20274:17;2012:41532;-1:-1:-1;;;20928:19:19;;2012:41532;;20928:19;20757:152;4269:5;2012:41532;;;20887:22;20757:152;;;;:113;4269:5;-1:-1:-1;20849:21:19;-1:-1:-1;20757:113:19;;;:75;20802:30;20818:14;;;;;;;;:::i;20802:30::-;2012:41532;;;20802:30;;20757:75;;;;2012:41532;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;734:5:3;22964:40:19;;22960:85;;23056:34;2012:41532;23101:25;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;23137:36;2012:41532;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;:::i;:::-;;-1:-1:-1;2012:41532:19;6054:19:3;2012:41532:19;;;;-1:-1:-1;2012:41532:19;;:::i;:::-;;;6107:16:3;2012:41532:19;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;6174:31:3;;;;:::i;:::-;2012:41532:19;;;;;;;:::i;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;5924:26;2012:41532;;;;;;;;;;;;;;:::i;:::-;1303:62:12;;;;:::i;:::-;2012:41532:19;;5801:47:3;;5842:4;;5801:47;5842:4;5801:47;;;;;;:::i;:::-;;2012:41532:19;5801:47:3;2012:41532:19;;5801:47:3;;;;;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;;;;;5763:19:3;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;5863:55:3;2012:41532:19;;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;;;;;;;12478:17;;;2012:41532;;;;;;;;;;;5863:55:3;;;;;:::i;2012:41532:19:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;5863:55:3;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;3666:53;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;12228:44;2012:41532;;;;;:::i;:::-;;;12242:10;;12228:44;:::i;:::-;2012:41532;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;746:47:3;2012:41532:19;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;6367:22:3;2012:41532:19;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;6332:20:3;2012:41532:19;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;6367:22:3;2012:41532:19;;;;;;;-1:-1:-1;;2012:41532:19;;;;;7133:31;2012:41532;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;734:5:3;2012:41532:19;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;17588:16;2012:41532;17606:12;2012:41532;17620:14;2012:41532;17636:15;2012:41532;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;:::i;:::-;1303:62:12;;;;:::i;:::-;4792:10:3;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;4792:62:3;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;4792:62:3;;2012:41532:19;;;;;4792:62:3;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4792:62:3;;;;;;;;;;2012:41532:19;4792:62:3;;;;;;:::i;:::-;;;:::i;2012:41532:19:-;;;-1:-1:-1;;2012:41532:19;;;;1303:62:12;;:::i;2012:41532:19:-;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;3636:1:13;2012:41532:19;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;3325:201:13;2012:41532:19;;;;;3301:14:13;3347:34;;;;;;2012:41532:19;3346:108:13;;;;2012:41532:19;3325:201:13;;:::i;:::-;3536:16;;2012:41532:19;;;3302:13:13;2012:41532:19;;;3302:13:13;2012:41532:19;;3536:16:13;3562:65;;3636:1;:::i;:::-;3647:99;;2012:41532:19;3647:99:13;3681:21;2012:41532:19;;3302:13:13;2012:41532:19;;3302:13:13;2012:41532:19;;3681:21:13;2012:41532:19;;3551:1:13;2012:41532:19;;3721:14:13;;2012:41532:19;;3721:14:13;2012:41532:19;3562:65:13;3596:20;2012:41532:19;;;3302:13:13;2012:41532:19;;;3302:13:13;2012:41532:19;;3596:20:13;3636:1;:::i;3346:108::-;3426:4;1713:19:15;:23;;-1:-1:-1;1713:23:15;3387:66:13;;3346:108;;;;;3387:66;3452:1;2012:41532:19;;;;3436:17:13;3387:66;;;3347:34;3380:1;2012:41532:19;;;3365:16:13;;-1:-1:-1;3347:34:13;;2012:41532:19;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;4808:1;2012:41532;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;2012:41532:19;2846:14:4;2012:41532:19;;2846:48:4;2012:41532:19;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;2846:48:4;:::i;:::-;2012:41532:19;2912:25:4;;;2012:41532:19;;3321:66:4;;;;2012:41532:19;;;;-1:-1:-1;3113:48:4;2012:41532:19;;;;3113:27:4;2012:41532:19;2987:80:4;2012:41532:19;;;;;;:::i;:::-;;;;;;2995:19:4;:34;2987:80;:::i;:::-;2012:41532:19;;;;911:85:4;2012:41532:19;;;;;;;3113:27:4;2012:41532:19;;:::i;3113:48:4:-;2012:41532:19;;;;;;:::i;:::-;;;:::i;:::-;;;3321:66:4;;;;;:::i;2012:41532:19:-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;1303:62:12;;:::i;:::-;18226:4:19;4210:6;;15685:12;4210:6;;18204:66;15662:45;4210:6;;;2012:41532;15662:45;:::i;:::-;18233:10;18226:4;18204:66;:::i;:::-;;2012:41532;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;15983:28;2012:41532;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;-1:-1:-1;4210:6:19;;;15983:11;4210:6;;2012:41532;4210:6;;15983:28;:::i;2012:41532::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;1303:62:12;;;:::i;:::-;6515:11:3;;2012:41532:19;;6628:47:3;;2012:41532:19;;;;-1:-1:-1;2012:41532:19;6562:15:3;2012:41532:19;;;6562:41:3;2012:41532:19;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;6562:41:3;2012:41532:19;;;6628:47:3;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;4763:1;2012:41532;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;;;;;1992:50:7;1303:62:12;;;:::i;:::-;2012:41532:19;;1929:48:7;2012:41532:19;;;;;;1929:48:7;2012:41532:19;;;;;;1992:50:7;2012:41532:19;;;;;;;;:::i;:::-;1303:62:12;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;;;;;;5543:19:3;2012:41532:19;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;5598:36:3;2012:41532:19;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;;;;;;;12478:17;;;2012:41532;;;;;;;;;;;5598:36:3;;;;;:::i;2012:41532:19:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5598:36:3;2012:41532:19;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;501:34:7;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;3752:42;4210:6;;15685:12;4210:6;;;;15662:45;4210:6;;;2012:41532;15662:45;:::i;:::-;3925:15;2012:41532;;;;;;;;;;4210:6;;;;15662:45;4210:6;;;;;2012:41532;15662:45;:::i;:::-;2012:41532;;;;;;;;;17229:14;2012:41532;;;;;;;;;4210:6;2012:41532;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;1303:62:12;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;2402:22:12;2012:41532:19;;2496:8:12;;;:::i;2012:41532:19:-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;;;;;:::i;:::-;;;;;:::i;:::-;4525:10:3;2012:41532:19;;;-1:-1:-1;;;4525:68:3;;2012:41532:19;;;;;4525:68:3;;2012:41532:19;;;;;;;;;4574:4:3;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;4525:68:3;;;;;;2012:41532:19;4525:68:3;-1:-1:-1;4525:68:3;;;2012:41532:19;;;;;;;;;:::i;4525:68:3:-;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;2012:41532:19;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;13296:4;2012:41532;;;;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;;;-1:-1:-1;;2012:41532:19;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2012:41532:19;;;;;;;;:::o;:::-;;;;;;;;;;;;;;4382:6;2012:41532;;;;;;;;:::o;:::-;;734:5:3;2012:41532:19;;;;;;;;:::o;:::-;-1:-1:-1;;2012:41532:19;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;21442:32;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::o;:::-;21538:42;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::o;:::-;21642:38;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::o;:::-;21740:34;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::o;1274:508:4:-;;;;1494:9;2012:41532:19;;-1:-1:-1;;;1510:102:4;;;;;;2012:41532:19;;;1510:102:4;;;2012:41532:19;;;;;;1510:102:4;2012:41532:19;1510:102:4;2012:41532:19;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;-1:-1:-1;;2012:41532:19;;;;;;;:::i;:::-;1510:102:4;2012:41532:19;;1510:102:4;;;;;;:::i;:::-;-1:-1:-1;2012:41532:19;;;;;;;;:::i;:::-;;;;;1510:102:4;2012:41532:19;;;;;;;1655:657:11;1468:4:4;;1655:657:11;;;;;2012:41532:19;1655:657:11;;;;1274:508:4;-1:-1:-1;1655:657:11;;;;;1670:8:4;1666:110;;1274:508;;;;;;:::o;1666:110::-;1758:6;;;:::i;:::-;1666:110;;;;;;;1655:657:11;2012:41532:19;;-1:-1:-1;1655:657:11;;1788:320:4;;;2012:41532:19;2035:66:4;1788:320;2012:41532:19;1788:320:4;;2012:41532:19;;;;;;2001:19:4;2012:41532:19;;;;-1:-1:-1;2012:41532:19;1950:14:4;2012:41532:19;;1950:48:4;2012:41532:19;;;;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1950:48:4;:::i;:::-;2012:41532:19;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;2035:66:4;;;1788:320::o;2012:41532:19:-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;1062:423:7:-;;;;;;;;;1336:40;2012:41532:19;;;;;;;1336:40:7;;;493:1;1336:40;;;2012:41532:19;;;;;;;;;;;:::i;:::-;;;;;;1336:40:7;2012:41532:19;;1336:40:7;;;;;;:::i;:::-;1393:85;:23;2012:41532:19;1393:10:7;2012:41532:19;;:::i;:::-;1393:23:7;:::i;:::-;2012:41532:19;;;;;;;;;;;;;1393:85:7;;1438:4;1393:85;;;;;:::i;:::-;;;;;;;;;;493:1;;;1393:85;;;1062:423;1386:92;;;1062:423;:::o;1393:85::-;;;;;;;;;;;-1:-1:-1;1393:85:7;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;2659:548:3;;;;;;2012:41532:19;;;;;;;;;2881:19:3;2012:41532:19;;3050:15:3;2012:41532:19;;;;;:::i;:::-;;2923:86:3;2012:41532:19;;2931:25:3;;2923:86;:::i;:::-;2012:41532:19;;3050:15:3;;:::i;:::-;3076:10;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;3076:124:3;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;;;;3076:124:3;;;;;2012:41532:19;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3076:124:3;;;;;;;;;;2659:548;:::o;3076:124::-;;;;:::i;:::-;2012:41532:19;;;2659:548:3;;;;2012:41532:19;;;;-1:-1:-1;2012:41532:19;2881:19:3;2012:41532:19;;3050:15:3;2012:41532:19;;-1:-1:-1;2012:41532:19;;:::i;:::-;;2923:86:3;2012:41532:19;;2931:25:3;;2923:86;:::i;3050:15::-;3076:10;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;3076:124:3;;;;;2012:41532:19;;-1:-1:-1;2012:41532:19;;;;;;;;;;;;;;;;;;3076:124:3;;;;;2012:41532:19;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;3906:383:3:-;2012:41532:19;;-1:-1:-1;2012:41532:19;4028:22:3;2012:41532:19;;;-1:-1:-1;2012:41532:19;;4077:21:3;;;4073:123;;3906:383;4213:32;2012:41532:19;;3906:383:3:o;2012:41532:19:-;;;;;;;;;;;;;;;;;;;;;;;;;4073:123:3;734:5;;-1:-1:-1;4073:123:3;;2012:41532:19;;19163:6;2012:41532;;;;;;;:::o;:::-;;9045:2:10;2012:41532:19;;;;;;;:::o;:::-;;1949:1:20;2012:41532:19;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;8865:2712:10;9027:50;9035:12;;;;:::i;:::-;:23;;9027:50;:::i;:::-;9087:63;2012:41532:19;;;9095:33:10;;9087:63;:::i;:::-;9194:2350;;;;;;;-1:-1:-1;9194:2350:10;;;;;;;8865:2712;:::o;9194:2350::-;;;;9045:2;9194:2350;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9194:2350:10;;9045:2;9194:2350;-1:-1:-1;;9194:2350:10;;;;8865:2712::o;9194:2350::-;;;;;;;;;;;;;;;;1599:130:12;1513:6;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;929:10:16;1662:23:12;2012:41532:19;;1599:130:12:o;2012:41532:19:-;;;;;;;;;;;;;;;;;;;;;;;;;2666:187:12;2758:6;2012:41532:19;;-1:-1:-1;;;;;2012:41532:19;;;-1:-1:-1;;;;;;2012:41532:19;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;2806:40:12;2666:187::o;2012:41532:19:-;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;3925:15;;;4552:2;3925:15;;4552:2;3925:15;;;;;:::o;:::-;;4269:5;3925:15;;;;;;;;;;;;;;;:::o;:::-;;2012:41532;3925:15;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;4210:6::-;;;;;734:5:3;4210:6:19;;:::o;:::-;2012:41532;;;4210:6;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;2012:41532;;;;;4210:6;;;;;;:::o;:::-;-1:-1:-1;;;;;2012:41532:19;4210:6;;;;12443:11;4210:6;;;;;;:::o;:::-;-1:-1:-1;;;;;2012:41532:19;4210:6;;;;10185:12;4210:6;;;;;;:::o;:::-;-1:-1:-1;;;;;2012:41532:19;4210:6;;;;11091:15;4210:6;;;;;;:::o;:::-;-1:-1:-1;;;;;2012:41532:19;4210:6;;;;8620:16;4210:6;;;;;;:::o;:::-;;2012:41532;;;;;;4210:6;;;;;;;;:::o;:::-;8914:261;4210:6;;8914:261;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;4210:6;;:::o;:::-;;;:::o;:::-;9186:262;4210:6;;9186:262;;-1:-1:-1;;2012:41532:19;;;;;;;;;;;4210:6;;:::o;:::-;-1:-1:-1;;4210:6:19;;;;;;;;;;:::o;:::-;;2012:41532;8914:261;2012:41532;;4210:6;;;:::i;:::-;;2012:41532;9186:262;2012:41532;;4210:6;;;:::i;:::-;;;;;2012:41532;4210:6;;2012:41532;8914:261;2012:41532;;;;;;;;;4210:6;2012:41532;4210:6;;;;2012:41532;4210:6;:::i;:::-;;;;;;;2012:41532;;;;4210:6;;:::i;:::-;;;;;;;2012:41532;;;;4210:6;8914:261;4210:6;;;;;;;;;;;;;;;;;;;;;;;2012:41532;;;;4210:6;8914:261;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;8914:261;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;8914:261;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;8914:261;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;:::i;:::-;8914:261;4210:6;;-1:-1:-1;;;;;;;;4210:6:19;;;;;;-1:-1:-1;;;;;;;4210:6:19;;;;;;;;;;;;;2012:41532;4210:6;;2012:41532;9186:262;2012:41532;;;;;;;;;4210:6;2012:41532;4210:6;;;;2012:41532;4210:6;:::i;:::-;;;;;;;2012:41532;;;;4210:6;;:::i;:::-;;;;;;;2012:41532;;;;4210:6;9186:262;4210:6;;;;;;;;;;;;;;;;;;;;;;;2012:41532;;;;4210:6;9186:262;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;9186:262;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;9186:262;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;;;;;;;2012:41532;;;;4210:6;9186:262;4210:6;;-1:-1:-1;;;;4210:6:19;;;;;;-1:-1:-1;;;4210:6:19;;;;;;;;;9186:262;4210:6;;-1:-1:-1;;;;;;;;4210:6:19;;;;;;-1:-1:-1;;;;;;;4210:6:19;;;;;;;;7536:2190;;;;;;1104:111:12;;:::i;:::-;1458:158:3;;;:::i;:::-;7977:44:19;4210:6;19733:32;2012:41532;;7977:44;8080:17;8096:1;8080:17;2012:41532;;8080:17;8108:39;4210:6;19862:24;2012:41532;;8108:39;8158:17;8108:39;2012:41532;19897:16;2012:41532;;8158:17;2012:41532;;;;;;8221:44;;;2012:41532;8221:44;2012:41532;;;;;;;;;8221:44;;;;;;8525:34;8221:44;8323:46;8423:42;8221:44;8209:62;8221:50;8380:32;8221:44;8476:38;8221:44;-1:-1:-1;8221:44:19;;;7536:2190;8221:50;;:::i;:::-;2012:41532;8209:62;2012:41532;;4210:6;;;;;;;;;8209:62;8282:28;;4210:6;8209:62;4210:6;2012:41532;;;;4210:6;2012:41532;;;;8282:28;;:::i;:::-;8323:46;2012:41532;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;8323:46;8380:32;:::i;:::-;8423:42;:::i;:::-;8476:38;:::i;:::-;8525:34;:::i;:::-;8620:42;:38;2012:41532;8323:46;2012:41532;;:::i;:::-;8620:38;:::i;:42::-;8673:40;:36;2012:41532;8423:42;2012:41532;;:::i;8673:40::-;8476:38;8724;:34;2012:41532;;;;:::i;8724:38::-;8773:36;:32;2012:41532;8525:34;2012:41532;;:::i;8773:36::-;8820:35;:31;8845:4;8820:31;:::i;:35::-;8866;:31;2012:41532;8380:32;2012:41532;;:::i;8866:35::-;4210:6;;;:::i;:::-;2012:41532;4210:6;;2012:41532;8221:44;8923:252;;4210:6;2012:41532;;8923:252;;4210:6;2012:41532;8923:252;;;4210:6;-1:-1:-1;8923:252:19;;;4210:6;2012:41532;;8923:252;;4210:6;-1:-1:-1;8923:252:19;;;4210:6;-1:-1:-1;2012:41532:19;8923:252;;4210:6;;8923:252;;;;;;2012:41532;4210:6;;;8923:252;4210:6;:::i;:::-;9196:252;4210:6;;:::i;:::-;2012:41532;4210:6;;9196:252;2012:41532;8221:44;9196:252;;4210:6;2012:41532;;9196:252;;4210:6;2012:41532;8923:252;9196;;4210:6;-1:-1:-1;8923:252:19;9196;;4210:6;2012:41532;;9196:252;;4210:6;-1:-1:-1;8923:252:19;9196;;4210:6;-1:-1:-1;2012:41532:19;9196:252;;4210:6;9196:252;;2012:41532;4210:6;;;9196:252;4210:6;:::i;:::-;2012:41532;9509:13;:18;9505:214;;7536:2190;;:::o;9505:214::-;2012:41532;4210:6;9586:30;2012:41532;;;;;:::i;:::-;9586:30;:::i;:::-;2012:41532;;;:::i;:::-;;-1:-1:-1;;;;;;;;;;;;2012:41532:19;;9653:54;;;2012:41532;4210:6;2012:41532;;;;;;9653:54;;;;7536:2190::o;8221:44::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2012:41532;;;;:::o;:::-;;;-1:-1:-1;;;2012:41532:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;5328:125:13;5366:69;2012:41532:19;5374:13:13;2012:41532:19;;;;5366:69:13;:::i;:::-;1556:53:3;2012:41532:19;;-1:-1:-1;;;;;;2012:41532:19;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;5328:125:13:o;:::-;5366:69;2012:41532:19;5374:13:13;2012:41532:19;;;;5366:69:13;:::i;:::-;1195:12:12;929:10:16;1195:12:12;:::i;4108:13:19:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;2012:41532;;4108:13;;;;;2012:41532;4108:13;;2012:41532;4108:13;:::o;2012:41532::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;;;;;;;:::o;13317:879::-;13515:16;2012:41532;13515:21;:53;;;13317:879;13512:84;;13622:10;-1:-1:-1;;;;;2012:41532:19;;13613:19;13609:352;;13317:879;13977:19;;;;:::i;:::-;2012:41532;13977:29;13973:69;;14101:19;14123;;;;:::i;:::-;2012:41532;;14101:19;;:::i;:::-;2012:41532;13317:879;:::o;13973:69::-;2012:41532;;-1:-1:-1;;;14015:27:19;;;;;2012:41532;;;;;12582:160;13609:352;13622:10;13653:30;13622:10;13653:18;;;:::i;:30::-;2012:41532;13653:40;13649:124;;13622:10;13873:30;13622:10;13873:18;;;:::i;:30::-;2012:41532;;13819:30;13622:10;13819:18;;;:::i;:30::-;2012:41532;13609:352;;13649:124;13719:54;2012:41532;;12582:160;;;;;;13719:54;;13622:10;13719:54;;;;;:::i;13512:84::-;2012:41532;;-1:-1:-1;;;13577:19:19;;;;;13515:53;13540:23;;;;:::i;:::-;2012:41532;13540:28;13515:53;;16027:502;3925:15;;;;;;;;;;;;16409:14;2012:41532;3925:15;4461:2;3925:15;;4461:2;3925:15;;;;;;2012:41532;;;;;;;16471:22;16497:23;16471:22;;:::i;:::-;16497:23;;:::i;:::-;2012:41532;;;;;;;16027:502;:::o;16537:370::-;16740:14;2012:41532;3925:15;;4461:2;3925:15;;4461:2;3925:15;;;;;;2012:41532;;;;;;;;16663:93;;;:::i;:::-;3925:15;2012:41532;;;;;;;;16786:72;16876:23;16786:72;;:::i;:::-;16876:23;;:::i;2012:41532::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;2012:41532:19;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;;;;2012:41532:19;;;;;;;:::o;4269:5::-;;;;;2012:41532;;;;;:::i;:::-;;20960:16;2012:41532;;;;;;;;;;4269:5;;;;2012:41532;;;;:::i;:::-;4269:5;:::i;:::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;:::i;:::-;;;;;2012:41532;;;;;:::i;:::-;;20987:18;2012:41532;;;;;;;;;;4269:5;;;;2012:41532;;;;:::i;:::-;4269:5;:::i;:::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;2012:41532;;;;:::i;4269:5::-;;;;;;;:::i;:::-;;;;;;;:::i;4382:6::-;-1:-1:-1;;;;;4382:6:19;;;;;;;;;:::o;:::-;;2012:41532;;;;;:::i;:::-;24664:1;4382:6;;;2012:41532;4382:6;;;2012:41532;4382:6::o;:::-;2012:41532;;;4382:6;;;;;;;;;2012:41532;;4382:6;;;;;;:::o;:::-;;:::i;:::-;2012:41532;;24582:1;4382:6;;;;;;;:::o;:::-;2012:41532;;4382:6;;;;;;;;;;;;:::o;4321:5::-;;2012:41532;;;;;;;;;;;;4321:5;-1:-1:-1;4321:5:19;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;2012:41532:19;;;4321:5;;;;;;;;;;;;;;;;;;;;;;2012:41532;;;4321:5;;;2012:41532;4321:5;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;4321:5;;;2012:41532;4321:5;2012:41532;4321:5::o;:::-;2012:41532;;;;;;:::i;:::-;4321:5;;;26426:7;2012:41532;4321:5;2012:41532;;;;4210:6;;4321:5;2012:41532;;;;;4321:5;;;4210:6;2012:41532;;4210:6;;;4321:5;2012:41532;;;;;;;;;4321:5;;4210:6;2012:41532;;;;;;;;4321:5;;;4210:6;2012:41532;4321:5;2012:41532;;;;;;4321:5;;;4210:6;2012:41532;;;;;;;;4321:5;;;4210:6;2012:41532;;;;;;;;4321:5;;;4210:6;2012:41532;;;;4321:5;;;4210:6;2012:41532;;4210:6;;;4321:5;2012:41532;;-1:-1:-1;;;;;2012:41532:19;4321:5;;4210:6;;4321:5;2012:41532;;;;;;:::i;:::-;4321:5;;;34757:6;2012:41532;4321:5;2012:41532;;;;4210:6;;4321:5;2012:41532;;;;;4321:5;;;4210:6;2012:41532;;4210:6;;;4321:5;-1:-1:-1;;;;;2012:41532:19;;;;;;4321:5;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;4321:5:19;;;;;;;;;;;;;;;;;;;:::i;:::-;2012:41532;;;;;;;:::i;:::-;4321:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;2012:41532;;4321:5;;;;;;;;;;;;;;;;2012:41532;;4321:5;;;;;;;;:::i;23756:8835::-;;23921:23;;;:::i;:::-;2012:41532;23921:28;;;23992:26;;;:::i;:::-;2012:41532;23992:31;;;;24063:16;2012:41532;24063:21;:160;;;23756:8835;24046:225;;24401:11;2012:41532;;;24401:16;;:46;;;23756:8835;24401:76;;;23756:8835;24401:143;;;23756:8835;24383:1323;;23756:8835;25981:8;2012:41532;;;25981:13;:248;;;23756:8835;25981:285;;;23756:8835;25981:350;;;23756:8835;25959:3122;;23756:8835;2012:41532;29157:53;;;;23756:8835;29157:100;;;23756:8835;29140:1065;;23756:8835;30238:30;;;:::i;:::-;30285:20;;;;;:::i;:::-;2012:41532;30285:33;30281:99;;30835:42;;;30891:25;;;;:62;;;23756:8835;30888:336;;23756:8835;2012:41532;;;31644:16;;:33;;;;23756:8835;-1:-1:-1;31644:160:19;;;31693:74;;;:::i;:::-;31644:160;;31820:13;2012:41532;31817:506;;31644:160;32358:20;;;32518:42;32490:71;32358:20;:33;-1:-1:-1;;;;;;;;;;;32358:20:19;;;;:::i;:33::-;32335:20;;;:::i;:::-;2012:41532;32428:44;:23;;;;:::i;:44::-;32402:23;;;:::i;:::-;2012:41532;32518:42;:::i;:::-;2012:41532;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;;;;;32490:71;;;;2012:41532;23756:8835;:::o;31817:506::-;31877:50;;;31817:506;31877:100;;;31817:506;31877:139;;;31817:506;31855:200;;2012:41532;32094:16;;:53;;;;31817:506;32094:106;;;;31817:506;32094:183;;;31817:506;32072:239;;31817:506;;;;;32072:239;2012:41532;;-1:-1:-1;;;32300:11:19;;;;;32094:183;32221:23;:44;:23;;;;:::i;:44::-;32268:9;2012:41532;-1:-1:-1;32094:183:19;;:106;32168:27;;;;:::i;:::-;2012:41532;32168:32;32094:106;;:53;;;;;;31855:200;2012:41532;;-1:-1:-1;;;32039:16:19;;;;;31877:139;2012:41532;32011:5;2012:41532;31998:18;;31877:139;;:100;31948:24;;;;:::i;:::-;2012:41532;31948:29;31877:100;;:50;2012:41532;;;31911:16;;31877:50;;31644:160;;;;;;:33;2012:41532;;;31664:13;31644:33;;;30888:336;30970:44;;31178:33;30970:44;31061:65;:27;31082:4;31061:27;:::i;:::-;2012:41532;31092:33;;;;:::i;:::-;31061:65;;:::i;:::-;31031:27;31082:4;31031:27;:::i;:::-;2012:41532;31178:33;;:::i;:::-;2012:41532;;;;;31082:4;;-1:-1:-1;;;;;2012:41532:19;;;-1:-1:-1;;;;;;;;;;;31146:66:19;2012:41532;;31146:66;30888:336;;;30891:62;30920:33;;;;30891:62;;30281:99;30340:40;30359:20;;;:::i;:::-;2012:41532;;;-1:-1:-1;;;30340:40:19;;;;;2012:41532;;;;;;;;;;;;29140:1065;29304:7;2012:41532;;;;29284:33;;2012:41532;;-1:-1:-1;;;;;2012:41532:19;20757:28;:::i;29284:33::-;29373:16;;;:::i;:::-;29422:4;29404:23;29422:4;29404:23;;;:::i;:::-;-1:-1:-1;;;;;2012:41532:19;;;4382:6;;;29404:23;2012:41532;;-1:-1:-1;;;29452:24:19;;2012:41532;29452:17;-1:-1:-1;;;;;2012:41532:19;;29452:24;2012:41532;29452:24;2012:41532;;29452:24;;;;;;;29524:200;29452:24;29442:34;29452:24;;;;;29140:1065;29442:34;;;;:::i;:::-;2012:41532;;29574:16;:111;;29624:21;;29614:41;:32;29624:21;;;:::i;:::-;29614:32;;:::i;:41::-;2012:41532;;-1:-1:-1;;;29524:200:19;;2012:41532;;;;;29452:24;29524:200;;;:::i;:::-;;;;;;;;;;;:203;:200;;29921:103;29524:200;;;;;29574:111;29524:203;;:::i;:::-;2012:41532;29491:236;;:::i;:::-;2012:41532;;;;;;;;;;;29921:103;;29452:24;29921:103;;;:::i;:::-;;;;;;;;;;30238:30;29921:103;:106;:257;:103;29880:313;29921:103;;;;;29574:111;29921:106;;:::i;:::-;2012:41532;;;;;-1:-1:-1;30053:16:19;:106;;30108:21;30098:32;30108:21;;:::i;:::-;30098:32;:::i;:::-;30053:106;29921:257;:::i;:::-;29880:313;:::i;:::-;29140:1065;;;;;30053:106;;2012:41532;30053:106;29921:257;:::i;:103::-;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;29524:200;;;;;;;;;;;;;:::i;:::-;;;;29574:111;;;;;;29452:24;;;;;;;;;;;;;;:::i;:::-;;;;29157:100;2012:41532;29245:12;2012:41532;29227:15;:30;29157:100;;:53;2012:41532;29189:16;2012:41532;29189:21;;29157:53;;25959:3122;26366:12;24582:1;24571:12;2012:41532;;26366:12;4321:5;;:::i;:::-;26484:13;2012:41532;26583:18;;;26540:61;;4210:6;;;2012:41532;;;;26540:61;;;:::i;:::-;26605:19;27017:37;26804:36;26666:34;26539:85;26605:19;;;4210:6;26539:85;4210:6;;;;:::i;26539:85::-;26666:34;;;:::i;:::-;26804:36;;:::i;:::-;26910:67;26931:4;26910:27;26931:4;26910:27;:::i;:67::-;26859:27;26931:4;26859:27;:::i;:::-;2012:41532;3752:42;4210:6;;26910:12;4210:6;;-1:-1:-1;;;;;;;;;;;27017:18:19;4210:6;27017:37;3752:42;4210:6;;26910:12;4210:6;;-1:-1:-1;;;;;;;;;;;2012:41532:19;27149:16;;:::i;:::-;26931:4;27184:23;26931:4;27184:23;;;:::i;:::-;2012:41532;;-1:-1:-1;;;27236:24:19;;:17;-1:-1:-1;;;;;2012:41532:19;;;27236:24;2012:41532;27236:24;2012:41532;;27236:24;;;;;;27226:34;27236:24;2012:41532;27236:24;;;27226:34;;;;:::i;:::-;27281:293;;;;;;2012:41532;;;;;;;;;;;;;;;27281:293;;27536:15;26931:4;;27281:293;27236:24;27281:293;;;:::i;:::-;;;;;;;;;;28956:53;2012:41532;27281:293;;28957:34;27721:134;27746:109;27281:293;;;;;;;;;;25959:3122;27615:21;27746:109;4210:6;27746:67;4210:6;27615:21;4210:6;;;:::i;:::-;27746:67;4210:6;;;2012:41532;;;;27746:67;;;:::i;:::-;4210:6;;2012:41532;;;;27721:134;2012:41532;;;;;;28393:79;2012:41532;28394:35;;4210:6;27236:24;28329:34;:29;2012:41532;28337:20;2012:41532;;:::i;28329:34::-;28406:23;;4210:6;2012:41532;;;;28394:35;;;:::i;:::-;28393:79;:::i;:::-;28329:166;;;;;;:::i;:::-;;2012:41532;;;;;28594:47;2012:41532;28595:28;;4210:6;2012:41532;28537:27;:22;2012:41532;28545:13;2012:41532;;:::i;28594:47::-;28537:127;;;;;;:::i;:::-;;2012:41532;;;;;28773:52;2012:41532;28774:33;;4210:6;28786:21;28711:32;:27;2012:41532;28719:18;2012:41532;;:::i;28773:52::-;28711:137;;;;;;:::i;:::-;;28957:34;4210:6;28969:22;28896:30;:25;2012:41532;28904:16;2012:41532;;:::i;28896:30::-;28969:22;;4210:6;2012:41532;;;;28956:53;28896:136;;;;;;:::i;:::-;;29053:12;2012:41532;24571:12;2012:41532;;29053:12;25959:3122;;27281:293;;;;;;:::i;:::-;;;;25981:350;26308:4;26287:27;26308:4;26287:27;:::i;:::-;2012:41532;26318:13;2012:41532;-1:-1:-1;26287:44:19;25981:350;;:285;2012:41532;;;26250:16;;25981:285;;:248;26213:10;26197:27;26213:10;26197:27;:::i;:::-;2012:41532;26197:32;25981:248;;24383:1323;24571:12;24582:1;24571:12;2012:41532;;24571:12;24650:16;;:::i;:::-;24681:23;24699:4;24681:23;;;:::i;:::-;2012:41532;;-1:-1:-1;;;24729:24:19;;-1:-1:-1;;;;;24729:17:19;2012:41532;;;;24729:24;2012:41532;24729:24;2012:41532;;24729:24;;;;;;24719:34;24729:24;2012:41532;24729:24;;;24383:1323;24719:34;;;;:::i;:::-;24803:36;24802:177;:151;24803:110;:36;;;:::i;:::-;24860:52;24883:28;24901:10;2012:41532;24883:15;:28;:::i;:::-;24860:52;:::i;24803:110::-;4382:6;4210;;;;24802:177;25018:80;25162:66;25018:80;;;:::i;:::-;25162:27;24699:4;25162:27;:::i;:66::-;25115:27;24699:4;25115:27;:::i;:::-;2012:41532;;;;;;24699:4;;2012:41532;;;;;-1:-1:-1;;;;;;;;;;;25248:57:19;2012:41532;;25248:57;2012:41532;;;-1:-1:-1;;;;;2012:41532:19;;;;4321:5;;;2012:41532;;;25325:43;;2012:41532;25325:43;2012:41532;25592:16;2012:41532;;:::i;:::-;25385:280;;;;;;;2012:41532;;;;;;;;;;;;;;;;25385:280;;24883:15;25385:280;24729:24;25385:280;;;:::i;:::-;;;;;;;;;;;24383:1323;25682:12;;2012:41532;24571:12;2012:41532;;25682:12;24383:1323;;25385:280;;;;;;:::i;:::-;;;;24729:24;;;;;;;;;;;;;;:::i;:::-;;;;24401:143;2012:41532;4382:6;24494:28;24512:10;2012:41532;24494:15;:28;:::i;:::-;:50;24401:143;;:76;2012:41532;24464:8;2012:41532;24464:13;24401:76;;:46;;;;;24063:160;24108:24;;;;:::i;:::-;2012:41532;24108:29;;;:100;;;24063:160;24088:135;24063:160;;24108:100;24159:48;;;;24108:100;24159:48;24175:27;;;;:::i;:::-;2012:41532;24175:32;;24108:100;;2012:41532;;;;;;;:::i;:::-;33111:3;2012:41532;;;;;;;;;;;;;;;:::o;32599:1964::-;34520:33;:28;2012:41532;32664:12;2012:41532;32722:12;2012:41532;32709:26;2012:41532;;;;:::i;32709:26::-;2012:41532;;32800:34;32819:15;2012:41532;32800:34;;:::i;:::-;32781:15;:53;:127;;32958:70;:37;32851:34;32958:104;32781:15;;32851:34;:::i;:::-;32958:37;;:::i;:::-;33012:16;2012:41532;32958:70;;:::i;:::-;3925:15;4210:6;;;;32958:104;2012:41532;34056:28;33868:38;:29;2012:41532;;:::i;:::-;33148:14;2012:41532;;;33190:25;;;;:82;;;32781:127;33173:658;;32781:127;33868:29;;;;;:::i;:38::-;33940:31;;;;;:::i;:::-;32781:15;33984:30;32781:15;19412:30;2012:41532;;33984:30;34056:28;:::i;:::-;34027:26;2012:41532;;;;:::i;34027:26::-;2012:41532;34100:17;34097:127;;32781;34239:19;;34236:225;;32781:127;2012:41532;;;:::i;34520:33::-;:35;;;;;-1:-1:-1;2012:41532:19;;34520:35;2012:41532;;;;;;;;;34520:35;;;;;;;;;;32599:1964;:::o;34520:35::-;;;;;;:::i;34236:225::-;34319:14;2012:41532;;;;;:::i;:::-;34275:28;34306:45;:28;;;;:::i;:45::-;34275:28;;:::i;:::-;2012:41532;-1:-1:-1;;;;;;;;;;;34371:78:19;34410:38;2012:41532;;;;;:::i;:::-;;;;:::i;:::-;34410:38;;:::i;34371:78::-;;;;34236:225;;;34097:127;-1:-1:-1;2012:41532:19;-1:-1:-1;;;;;;;;;;;34139:73:19;34175:36;2012:41532;;;;:::i;34175:36::-;2012:41532;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;;;;;;;;34139:73;;;;34097:127;;;33173:658;33325:16;;;32781:15;33302:39;32781:15;2012:41532;;;33302:39;;:::i;:::-;:57;32781:15;;;33417:19;;;2012:41532;;;;33417:34;:312;;;;2012:41532;33491:79;:98;2012:41532;33535:34;2012:41532;33492:38;33475:115;2012:41532;;32781:15;33492:38;:::i;:::-;2012:41532;;33535:34;:::i;33491:79::-;2012:41532;;33491:98;;:::i;33475:115::-;33173:658;;;;33417:312;2012:41532;33630:79;:98;2012:41532;33674:34;33631:38;33614:115;2012:41532;;32781:15;33631:38;:::i;:::-;2012:41532;;33674:34;;:::i;33630:98::-;33614:115;;:::i;:::-;33417:312;;33299:521;33785:19;;;;;;2012:41532;33299:521;;33190:82;32781:15;;33233:39;;;33190:82;;32781:127;;32958:104;:70;:37;32902:6;32781:127;;34571:1679;36216:26;34571:1679;;35815:35;4321:5;;:::i;:::-;;;:::i;:::-;34913:123;;;;34935:42;34936:31;;4210:6;34949:18;;;4210:6;;:::i;34936:31::-;;;:::i;34935:42::-;34913:123;;35099:133;;;4210:6;35122:36;;4210:6;35121:47;4210:6;;2012:41532;;;;35122:36;;;:::i;35121:47::-;35614:44;;35562:14;35545:53;35562:36;2012:41532;;;35562:36;:::i;:::-;:14;2012:41532;;35545:53;2012:41532;;;35614:44;;;;;;:::i;:::-;;;;35674:28;2012:41532;35671:99;;35099:133;35815:35;;:::i;:::-;35865:26;35861:338;;35099:133;36216:26;;;:::i;35861:338::-;35976:4;35955:68;36127:45;35976:4;35955:27;35976:4;35955:27;:::i;:68::-;35908:27;35976:4;35908:27;:::i;36127:45::-;2012:41532;;;;;35976:4;;-1:-1:-1;;;;;2012:41532:19;;-1:-1:-1;;;;;;;;;;;36043:144:19;2012:41532;;36043:144;35861:338;;;;35671:99;;;:::i;:::-;;;35099:133;35184:48;4210:6;;35185:37;4210:6;35185:37;4210:6;;2012:41532;;;;35184:48;35099:133;;34913:123;34993:43;34994:32;;4210:6;35007:19;;;4210:6;;:::i;34993:43::-;34913:123;;;4168:9;-1:-1:-1;;;4168:9:19;;;;;;2012:41532;4168:9;;;:::o;:::-;;;;;2012:41532;4168:9;;2012:41532;;;;;;;;;4168:9;;;2012:41532;;4168:9;;;;2012:41532;4168:9;;;;:::i;:::-;;36821:13;4168:9;;;2012:41532;4168:9;;;;;;;;:::i;36740:3303::-;36837:1;36821:6;2012:41532;36821:17;36817:30;;36893:24;;:::i;:::-;2012:41532;;;;37029:14;2012:41532;;;;;;37096:43;;;;;;;;2012:41532;;;;;;;;;;;;;37096:43;;2012:41532;37096:43;2012:41532;;37096:43;;;;;;;;:::i;:::-;-1:-1:-1;37157:13:19;37183:21;;;:::i;:::-;37172:32;;;;;37259:239;2012:41532;37259:23;2012:41532;37259:10;2012:41532;;:::i;37259:23::-;37301:32;37308:24;;;;:::i;:::-;2012:41532;;;;;37301:32;2012:41532;;;;37436:47;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;2012:41532;;-1:-1:-1;;;37259:239:19;;2012:41532;;;;;;;37360:4;;37259:239;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;37259:239:19;;;37157:13;-1:-1:-1;37519:21:19;:35;;;;37673:24;38212:21;37666:32;37673:24;37203:1;37673:24;;;:::i;37666:32::-;2012:41532;;38142:47;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;38212:21;37360:4;;;38212:21;;:::i;:::-;38276:131;38315:32;38322:24;;;;:::i;38276:131::-;2012:41532;;;;;-1:-1:-1;;;;;;;;;;;38276:131:19;2012:41532;;38276:131;4168:9;37157:13;;37515:1112;38605:7;;;;;;;;;:::o;37259:239::-;;;;;;;;;;;;;;:::i;:::-;;;;;37172:32;;;;38677:37;37172:32;;;38692:21;37172:32;;;;;38692:21;:::i;:::-;38677:37;;:::i;:::-;2012:41532;;;4210:6;;;;38729:9;4210:6;2012:41532;;;;4210:6;2012:41532;38729:29;38725:1311;;37152:1486;36740:3303;;;;;;:::o;38725:1311::-;38895:231;2012:41532;;;38787:55;;;;;;;;2012:41532;;;;;;;;;;;;;38787:55;;;;;;;;;:::i;:::-;38895:23;2012:41532;37259:10;2012:41532;;:::i;38895:23::-;2012:41532;;;;;39064:47;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;2012:41532;;-1:-1:-1;;;38895:231:19;;2012:41532;;;;;;;;37360:4;2012:41532;37259:239;38895:231;;;:::i;:::-;;;;;;;;;;-1:-1:-1;38895:231:19;;;38725:1311;39147:21;;:35;39143:882;38725:1311;39143:882;39754:21;-1:-1:-1;;;;;;;;;;;2012:41532:19;39684:47;;39818:123;2012:41532;;;;;39684:47;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;39754:21;37360:4;;39754:21;;;:::i;:::-;2012:41532;;;;;;;;;;;;39818:123;;;;39965:44;-1:-1:-1;39965:44:19;;39143:882;;;;;;38725:1311;;38895:231;;;;;;;;;;;;;;:::i;:::-;;;;;40051:1074;40274:73;;;;;2012:41532;;40363:21;;;40359:759;;;;;;:::i;:::-;4763:1;40522:37;;4763:1;;40687:4;;;;;;:::i;40518:600::-;4808:1;40746:25;;4808:1;;40899:5;;;;;;:::i;40742:376::-;40959:25;;-1:-1:-1;4853:1:19;40959:25;4853:1;;40274:73;2012:41532;42869:73;2012:41532;;42869:73;;;;:::i;:::-;43134:14;;;2012:41532;;;43110:38;;;43106:428;;40955:163;;;;2012:41532::o;43106:428::-;2012:41532;;;;;;;;;43344:179;;43106:428;43344:179;2012:41532;-1:-1:-1;;;;;;;;;;;2012:41532:19;;43455:52;2012:41532;;43455:52;;;;;:::i;40359:759::-;2012:41532;;3267:43:7;;2012:41532:19;;;;;;;4210:6;3267:43:7;;;4210:6:19;;:::i;:::-;2012:41532;;;;;-1:-1:-1;;;;;2012:41532:19;;;;;3267:43:7;;;2012:41532:19;3267:43:7;;2012:41532:19;;;;;:::i;:::-;;;;;11715:2:10;2012:41532:19;;11689:28:10;2012:41532:19;;;3381:34:7;3267:43;3430:41;11783:119:10;;;2012:41532:19;11783:119:10;3381:34:7;;;:::i;:::-;2012:41532:19;;;;;;;;;;;;3430:41:7;2012:41532:19;;;;-1:-1:-1;;;2012:41532:19;;3267:43:7;2012:41532:19;;;;;;;;;-1:-1:-1;;;2012:41532:19;;;;;;;14204:369;14365:16;2012:41532;14365:21;:58;;;14204:369;14362:89;;-1:-1:-1;;;;;2012:41532:19;;-1:-1:-1;4210:6:19;;;14506:12;4210:6;;;;;2012:41532;;;;;;;-1:-1:-1;2012:41532:19;;14479:24;;;:::i;14365:58::-;-1:-1:-1;;;;;;2012:41532:19;;-1:-1:-1;4210:6:19;;;14390:16;4210:6;;;;;2012:41532;14390:33;14365:58;;2012:41532;;;;;;;;;;;4210:6;;;;;:::i;:::-;2012:41532;;;;:::o;41133:1418::-;;41328:73;41133:1418;41328:73;2012:41532;;;41328:73;;;;;;:::i;:::-;41473:14;;;;2012:41532;;41459:28;;;41455:258;;41133:1418;;;;;:::o;41455:258::-;2012:41532;;;;;;;;-1:-1:-1;;;;;;;;;;;2012:41532:19;-1:-1:-1;;;;;;;;;;;2012:41532:19;41328:73;2012:41532;;;;;41607:30;2012:41532;;41607:30;;;;;:::i;:::-;;;;2012:41532;;;;;;41657:44;;41455:258;;;;;;41133:1418;;2012:41532;41328:73;42489:43;41133:1418;41328:73;2012:41532;;;41328:73;;;;;;:::i;:::-;41473:14;;;2012:41532;;;41459:28;;;41455:258;;41133:1418;2012:41532;;42433:21;41920:39;2012:41532;;;;41920:39;;;41328:73;41920:39;;2012:41532;;;;;;;;;;;;;41920:39;;;2012:41532;;41920:39;;;;;;;;:::i;:::-;42311:47;2012:41532;;42311:47;;;41328:73;42311:47;;;:::i;:::-;42433:21;42162:4;;42433:21;;;:::i;:::-;2012:41532;;;;;;;;;;;42489:43;41133:1418::o;41455:258::-;41516:28;-1:-1:-1;;;;;;;;;;;41516:28:19;;;:::i;:::-;41559;;35562:14;2012:41532;;41559:28;2012:41532;;;41607:30;2012:41532;;41607:30;;;;;:::i;:::-;;;;2012:41532;;;;;;;;;-1:-1:-1;;;;;;;;;;;41657:44:19;2012:41532;;41657:44;41455:258;;;;360:56:20;2012:41532:19;;402:13:20;;;2012:41532:19;413:1:20;2012:41532:19;;402:13:20;;;;;;:::i;:::-;2012:41532:19;392:24:20;;360:56;:::o;392:24::-;;;1512:13;392:24;;;;;;:::o;425:1533::-;;524:13;;:33;;;425:1533;521:64;;669:12;;:::i;:::-;2012:41532:19;;;:::i;:::-;;;;;635:48:20;;;2012:41532:19;;;;;726:16:20;;;635:48;726:16;;;;2012:41532:19;;;;;;;;726:16:20;;2012:41532:19;;726:16:20;;;;;;:::i;:::-;2012:41532:19;716:27:20;;22152:6:19;;2012:41532;;;759:16:20;;756:1155;759:16;;;392:24;;;835:26;392:24;;;;;;;2012:41532:19;;801:9:20;2012:41532:19;392:24:20;;;2012:41532:19;392:24:20;;835:26;:::i;:::-;392:24;;;;2012:41532:19;;;;392:24:20;;;;2012:41532:19;392:24:20;;1935:15;2012:41532:19;;1935:15:20;:::i;756:1155::-;901:23;;;;1006:39;;1036:9;1060:127;1036:9;1066:15;;2012:41532:19;1085:12:20;;;:::i;:::-;1066:31;;;;1141:30;;;;:::i;:::-;1060:127;;1066:31;1274:26;1066:31;;;;1036:9;392:24;1066:31;;1201:15;2012:41532:19;1274:26:20;:::i;392:24::-;756:1155;;898:1013;1391:9;1361:39;;;;1415:13;536:1;1443:171;1449:19;;;;;;1746:15;;;1863:26;1746:15;1391:9;392:24;1746:15;;;2012:41532:19;;;;;;;1863:26:20;:::i;1443:171::-;1391:9;;1512:30;1391:9;1526:15;;;2012:41532:19;1512:30:20;:::i;:::-;4168:9:19;;1443:171:20;;;521:64;2012:41532:19;;-1:-1:-1;;;566:19:20;;;;;524:33;2012:41532:19;22152:6;2012:41532;541:16:20;;524:33;;425:1533;8282:6:19;2012:41532;;;541:16:20;;;;521:64;;669:12;;:::i;:::-;2012:41532:19;;:::i;:::-;;;;;635:48:20;;;2012:41532:19;;;;;726:16:20;;;635:48;726:16;;;;2012:41532:19;;;;;;;;726:16:20;2012:41532:19;716:27:20;;;759:16;;;392:24;835:26;392:24;;;;;;2012:41532:19;;801:9:20;2012:41532:19;392:24:20;;;2012:41532:19;392:24:20;756:1155;392:24;1746:15;1863:26;1746:15;;2012:41532:19;;;;;;;1863:26:20;:::i;2070:501::-;36821:6:19;2012:41532;-1:-1:-1;;2012:41532:19;;;;;;;4382:6;;;:::i;:::-;2012:41532;;;;;;;:::i;:::-;4382:6;;;-1:-1:-1;;2012:41532:19;4382:6;2012:41532;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2305:9:20;2012:41532:19;;;;;;;;;12478:17;2325:209:20;2344:22;;;;;;2544:19;;;;2070:501;:::o;2329:13::-;2012:41532:19;2400:24:20;2414:9;2012:41532:19;2414:9:20;;392:24;2400;:::i;:::-;2012:41532:19;:::i;:::-;;;;2439:31:20;;;;:::i;:::-;2012:41532:19;4168:9;2329:13:20;;
Swarm Source
ipfs://75a8d12347510a55d1fbd7bb67bce811937853280dade45cbf0050eb6a67fa38
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.