Latest 25 from a total of 21,331 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 24500345 | 38 hrs ago | IN | 0 ETH | 0.00000324 | ||||
| Withdraw | 24498374 | 45 hrs ago | IN | 0 ETH | 0.00007615 | ||||
| Withdraw | 24494978 | 2 days ago | IN | 0 ETH | 0.00019765 | ||||
| Withdraw | 24493110 | 2 days ago | IN | 0 ETH | 0.00018288 | ||||
| Withdraw | 24484981 | 3 days ago | IN | 0 ETH | 0.00022901 | ||||
| Withdraw | 24484978 | 3 days ago | IN | 0 ETH | 0.00022728 | ||||
| Withdraw | 24484977 | 3 days ago | IN | 0 ETH | 0.00026375 | ||||
| Withdraw | 24484668 | 3 days ago | IN | 0 ETH | 0.00021001 | ||||
| Withdraw | 24484050 | 3 days ago | IN | 0 ETH | 0.00022255 | ||||
| Withdraw | 24484047 | 3 days ago | IN | 0 ETH | 0.00022343 | ||||
| Withdraw | 24484045 | 3 days ago | IN | 0 ETH | 0.00022246 | ||||
| Withdraw | 24484040 | 3 days ago | IN | 0 ETH | 0.00022177 | ||||
| Withdraw | 24484033 | 3 days ago | IN | 0 ETH | 0.00022187 | ||||
| Withdraw | 24484032 | 3 days ago | IN | 0 ETH | 0.00022256 | ||||
| Withdraw | 24484024 | 3 days ago | IN | 0 ETH | 0.00022191 | ||||
| Withdraw | 24484024 | 3 days ago | IN | 0 ETH | 0.00022191 | ||||
| Withdraw | 24484022 | 3 days ago | IN | 0 ETH | 0.00022116 | ||||
| Withdraw | 24484015 | 3 days ago | IN | 0 ETH | 0.00022144 | ||||
| Withdraw | 24484012 | 3 days ago | IN | 0 ETH | 0.00022164 | ||||
| Withdraw | 24484010 | 3 days ago | IN | 0 ETH | 0.00022234 | ||||
| Withdraw | 24481043 | 4 days ago | IN | 0 ETH | 0.00000302 | ||||
| Withdraw | 24477414 | 4 days ago | IN | 0 ETH | 0.00018915 | ||||
| Withdraw | 24477083 | 4 days ago | IN | 0 ETH | 0.00007922 | ||||
| Withdraw | 24477080 | 4 days ago | IN | 0 ETH | 0.00009835 | ||||
| Withdraw | 24476886 | 4 days ago | IN | 0 ETH | 0.00001441 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24329584 | 25 days ago | 0.00005644 ETH | ||||
| Transfer | 24202373 | 43 days ago | 12.30754538 ETH | ||||
| Transfer | 24029786 | 67 days ago | 12.30754538 ETH | ||||
| Transfer | 23434840 | 150 days ago | 12.30754538 ETH | ||||
| Transfer | 22970530 | 215 days ago | 12.30754538 ETH | ||||
| Transfer | 21297327 | 449 days ago | 12.30754538 ETH | ||||
| Transfer | 20115701 | 614 days ago | 12.30754538 ETH | ||||
| Transfer | 20020273 | 627 days ago | 12.30754538 ETH | ||||
| Transfer | 19198969 | 742 days ago | 12.30754538 ETH | ||||
| Transfer | 18789526 | 800 days ago | 12.30754538 ETH | ||||
| Transfer | 18787741 | 800 days ago | 0.00005644 ETH | ||||
| Transfer | 18787705 | 800 days ago | 0.00005644 ETH | ||||
| Transfer | 18786935 | 800 days ago | 0.19152792 ETH | ||||
| Transfer | 18738018 | 807 days ago | 0.00221493 ETH | ||||
| Transfer | 18691531 | 813 days ago | 0.18569936 ETH | ||||
| Transfer | 18677313 | 815 days ago | 0.18569936 ETH | ||||
| Transfer | 18649341 | 819 days ago | 0.18044159 ETH | ||||
| Transfer | 18648262 | 819 days ago | 0.18044159 ETH | ||||
| Transfer | 18647762 | 820 days ago | 0.00005644 ETH | ||||
| Transfer | 18636830 | 821 days ago | 0.00005644 ETH | ||||
| Transfer | 18628637 | 822 days ago | 0.18044159 ETH | ||||
| Transfer | 18627039 | 822 days ago | 0.00005644 ETH | ||||
| Transfer | 18626881 | 822 days ago | 0.00005644 ETH | ||||
| Transfer | 18622422 | 823 days ago | 0.18044159 ETH | ||||
| Transfer | 18613132 | 824 days ago | 0.1722753 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TokenVesting
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// This contract locks ERC20 tokens. This can be used for:
// - Token developers to prove they have locked tokens
// - Presale projects or investors to lock a portion of tokens for a vesting period
// - Farming platforms to lock a percentage of the farmed rewards for a period of time
// - To lock tokens until a specific unlock date.
// - To send tokens to someone under a time lock.
// This contract is for ERC20 tokens, and supports high deflationary and rebasing tokens by using a pooling and share issuing mechanism.
// This is NOT for AMM LP tokens (such as UNIV2), Please use our liquidity lockers for this.
// Locking LP tokens in this contract will not show in the Unicrypt browser.
// *** LOCK TYPES ***
// Lock Type 1: when startEmission == 0 the lock is considered lockType 1. This is a normal lock
// whereby tokens can be withdrawn on the due date (endEmission).
// Lock Type 2: when startEmission != 0. Lock tokens over a period, with an amount withdrawable every block.
// This scales linearly over time from startEmission -> endEmission.
// e.g. If the lock period is 100 seconds, 50 seconds after the startEmission you can withdraw 50% of the lock.
// Instead of making 10 locks for 10 months to withdraw tokens at the end of each month, you can now make 1 linear scaling lock with a period
// of 10 months and withdraw the relative share every block.
// *** CUSTOM PREMATURE UNLOCKING CONDITIONS ***
// All locks support premature unlocking conditions. A premature unlock condition can be anything that implements the IUnlockCondition interface
// If IUnlockCondition(address).unlockTokens() returns true, the lock withdraw date is overriden and the entire lock value can be withdrawn.
// The key here is this is for premature unlocks, locks always fall back to the endEmission date
// even if unlockTokens() returns false, and are therefore always withdrawble in full by the unlockDate.
// Example use cases, Imagine a presale is 1 week long. Marketers tokens are locked for 1 week to prevent them initiating
// markets and setting initial prices on an AMM. The presale concludes within 5 minuites. Marketers now need to wait 1 week,
// to access their tokens. With conditional unlocks a condition can be set to return true once a presale has concluded
// and override the 1 week lock making their tokens instantly withdrawble post presale.
// Another use case could be to allow token developers or investors to prematurely unlock their tokens
// if the price reaches a specified target, or for governance to vote for developers to unlock tokens prematurely
// for development purposes met or raodmap goals met.
// Get creative!
// Please be aware if you are locking tokens to prove to your community you have locked tokens for long term you should not use a premature unlocking condition
// as these types of locks will be shown differently in the browser to a normal lock with no unlocking condition.
// Unlocking conditions can always be revoked by the lock owner to give more credibility to the lock.
pragma solidity ^0.8.0;
import "./TransferHelper.sol";
import './VestingMathLibrary.sol';
import './FullMath.sol';
import "./EnumerableSet.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./IERC20.sol";
interface IMigrator {
function migrate(address token, uint256 sharesDeposited, uint256 sharesWithdrawn, uint256 startEmission, uint256 endEmission, uint256 lockID, address owner, address condition, uint256 amountInTokens, uint256 option) external returns (bool);
}
interface IUnicryptAdmin {
function userIsAdmin(address _user) external view returns (bool);
}
interface ITokenBlacklist {
function checkToken(address _token) external view;
}
contract TokenVesting is Ownable, ReentrancyGuard {
using EnumerableSet for EnumerableSet.AddressSet;
struct UserInfo {
EnumerableSet.AddressSet lockedTokens; // records all token addresses the user has locked
mapping(address => uint256[]) locksForToken; // map erc20 address to lockId for that token
}
struct TokenLock {
address tokenAddress; // The token address
uint256 sharesDeposited; // the total amount of shares deposited
uint256 sharesWithdrawn; // amount of shares withdrawn
uint256 startEmission; // date token emission begins
uint256 endEmission; // the date the tokens can be withdrawn
uint256 lockID; // lock id per token lock
address owner; // the owner who can edit or withdraw the lock
address condition; // address(0) = no condition, otherwise the condition contract must implement IUnlockCondition
}
struct LockParams {
address payable owner; // the user who can withdraw tokens once the lock expires.
uint256 amount; // amount of tokens to lock
uint256 startEmission; // 0 if lock type 1, else a unix timestamp
uint256 endEmission; // the unlock date as a unix timestamp (in seconds)
address condition; // address(0) = no condition, otherwise the condition must implement IUnlockCondition
}
EnumerableSet.AddressSet private TOKENS; // list of all unique tokens that have a lock
mapping(uint256 => TokenLock) public LOCKS; // map lockID nonce to the lock
uint256 public NONCE = 0; // incremental lock nonce counter, this is the unique ID for the next lock
uint256 public MINIMUM_DEPOSIT = 100; // minimum divisibility per lock at time of locking
mapping(address => uint256[]) private TOKEN_LOCKS; // map token address to array of lockIDs for that token
mapping(address => UserInfo) private USERS;
mapping(address => uint) public SHARES; // map token to number of shares per token, shares allow rebasing and deflationary tokens to compute correctly
EnumerableSet.AddressSet private ZERO_FEE_WHITELIST; // Tokens that have been whitelisted to bypass all fees
EnumerableSet.AddressSet private TOKEN_WHITELISTERS; // whitelisting contracts and users who can enable no fee for tokens.
struct FeeStruct {
uint256 tokenFee;
uint256 freeLockingFee;
address payable feeAddress;
address freeLockingToken; // if this is address(0) then it is the gas token of the network (e.g ETH, BNB, Matic)
}
FeeStruct public FEES;
IUnicryptAdmin UNCX_ADMINS;
IMigrator public MIGRATOR;
ITokenBlacklist public BLACKLIST; // prevent AMM tokens with a blacklisting contract
event onLock(uint256 lockID, address token, address owner, uint256 amountInTokens, uint256 startEmission, uint256 endEmission);
event onWithdraw(address lpToken, uint256 amountInTokens);
event onRelock(uint256 lockID, uint256 unlockDate);
event onTransferLock(uint256 lockIDFrom, uint256 lockIDto, address oldOwner, address newOwner);
event onSplitLock(uint256 fromLockID, uint256 toLockID, uint256 amountInTokens);
event onMigrate(uint256 lockID, uint256 amountInTokens);
constructor (IUnicryptAdmin _uncxAdmins) {
UNCX_ADMINS = _uncxAdmins;
FEES.tokenFee = 35;
FEES.feeAddress = payable(0xAA3d85aD9D128DFECb55424085754F6dFa643eb1);
FEES.freeLockingFee = 10e18;
}
/**
* @notice set the migrator contract which allows the lock to be migrated
*/
function setMigrator(IMigrator _migrator) external onlyOwner {
MIGRATOR = _migrator;
}
function setBlacklistContract(ITokenBlacklist _contract) external onlyOwner {
BLACKLIST = _contract;
}
function setFees(uint256 _tokenFee, uint256 _freeLockingFee, address payable _feeAddress, address _freeLockingToken) external onlyOwner {
FEES.tokenFee = _tokenFee;
FEES.freeLockingFee = _freeLockingFee;
FEES.feeAddress = _feeAddress;
FEES.freeLockingToken = _freeLockingToken;
}
/**
* @notice whitelisted accounts and contracts who can call the editZeroFeeWhitelist function
*/
function adminSetWhitelister(address _user, bool _add) external onlyOwner {
if (_add) {
TOKEN_WHITELISTERS.add(_user);
} else {
TOKEN_WHITELISTERS.remove(_user);
}
}
// Pay a once off fee to have free use of the lockers for the token
function payForFreeTokenLocks (address _token) external payable {
require(!ZERO_FEE_WHITELIST.contains(_token), 'PAID');
// charge Fee
if (FEES.freeLockingToken == address(0)) {
require(msg.value == FEES.freeLockingFee, 'FEE NOT MET');
FEES.feeAddress.transfer(FEES.freeLockingFee);
} else {
TransferHelper.safeTransferFrom(address(FEES.freeLockingToken), address(msg.sender), FEES.feeAddress, FEES.freeLockingFee);
}
ZERO_FEE_WHITELIST.add(_token);
}
// Callable by UNCX_ADMINS or whitelisted contracts (such as presale contracts)
function editZeroFeeWhitelist (address _token, bool _add) external {
require(UNCX_ADMINS.userIsAdmin(msg.sender) || TOKEN_WHITELISTERS.contains(msg.sender), 'ADMIN');
if (_add) {
ZERO_FEE_WHITELIST.add(_token);
} else {
ZERO_FEE_WHITELIST.remove(_token);
}
}
/**
* @notice Creates one or multiple locks for the specified token
* @param _token the erc20 token address
* @param _lock_params an array of locks with format: [LockParams[owner, amount, startEmission, endEmission, condition]]
* owner: user or contract who can withdraw the tokens
* amount: must be >= 100 units
* startEmission = 0 : LockType 1
* startEmission != 0 : LockType 2 (linear scaling lock)
* use address(0) for no premature unlocking condition
* Fails if startEmission is not less than EndEmission
* Fails is amount < 100
*/
function lock (address _token, LockParams[] calldata _lock_params) external nonReentrant {
require(_lock_params.length > 0, 'NO PARAMS');
if (address(BLACKLIST) != address(0)) {
BLACKLIST.checkToken(_token);
}
uint256 totalAmount = 0;
for (uint256 i = 0; i < _lock_params.length; i++) {
totalAmount += _lock_params[i].amount;
}
uint256 balanceBefore = IERC20(_token).balanceOf(address(this));
TransferHelper.safeTransferFrom(_token, address(msg.sender), address(this), totalAmount);
uint256 amountIn = IERC20(_token).balanceOf(address(this)) - balanceBefore;
// Fees
if (!ZERO_FEE_WHITELIST.contains(_token)) {
uint256 lockFee = FullMath.mulDiv(amountIn, FEES.tokenFee, 10000);
TransferHelper.safeTransfer(_token, FEES.feeAddress, lockFee);
amountIn -= lockFee;
}
uint256 shares = 0;
for (uint256 i = 0; i < _lock_params.length; i++) {
LockParams memory lock_param = _lock_params[i];
require(lock_param.startEmission < lock_param.endEmission, 'PERIOD');
require(lock_param.endEmission < 1e10, 'TIMESTAMP INVALID'); // prevents errors when timestamp entered in milliseconds
require(lock_param.amount >= MINIMUM_DEPOSIT, 'MIN DEPOSIT');
uint256 amountInTokens = FullMath.mulDiv(lock_param.amount, amountIn, totalAmount);
if (SHARES[_token] == 0) {
shares = amountInTokens;
} else {
shares = FullMath.mulDiv(amountInTokens, SHARES[_token], balanceBefore == 0 ? 1 : balanceBefore);
}
require(shares > 0, 'SHARES');
SHARES[_token] += shares;
balanceBefore += amountInTokens;
TokenLock memory token_lock;
token_lock.tokenAddress = _token;
token_lock.sharesDeposited = shares;
token_lock.startEmission = lock_param.startEmission;
token_lock.endEmission = lock_param.endEmission;
token_lock.lockID = NONCE;
token_lock.owner = lock_param.owner;
if (lock_param.condition != address(0)) {
// if the condition contract does not implement the interface and return a bool
// the below line will fail and revert the tx as the conditional contract is invalid
IUnlockCondition(lock_param.condition).unlockTokens();
token_lock.condition = lock_param.condition;
}
// record the lock globally
LOCKS[NONCE] = token_lock;
TOKENS.add(_token);
TOKEN_LOCKS[_token].push(NONCE);
// record the lock for the user
UserInfo storage user = USERS[lock_param.owner];
user.lockedTokens.add(_token);
user.locksForToken[_token].push(NONCE);
NONCE ++;
emit onLock(token_lock.lockID, _token, token_lock.owner, amountInTokens, token_lock.startEmission, token_lock.endEmission);
}
}
/**
* @notice withdraw a specified amount from a lock. _amount is the ideal amount to be withdrawn.
* however, this amount might be slightly different in rebasing tokens due to the conversion to shares,
* then back into an amount
* @param _lockID the lockID of the lock to be withdrawn
* @param _amount amount of tokens to withdraw
*/
function withdraw (uint256 _lockID, uint256 _amount) external nonReentrant {
TokenLock storage userLock = LOCKS[_lockID];
require(userLock.owner == msg.sender, 'OWNER');
// convert _amount to its representation in shares
uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this));
uint256 shareDebit = FullMath.mulDiv(SHARES[userLock.tokenAddress], _amount, balance);
// round _amount up to the nearest whole share if the amount of tokens specified does not translate to
// at least 1 share.
if (shareDebit == 0 && _amount > 0) {
shareDebit ++;
}
require(shareDebit > 0, 'ZERO WITHDRAWL');
uint256 withdrawableShares = getWithdrawableShares(userLock.lockID);
// dust clearance block, as mulDiv rounds down leaving one share stuck, clear all shares for dust amounts
if (shareDebit + 1 == withdrawableShares) {
if (FullMath.mulDiv(SHARES[userLock.tokenAddress], balance / SHARES[userLock.tokenAddress], balance) == 0){
shareDebit++;
}
}
require(withdrawableShares >= shareDebit, 'AMOUNT');
userLock.sharesWithdrawn += shareDebit;
// now convert shares to the actual _amount it represents, this may differ slightly from the
// _amount supplied in this methods arguments.
uint256 amountInTokens = FullMath.mulDiv(shareDebit, balance, SHARES[userLock.tokenAddress]);
SHARES[userLock.tokenAddress] -= shareDebit;
TransferHelper.safeTransfer(userLock.tokenAddress, msg.sender, amountInTokens);
emit onWithdraw(userLock.tokenAddress, amountInTokens);
}
/**
* @notice extend a lock with a new unlock date, if lock is Type 2 it extends the emission end date
*/
function relock (uint256 _lockID, uint256 _unlock_date) external nonReentrant {
require(_unlock_date < 1e10, 'TIME'); // prevents errors when timestamp entered in milliseconds
TokenLock storage userLock = LOCKS[_lockID];
require(userLock.owner == msg.sender, 'OWNER');
require(userLock.endEmission < _unlock_date, 'END');
// percent fee
if (!ZERO_FEE_WHITELIST.contains(userLock.tokenAddress)) {
uint256 remainingShares = userLock.sharesDeposited - userLock.sharesWithdrawn;
uint256 feeInShares = FullMath.mulDiv(remainingShares, FEES.tokenFee, 10000);
uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this));
uint256 feeInTokens = FullMath.mulDiv(feeInShares, balance, SHARES[userLock.tokenAddress] == 0 ? 1 : SHARES[userLock.tokenAddress]);
TransferHelper.safeTransfer(userLock.tokenAddress, FEES.feeAddress, feeInTokens);
userLock.sharesWithdrawn += feeInShares;
SHARES[userLock.tokenAddress] -= feeInShares;
}
userLock.endEmission = _unlock_date;
emit onRelock(_lockID, _unlock_date);
}
/**
* @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock
* Its possible to increase someone elses lock here it does not need to be your own, useful for contracts
*/
function incrementLock (uint256 _lockID, uint256 _amount) external nonReentrant {
TokenLock storage userLock = LOCKS[_lockID];
require(_amount >= MINIMUM_DEPOSIT, 'MIN DEPOSIT');
uint256 balanceBefore = IERC20(userLock.tokenAddress).balanceOf(address(this));
TransferHelper.safeTransferFrom(userLock.tokenAddress, address(msg.sender), address(this), _amount);
uint256 amountInTokens = IERC20(userLock.tokenAddress).balanceOf(address(this)) - balanceBefore;
// percent fee
if (!ZERO_FEE_WHITELIST.contains(userLock.tokenAddress)) {
uint256 lockFee = FullMath.mulDiv(amountInTokens, FEES.tokenFee, 10000);
TransferHelper.safeTransfer(userLock.tokenAddress, FEES.feeAddress, lockFee);
amountInTokens -= lockFee;
}
uint256 shares;
if (SHARES[userLock.tokenAddress] == 0) {
shares = amountInTokens;
} else {
shares = FullMath.mulDiv(amountInTokens, SHARES[userLock.tokenAddress], balanceBefore);
}
require(shares > 0, 'SHARES');
SHARES[userLock.tokenAddress] += shares;
userLock.sharesDeposited += shares;
emit onLock(userLock.lockID, userLock.tokenAddress, userLock.owner, amountInTokens, userLock.startEmission, userLock.endEmission);
}
/**
* @notice transfer a lock to a new owner, e.g. presale project -> project owner
* Please be aware this generates a new lock, and nulls the old lock, so a new ID is assigned to the new lock.
*/
function transferLockOwnership (uint256 _lockID, address payable _newOwner) external nonReentrant {
require(msg.sender != _newOwner, 'SELF');
TokenLock storage transferredLock = LOCKS[_lockID];
require(transferredLock.owner == msg.sender, 'OWNER');
TokenLock memory token_lock;
token_lock.tokenAddress = transferredLock.tokenAddress;
token_lock.sharesDeposited = transferredLock.sharesDeposited;
token_lock.sharesWithdrawn = transferredLock.sharesWithdrawn;
token_lock.startEmission = transferredLock.startEmission;
token_lock.endEmission = transferredLock.endEmission;
token_lock.lockID = NONCE;
token_lock.owner = _newOwner;
token_lock.condition = transferredLock.condition;
// record the lock globally
LOCKS[NONCE] = token_lock;
TOKEN_LOCKS[transferredLock.tokenAddress].push(NONCE);
// record the lock for the new owner
UserInfo storage newOwner = USERS[_newOwner];
newOwner.lockedTokens.add(transferredLock.tokenAddress);
newOwner.locksForToken[transferredLock.tokenAddress].push(token_lock.lockID);
NONCE ++;
// zero the lock from the old owner
transferredLock.sharesWithdrawn = transferredLock.sharesDeposited;
emit onTransferLock(_lockID, token_lock.lockID, msg.sender, _newOwner);
}
/**
* @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion
* and withdraw a smaller portion
* Only works on lock type 1, this feature does not work with lock type 2
* @param _amount the amount in tokens
*/
function splitLock (uint256 _lockID, uint256 _amount) external nonReentrant {
require(_amount > 0, 'ZERO AMOUNT');
TokenLock storage userLock = LOCKS[_lockID];
require(userLock.owner == msg.sender, 'OWNER');
require(userLock.startEmission == 0, 'LOCK TYPE 2');
// convert _amount to its representation in shares
uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this));
uint256 amountInShares = FullMath.mulDiv(SHARES[userLock.tokenAddress], _amount, balance);
require(userLock.sharesWithdrawn + amountInShares <= userLock.sharesDeposited);
TokenLock memory token_lock;
token_lock.tokenAddress = userLock.tokenAddress;
token_lock.sharesDeposited = amountInShares;
token_lock.endEmission = userLock.endEmission;
token_lock.lockID = NONCE;
token_lock.owner = msg.sender;
token_lock.condition = userLock.condition;
// debit previous lock
userLock.sharesWithdrawn += amountInShares;
// record the new lock globally
LOCKS[NONCE] = token_lock;
TOKEN_LOCKS[userLock.tokenAddress].push(NONCE);
// record the new lock for the owner
USERS[msg.sender].locksForToken[userLock.tokenAddress].push(token_lock.lockID);
NONCE ++;
emit onSplitLock(_lockID, token_lock.lockID, _amount);
}
/**
* @notice migrates to the next locker version, only callable by lock owners
*/
function migrate (uint256 _lockID, uint256 _option) external nonReentrant {
require(address(MIGRATOR) != address(0), "NOT SET");
TokenLock storage userLock = LOCKS[_lockID];
require(userLock.owner == msg.sender, 'OWNER');
uint256 sharesAvailable = userLock.sharesDeposited - userLock.sharesWithdrawn;
require(sharesAvailable > 0, 'AMOUNT');
uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this));
uint256 amountInTokens = FullMath.mulDiv(sharesAvailable, balance, SHARES[userLock.tokenAddress]);
TransferHelper.safeApprove(userLock.tokenAddress, address(MIGRATOR), amountInTokens);
MIGRATOR.migrate(userLock.tokenAddress, userLock.sharesDeposited, userLock.sharesWithdrawn, userLock.startEmission,
userLock.endEmission, userLock.lockID, userLock.owner, userLock.condition, amountInTokens, _option);
userLock.sharesWithdrawn = userLock.sharesDeposited;
SHARES[userLock.tokenAddress] -= sharesAvailable;
emit onMigrate(_lockID, amountInTokens);
}
/**
* @notice premature unlock conditions can be malicous (prevent withdrawls by failing to evalaute or return non bools)
* or not give community enough insurance tokens will remain locked until the end date, in such a case, it can be revoked
*/
function revokeCondition (uint256 _lockID) external nonReentrant {
TokenLock storage userLock = LOCKS[_lockID];
require(userLock.owner == msg.sender, 'OWNER');
require(userLock.condition != address(0)); // already set to address(0)
userLock.condition = address(0);
}
// test a condition on front end, added here for convenience in UI, returns unlockTokens() bool, or fails
function testCondition (address condition) external view returns (bool) {
return (IUnlockCondition(condition).unlockTokens());
}
// returns withdrawable share amount from the lock, taking into consideration start and end emission
function getWithdrawableShares (uint256 _lockID) public view returns (uint256) {
TokenLock storage userLock = LOCKS[_lockID];
uint8 lockType = userLock.startEmission == 0 ? 1 : 2;
uint256 amount = lockType == 1 ? userLock.sharesDeposited - userLock.sharesWithdrawn : userLock.sharesDeposited;
uint256 withdrawable;
withdrawable = VestingMathLibrary.getWithdrawableAmount (
userLock.startEmission,
userLock.endEmission,
amount,
block.timestamp,
userLock.condition
);
if (lockType == 2) {
withdrawable -= userLock.sharesWithdrawn;
}
return withdrawable;
}
// convenience function for UI, converts shares to the current amount in tokens
function getWithdrawableTokens (uint256 _lockID) external view returns (uint256) {
TokenLock storage userLock = LOCKS[_lockID];
uint256 withdrawableShares = getWithdrawableShares(userLock.lockID);
uint256 balance = IERC20(userLock.tokenAddress).balanceOf(address(this));
uint256 amountTokens = FullMath.mulDiv(withdrawableShares, balance, SHARES[userLock.tokenAddress] == 0 ? 1 : SHARES[userLock.tokenAddress]);
return amountTokens;
}
// For UI use
function convertSharesToTokens (address _token, uint256 _shares) external view returns (uint256) {
uint256 balance = IERC20(_token).balanceOf(address(this));
return FullMath.mulDiv(_shares, balance, SHARES[_token]);
}
function convertTokensToShares (address _token, uint256 _tokens) external view returns (uint256) {
uint256 balance = IERC20(_token).balanceOf(address(this));
return FullMath.mulDiv(SHARES[_token], _tokens, balance);
}
// For use in UI, returns more useful lock Data than just querying LOCKS,
// such as the real-time token amount representation of a locks shares
function getLock (uint256 _lockID) external view returns (uint256, address, uint256, uint256, uint256, uint256, uint256, uint256, address, address) {
TokenLock memory tokenLock = LOCKS[_lockID];
uint256 balance = IERC20(tokenLock.tokenAddress).balanceOf(address(this));
uint256 totalSharesOr1 = SHARES[tokenLock.tokenAddress] == 0 ? 1 : SHARES[tokenLock.tokenAddress];
// tokens deposited and tokens withdrawn is provided for convenience in UI, with rebasing these amounts will change
uint256 tokensDeposited = FullMath.mulDiv(tokenLock.sharesDeposited, balance, totalSharesOr1);
uint256 tokensWithdrawn = FullMath.mulDiv(tokenLock.sharesWithdrawn, balance, totalSharesOr1);
return (tokenLock.lockID, tokenLock.tokenAddress, tokensDeposited, tokensWithdrawn, tokenLock.sharesDeposited, tokenLock.sharesWithdrawn, tokenLock.startEmission, tokenLock.endEmission,
tokenLock.owner, tokenLock.condition);
}
function getNumLockedTokens () external view returns (uint256) {
return TOKENS.length();
}
function getTokenAtIndex (uint256 _index) external view returns (address) {
return TOKENS.at(_index);
}
function getTokenLocksLength (address _token) external view returns (uint256) {
return TOKEN_LOCKS[_token].length;
}
function getTokenLockIDAtIndex (address _token, uint256 _index) external view returns (uint256) {
return TOKEN_LOCKS[_token][_index];
}
// user functions
function getUserLockedTokensLength (address _user) external view returns (uint256) {
return USERS[_user].lockedTokens.length();
}
function getUserLockedTokenAtIndex (address _user, uint256 _index) external view returns (address) {
return USERS[_user].lockedTokens.at(_index);
}
function getUserLocksForTokenLength (address _user, address _token) external view returns (uint256) {
return USERS[_user].locksForToken[_token].length;
}
function getUserLockIDForTokenAtIndex (address _user, address _token, uint256 _index) external view returns (uint256) {
return USERS[_user].locksForToken[_token][_index];
}
// no Fee Tokens
function getZeroFeeTokensLength () external view returns (uint256) {
return ZERO_FEE_WHITELIST.length();
}
function getZeroFeeTokenAtIndex (uint256 _index) external view returns (address) {
return ZERO_FEE_WHITELIST.at(_index);
}
function tokenOnZeroFeeWhitelist (address _token) external view returns (bool) {
return ZERO_FEE_WHITELIST.contains(_token);
}
// whitelist
function getTokenWhitelisterLength () external view returns (uint256) {
return TOKEN_WHITELISTERS.length();
}
function getTokenWhitelisterAtIndex (uint256 _index) external view returns (address) {
return TOKEN_WHITELISTERS.at(_index);
}
function getTokenWhitelisterStatus (address _user) external view returns (bool) {
return TOKEN_WHITELISTERS.contains(_user);
}
}// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/Context.sol@v4.0.0
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/structs/EnumerableSet.sol@v4.0.0
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Sourced from https://gist.github.com/paulrberg/439ebe860cd2f9893852e2cab5655b65, credits to Paulrberg for porting to solidity v0.8
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
unchecked {
uint256 twos = (type(uint256).max - denominator + 1) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
}// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v4.0.0
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/access/Ownable.sol@v4.0.0
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/security/ReentrancyGuard.sol@v4.0.0
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0;
// helper methods for interacting with ERC20 tokens that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./EnumerableSet.sol";
import "./Ownable.sol";
interface IUnicryptAdmin {
function userIsAdmin(address _user) external view returns (bool);
}
contract UnicryptAdmin is Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private ADMINS;
function ownerEditAdmin (address _user, bool _add) public onlyOwner {
if (_add) {
ADMINS.add(_user);
} else {
ADMINS.remove(_user);
}
}
// Admin getters
function getAdminsLength () external view returns (uint256) {
return ADMINS.length();
}
function getAdminAtIndex (uint256 _index) external view returns (address) {
return ADMINS.at(_index);
}
function userIsAdmin (address _user) external view returns (bool) {
return ADMINS.contains(_user);
}
}// SPDX-License-Identifier: UNLICENSED
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
pragma solidity ^0.8.0;
import './FullMath.sol';
// Allows a seperate contract with a unlockTokens() function to be used to override unlock dates
interface IUnlockCondition {
function unlockTokens() external view returns (bool);
}
library VestingMathLibrary {
// gets the withdrawable amount from a lock
function getWithdrawableAmount (uint256 startEmission, uint256 endEmission, uint256 amount, uint256 timeStamp, address condition) internal view returns (uint256) {
// It is possible in some cases IUnlockCondition(condition).unlockTokens() will fail (func changes state or does not return a bool)
// for this reason we implemented revokeCondition per lock so funds are never stuck in the contract.
// Prematurely release the lock if the condition is met
if (condition != address(0) && IUnlockCondition(condition).unlockTokens()) {
return amount;
}
// Lock type 1 logic block (Normal Unlock on due date)
if (startEmission == 0 || startEmission == endEmission) {
return endEmission < timeStamp ? amount : 0;
}
// Lock type 2 logic block (Linear scaling lock)
uint256 timeClamp = timeStamp;
if (timeClamp > endEmission) {
timeClamp = endEmission;
}
if (timeClamp < startEmission) {
timeClamp = startEmission;
}
uint256 elapsed = timeClamp - startEmission;
uint256 fullPeriod = endEmission - startEmission;
return FullMath.mulDiv(amount, elapsed, fullPeriod); // fullPeriod cannot equal zero due to earlier checks and restraints when locking tokens (startEmission < endEmission)
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IUnicryptAdmin","name":"_uncxAdmins","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockID","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startEmission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endEmission","type":"uint256"}],"name":"onLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"onRelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fromLockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toLockID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onSplitLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockIDFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockIDto","type":"uint256"},{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"onTransferLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"onWithdraw","type":"event"},{"inputs":[],"name":"BLACKLIST","outputs":[{"internalType":"contract ITokenBlacklist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEES","outputs":[{"internalType":"uint256","name":"tokenFee","type":"uint256"},{"internalType":"uint256","name":"freeLockingFee","type":"uint256"},{"internalType":"address payable","name":"feeAddress","type":"address"},{"internalType":"address","name":"freeLockingToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LOCKS","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"sharesDeposited","type":"uint256"},{"internalType":"uint256","name":"sharesWithdrawn","type":"uint256"},{"internalType":"uint256","name":"startEmission","type":"uint256"},{"internalType":"uint256","name":"endEmission","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"condition","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIGRATOR","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_DEPOSIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NONCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"SHARES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"adminSetWhitelister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"convertSharesToTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"convertTokensToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"editZeroFeeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenLockIDAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenLocksLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTokenWhitelisterAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenWhitelisterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTokenWhitelisterStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockIDForTokenAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserLockedTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getUserLocksForTokenLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getWithdrawableShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"getWithdrawableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getZeroFeeTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getZeroFeeTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"incrementLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"components":[{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startEmission","type":"uint256"},{"internalType":"uint256","name":"endEmission","type":"uint256"},{"internalType":"address","name":"condition","type":"address"}],"internalType":"struct TokenVesting.LockParams[]","name":"_lock_params","type":"tuple[]"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_option","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"payForFreeTokenLocks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"}],"name":"revokeCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITokenBlacklist","name":"_contract","type":"address"}],"name":"setBlacklistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenFee","type":"uint256"},{"internalType":"uint256","name":"_freeLockingFee","type":"uint256"},{"internalType":"address payable","name":"_feeAddress","type":"address"},{"internalType":"address","name":"_freeLockingToken","type":"address"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"splitLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"condition","type":"address"}],"name":"testCondition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"tokenOnZeroFeeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferLockOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052600060055560646006553480156200001b57600080fd5b5060405162003e5038038062003e508339810160408190526200003e91620000f0565b60006200004a620000ec565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055601280546001600160a01b039092166001600160a01b03199283161790556023600e556010805490911673aa3d85ad9d128dfecb55424085754f6dfa643eb1179055678ac7230489e80000600f5562000120565b3390565b60006020828403121562000102578081fd5b81516001600160a01b038116811462000119578182fd5b9392505050565b613d2080620001306000396000f3fe6080604052600436106102665760003560e01c806397988dce11610144578063cf0d5af3116100b6578063e04ab1391161007a578063e04ab13914610732578063e091dd1a14610752578063e52c4b7a14610767578063f19451d814610787578063f2fde38b1461079c578063fc0633d0146107bc57610266565b8063cf0d5af314610668578063cf6dde4a1461069c578063d060e175146106bc578063d323cdbf146106dc578063d68f4dd1146106fc57610266565b8063b2fb30cb11610108578063b2fb30cb146105b3578063b4540fa7146105d3578063bb5ee001146105f3578063c368803a14610613578063c8b0cf6814610633578063ca5cc0c21461064857610266565b806397988dce1461052b5780639ecd74721461054b578063a34df14f14610560578063a6dcb8de14610573578063b1d7655c1461059357610266565b80635a5b8d9e116101dd578063783451e8116101a1578063783451e81461046f57806386de2fcb146104845780638b7b23ee146104a45780638ba74f17146104c95780638da5cb5b146104e9578063903df8061461050b57610266565b80635a5b8d9e146103da5780636588fc03146103fa578063675187a31461041a578063715018a61461043a578063741af17e1461044f57610266565b80631d7065db1161022f5780631d7065db1461030d57806323cf31181461033a5780633717dee71461035a5780633e54bacb1461037a578063441a3e701461039a5780635a04fb69146103ba57610266565b8062623ae31461026b57806303e1cdf4146102965780630cdebc9e146102ab57806313ef2b1b146102cb5780631c30ffb1146102ed575b600080fd5b34801561027757600080fd5b506102806107dc565b60405161028d9190613b69565b60405180910390f35b3480156102a257600080fd5b506102806107ed565b3480156102b757600080fd5b506102806102c63660046134ba565b6107f9565b3480156102d757600080fd5b506102eb6102e636600461340a565b6108ab565b005b3480156102f957600080fd5b506102806103083660046133ca565b610f2d565b34801561031957600080fd5b5061032d610328366004613376565b610f8d565b60405161028d9190613778565b34801561034657600080fd5b506102eb610355366004613376565b610f9a565b34801561036657600080fd5b506102eb6103753660046135df565b610ffb565b34801561038657600080fd5b506102eb6103953660046135df565b6112fc565b3480156103a657600080fd5b506102eb6103b53660046135df565b6115f1565b3480156103c657600080fd5b506102eb6103d53660046135bb565b61189e565b3480156103e657600080fd5b506102eb6103f536600461358b565b611c27565b34801561040657600080fd5b506102eb6104153660046135df565b611cb8565b34801561042657600080fd5b5061032d610435366004613376565b611fab565b34801561044657600080fd5b506102eb61201e565b34801561045b57600080fd5b506102eb61046a366004613376565b6120a7565b34801561047b57600080fd5b50610280612108565b34801561049057600080fd5b506102eb61049f36600461348d565b612114565b3480156104b057600080fd5b506104b961217b565b60405161028d9493929190613c07565b3480156104d557600080fd5b506102806104e43660046134ba565b612197565b3480156104f557600080fd5b506104fe6121e2565b60405161028d9190613682565b34801561051757600080fd5b506104fe6105263660046134ba565b6121f1565b34801561053757600080fd5b506104fe61054636600461358b565b612213565b34801561055757600080fd5b506104fe612220565b6102eb61056e366004613376565b61222f565b34801561057f57600080fd5b5061028061058e366004613376565b6122f8565b34801561059f57600080fd5b506104fe6105ae36600461358b565b612319565b3480156105bf57600080fd5b506102eb6105ce3660046135df565b612326565b3480156105df57600080fd5b506102eb6105ee36600461348d565b61259a565b3480156105ff57600080fd5b5061028061060e366004613392565b612663565b34801561061f57600080fd5b5061028061062e366004613376565b612692565b34801561063f57600080fd5b506104fe6126a4565b34801561065457600080fd5b506102806106633660046134ba565b6126b3565b34801561067457600080fd5b5061068861068336600461358b565b612759565b60405161028d9897969594939291906136d3565b3480156106a857600080fd5b5061032d6106b7366004613376565b6127ab565b3480156106c857600080fd5b506102806106d7366004613376565b6127b8565b3480156106e857600080fd5b506102806106f736600461358b565b6127d3565b34801561070857600080fd5b5061071c61071736600461358b565b6128ca565b60405161028d9a99989796959493929190613ba6565b34801561073e57600080fd5b5061028061074d36600461358b565b612a83565b34801561075e57600080fd5b50610280612b2a565b34801561077357600080fd5b506104fe61078236600461358b565b612b30565b34801561079357600080fd5b50610280612b3d565b3480156107a857600080fd5b506102eb6107b7366004613376565b612b43565b3480156107c857600080fd5b506102eb6107d7366004613600565b612c03565b60006107e8600c612c7c565b905090565b60006107e8600a612c7c565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108289190613682565b60206040518083038186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087891906135a3565b6001600160a01b0385166000908152600960205260409020549091506108a19084908390612c87565b9150505b92915050565b600260015414156108d75760405162461bcd60e51b81526004016108ce90613b32565b60405180910390fd5b6002600155806108f95760405162461bcd60e51b81526004016108ce906139ba565b6014546001600160a01b03161561096b57601454604051633c6202c960e21b81526001600160a01b039091169063f1880b249061093a908690600401613682565b60006040518083038186803b15801561095257600080fd5b505afa158015610966573d6000803e3d6000fd5b505050505b6000805b828110156109c05783838281811061099757634e487b7160e01b600052603260045260246000fd5b905060a0020160200135826109ac9190613c44565b9150806109b881613c93565b91505061096f565b506040516370a0823160e01b81526000906001600160a01b038616906370a08231906109f0903090600401613682565b60206040518083038186803b158015610a0857600080fd5b505afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4091906135a3565b9050610a4e85333085612d36565b600081866001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a7d9190613682565b60206040518083038186803b158015610a9557600080fd5b505afa158015610aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acd91906135a3565b610ad79190613c7c565b9050610ae4600a87612e26565b610b25576000610afc82600e60000154612710612c87565b601054909150610b179088906001600160a01b031683612e3b565b610b218183613c7c565b9150505b6000805b85811015610f1f576000878783818110610b5357634e487b7160e01b600052603260045260246000fd5b905060a00201803603810190610b699190613501565b90508060600151816040015110610b925760405162461bcd60e51b81526004016108ce9061399a565b6402540be400816060015110610bba5760405162461bcd60e51b81526004016108ce906137c5565b60065481602001511015610be05760405162461bcd60e51b81526004016108ce90613940565b6000610bf182602001518689612c87565b6001600160a01b038b16600090815260096020526040902054909150610c1957809350610c4f565b6001600160a01b038a16600090815260096020526040902054610c4c9082908815610c445788610c47565b60015b612c87565b93505b60008411610c6f5760405162461bcd60e51b81526004016108ce90613a87565b6001600160a01b038a1660009081526009602052604081208054869290610c97908490613c44565b90915550610ca790508187613c44565b9550610cb1613316565b6001600160a01b03808c16825260208201869052604084015160608084019190915284015160808084019190915260055460a08401528451821660c08401528401511615610d835782608001516001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e91906134e5565b5060808301516001600160a01b031660e08201525b60058054600090815260046020818152604092839020855181546001600160a01b039182166001600160a01b0319918216178355928701516001830155938601516002808301919091556060870151600383015560808701519382019390935560a08601519481019490945560c085015160068501805491851691831691909117905560e085015160079094018054949093169316929092179055610e28908c612f28565b506001600160a01b03808c166000908152600760209081526040808320600554815460018101835591855283852090910155865190931682526008905220610e70818d612f28565b506001600160a01b038c1660009081526002820160209081526040822060058054825460018101845592855292842090910191909155805491610eb283613c93565b91905055507f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b968260a001518d8460c001518686606001518760800151604051610f0096959493929190613b72565b60405180910390a1505050508080610f1790613c93565b915050610b29565b505060018055505050505050565b6001600160a01b038084166000908152600860209081526040808320938616835260029093019052908120805483908110610f7857634e487b7160e01b600052603260045260246000fd5b906000526020600020015490505b9392505050565b60006108a5600a83612e26565b610fa2612f3d565b6001600160a01b0316610fb36121e2565b6001600160a01b031614610fd95760405162461bcd60e51b81526004016108ce90613965565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561101e5760405162461bcd60e51b81526004016108ce90613b32565b600260015560008281526004602052604090206006548210156110535760405162461bcd60e51b81526004016108ce90613940565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611083903090600401613682565b60206040518083038186803b15801561109b57600080fd5b505afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d391906135a3565b82549091506110ed906001600160a01b0316333086612d36565b81546040516370a0823160e01b815260009183916001600160a01b03909116906370a0823190611121903090600401613682565b60206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906135a3565b61117b9190613c7c565b835490915061119590600a906001600160a01b0316612e26565b6111da5760006111ad82600e60000154612710612c87565b84546010549192506111cc916001600160a01b03918216911683612e3b565b6111d68183613c7c565b9150505b82546001600160a01b03166000908152600960205260408120546111ff575080611228565b83546001600160a01b031660009081526009602052604090205461122590839085612c87565b90505b600081116112485760405162461bcd60e51b81526004016108ce90613a87565b83546001600160a01b031660009081526009602052604081208054839290611271908490613c44565b925050819055508084600101600082825461128c9190613c44565b9091555050600584015484546006860154600387015460048801546040517f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b96956112e89590946001600160a01b03918216949116928992613b72565b60405180910390a150506001805550505050565b6002600154141561131f5760405162461bcd60e51b81526004016108ce90613b32565b60026001556013546001600160a01b031661134c5760405162461bcd60e51b81526004016108ce906138e2565b600082815260046020526040902060068101546001600160a01b031633146113865760405162461bcd60e51b81526004016108ce90613903565b60008160020154826001015461139c9190613c7c565b9050600081116113be5760405162461bcd60e51b81526004016108ce90613827565b81546040516370a0823160e01b81526000916001600160a01b0316906370a08231906113ee903090600401613682565b60206040518083038186803b15801561140657600080fd5b505afa15801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906135a3565b83546001600160a01b0316600090815260096020526040812054919250906114699084908490612c87565b8454601354919250611488916001600160a01b03918216911683612f41565b601360009054906101000a90046001600160a01b03166001600160a01b03166322a3d1a48560000160009054906101000a90046001600160a01b031686600101548760020154886003015489600401548a600501548b60060160009054906101000a90046001600160a01b03168c60070160009054906101000a90046001600160a01b03168a8f6040518b63ffffffff1660e01b81526004016115349a9998979695949392919061371b565b602060405180830381600087803b15801561154e57600080fd5b505af1158015611562573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158691906134e5565b506001840154600285015583546001600160a01b0316600090815260096020526040812080548592906115ba908490613c7c565b90915550506040517f8b1497abd425402b9139208bcb7f83d61a7545712a632d73a1ae68039cd593ab906112e89088908490613bf9565b600260015414156116145760405162461bcd60e51b81526004016108ce90613b32565b6002600155600082815260046020526040902060068101546001600160a01b031633146116535760405162461bcd60e51b81526004016108ce90613903565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611683903090600401613682565b60206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d391906135a3565b82546001600160a01b0316600090815260096020526040812054919250906116fc908584612c87565b90508015801561170c5750600084115b1561171f578061171b81613c93565b9150505b6000811161173f5760405162461bcd60e51b81526004016108ce90613aa7565b600061174e8460050154612a83565b90508061175c836001613c44565b14156117a25783546001600160a01b03166000908152600960205260409020546117909061178a8186613c5c565b85612c87565b6117a2578161179e81613c93565b9250505b818110156117c25760405162461bcd60e51b81526004016108ce90613827565b818460020160008282546117d69190613c44565b909155505083546001600160a01b03166000908152600960205260408120546118029084908690612c87565b85546001600160a01b0316600090815260096020526040812080549293508592909190611830908490613c7c565b9091555050845461184b906001600160a01b03163383612e3b565b84546040517fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc91611889916001600160a01b039091169084906136ba565b60405180910390a15050600180555050505050565b600260015414156118c15760405162461bcd60e51b81526004016108ce90613b32565b6002600155336001600160a01b03821614156118ef5760405162461bcd60e51b81526004016108ce90613a44565b600082815260046020526040902060068101546001600160a01b031633146119295760405162461bcd60e51b81526004016108ce90613903565b611931613316565b8160000160009054906101000a90046001600160a01b031681600001906001600160a01b031690816001600160a01b03168152505081600101548160200181815250508160020154816040018181525050816003015481606001818152505081600401548160800181815250506005548160a0018181525050828160c001906001600160a01b031690816001600160a01b0316815250508160070160009054906101000a90046001600160a01b03168160e001906001600160a01b031690816001600160a01b0316815250508060046000600554815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600760008360000160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206005549080600181540180825580915050600190039060005260206000200160009091909190915055600060086000856001600160a01b03166001600160a01b031681526020019081526020016000209050611b8a8360000160009054906101000a90046001600160a01b031682600001612f2890919063ffffffff16565b5082546001600160a01b031660009081526002820160209081526040822060a0850151815460018101835591845291832001556005805491611bcb83613c93565b90915550506001830154600284015560a08201516040517fc1329eea12893a6eff780df43cf4ec708fdc6ce7fbacf84ee8cf9355a9af1dd891611c149188919033908990613c07565b60405180910390a1505060018055505050565b60026001541415611c4a5760405162461bcd60e51b81526004016108ce90613b32565b6002600155600081815260046020526040902060068101546001600160a01b03163314611c895760405162461bcd60e51b81526004016108ce90613903565b60078101546001600160a01b0316611ca057600080fd5b60070180546001600160a01b03191690555060018055565b60026001541415611cdb5760405162461bcd60e51b81526004016108ce90613b32565b600260015580611cfd5760405162461bcd60e51b81526004016108ce90613a62565b600082815260046020526040902060068101546001600160a01b03163314611d375760405162461bcd60e51b81526004016108ce90613903565b600381015415611d595760405162461bcd60e51b81526004016108ce906139fa565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611d89903090600401613682565b60206040518083038186803b158015611da157600080fd5b505afa158015611db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd991906135a3565b82546001600160a01b031660009081526009602052604081205491925090611e02908584612c87565b90508260010154818460020154611e199190613c44565b1115611e2457600080fd5b611e2c613316565b83546001600160a01b039081168252602082018390526004850154608083015260055460a08301523360c083015260078501541660e0820152600284018054839190600090611e7c908490613c44565b9091555050600580546000908152600460208181526040808420865181546001600160a01b03199081166001600160a01b03928316178355888501516001808501919091558985015160028086019190915560608b0151600386015560808b01519785019790975560a08a018051858b015560c08b0151600686018054851691861691909117905560e08b015160079586018054909416908516179092558c548316885292855283872088548154808601835591895286892090910155338752600885528387208c54909216875294018352908420925183549182018455928452908320015581549190611f6f83613c93565b91905055507fbfc02f4250f5e54a31a72371b1932061a0245db2afb5124b547306f6ebffd8ad868260a00151876040516112e893929190613c2e565b6000816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe657600080fd5b505afa158015611ffa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a591906134e5565b612026612f3d565b6001600160a01b03166120376121e2565b6001600160a01b03161461205d5760405162461bcd60e51b81526004016108ce90613965565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6120af612f3d565b6001600160a01b03166120c06121e2565b6001600160a01b0316146120e65760405162461bcd60e51b81526004016108ce90613965565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60006107e86002612c7c565b61211c612f3d565b6001600160a01b031661212d6121e2565b6001600160a01b0316146121535760405162461bcd60e51b81526004016108ce90613965565b801561216a57612164600c83612f28565b50612177565b612175600c83613027565b505b5050565b600e54600f546010546011546001600160a01b03918216911684565b6001600160a01b03821660009081526007602052604081208054839081106121cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000546001600160a01b031690565b6001600160a01b0382166000908152600860205260408120610f86908361303c565b60006108a560028361303c565b6013546001600160a01b031681565b61223a600a82612e26565b156122575760405162461bcd60e51b81526004016108ce90613922565b6011546001600160a01b03166122ca57600f5434146122885760405162461bcd60e51b81526004016108ce90613a1f565b601054600f546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156122c4573d6000803e3d6000fd5b506122ed565b601154601054600f546122ed926001600160a01b03908116923392911690612d36565b612177600a82612f28565b6001600160a01b03811660009081526008602052604081206108a590612c7c565b60006108a5600a8361303c565b600260015414156123495760405162461bcd60e51b81526004016108ce90613b32565b60026001556402540be40081106123725760405162461bcd60e51b81526004016108ce9061388d565b600082815260046020526040902060068101546001600160a01b031633146123ac5760405162461bcd60e51b81526004016108ce90613903565b818160040154106123cf5760405162461bcd60e51b81526004016108ce906139dd565b80546123e690600a906001600160a01b0316612e26565b612550576000816002015482600101546124009190613c7c565b9050600061241682600e60000154612710612c87565b83546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319061244b903090600401613682565b60206040518083038186803b15801561246357600080fd5b505afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b91906135a3565b84546001600160a01b0316600090815260096020526040812054919250906124e5908490849015610c445787546001600160a01b0316600090815260096020526040902054610c47565b8554601054919250612504916001600160a01b03918216911683612e3b565b828560020160008282546125189190613c44565b909155505084546001600160a01b031660009081526009602052604081208054859290612546908490613c7c565b9091555050505050505b600481018290556040517fefaff1b90138281d215452c67f793017f52e456f65c28ac63f5309a89a059b47906125899085908590613bf9565b60405180910390a150506001805550565b601254604051632a35efd360e21b81526001600160a01b039091169063a8d7bf4c906125ca903390600401613682565b60206040518083038186803b1580156125e257600080fd5b505afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261a91906134e5565b8061262b575061262b600c33612e26565b6126475760405162461bcd60e51b81526004016108ce90613acf565b801561265857612164600a83612f28565b612175600a83613027565b6001600160a01b0391821660009081526008602090815260408083209390941682526002909201909152205490565b60096020526000908152604090205481565b6014546001600160a01b031681565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016126e29190613682565b60206040518083038186803b1580156126fa57600080fd5b505afa15801561270e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273291906135a3565b6001600160a01b0385166000908152600960205260409020549091506108a1908483612c87565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460068601546007909601546001600160a01b03958616979496939592939192918216911688565b60006108a5600c83612e26565b6001600160a01b031660009081526007602052604090205490565b6000818152600460205260408120600581015482906127f190612a83565b82546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612826903090600401613682565b60206040518083038186803b15801561283e57600080fd5b505afa158015612852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287691906135a3565b83546001600160a01b0316600090815260096020526040812054919250906128c0908490849015610c445786546001600160a01b0316600090815260096020526040902054610c47565b9695505050505050565b600081815260046020818152604080842081516101008101835281546001600160a01b0390811680835260018401549583019590955260028301548285015260038301546060830152828601546080830152600583015460a08301526006830154811660c083015260079092015490911660e082015290516370a0823160e01b81528493849384938493849384938493849384939192849290916370a082319161297691309101613682565b60206040518083038186803b15801561298e57600080fd5b505afa1580156129a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c691906135a3565b82516001600160a01b03166000908152600960205260408120549192509015612a085782516001600160a01b0316600090815260096020526040902054612a0b565b60015b90506000612a1e84602001518484612c87565b90506000612a3185604001518585612c87565b90508460a0015185600001518383886020015189604001518a606001518b608001518c60c001518d60e001519e509e509e509e509e509e509e509e509e509e5050505050509193959799509193959799565b60008181526004602052604081206003810154829015612aa4576002612aa7565b60015b905060008160ff16600114612ac0578260010154612ad4565b82600201548360010154612ad49190613c7c565b90506000612b048460030154856004015484428860070160009054906101000a90046001600160a01b0316613048565b90508260ff1660021415612b215760028401546128c09082613c7c565b95945050505050565b60055481565b60006108a5600c8361303c565b60065481565b612b4b612f3d565b6001600160a01b0316612b5c6121e2565b6001600160a01b031614612b825760405162461bcd60e51b81526004016108ce90613965565b6001600160a01b038116612ba85760405162461bcd60e51b81526004016108ce90613847565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612c0b612f3d565b6001600160a01b0316612c1c6121e2565b6001600160a01b031614612c425760405162461bcd60e51b81526004016108ce90613965565b600e93909355600f91909155601080546001600160a01b039283166001600160a01b03199182161790915560118054929093169116179055565b60006108a58261314d565b600080806000198587098587029250828110838203039150508060001415612cc15760008411612cb657600080fd5b508290049050610f86565b808411612ccd57600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b600080856001600160a01b03166323b872dd868686604051602401612d5d93929190613696565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612d969190613649565b6000604051808303816000865af19150503d8060008114612dd3576040519150601f19603f3d011682016040523d82523d6000602084013e612dd8565b606091505b5091509150818015612e02575080511580612e02575080806020019051810190612e0291906134e5565b612e1e5760405162461bcd60e51b81526004016108ce90613aee565b505050505050565b6000610f86836001600160a01b038416613151565b600080846001600160a01b031663a9059cbb8585604051602401612e609291906136ba565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612e999190613649565b6000604051808303816000865af19150503d8060008114612ed6576040519150601f19603f3d011682016040523d82523d6000602084013e612edb565b606091505b5091509150818015612f05575080511580612f05575080806020019051810190612f0591906134e5565b612f215760405162461bcd60e51b81526004016108ce906137f0565b5050505050565b6000610f86836001600160a01b038416613169565b3390565b600080846001600160a01b031663095ea7b38585604051602401612f669291906136ba565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612f9f9190613649565b6000604051808303816000865af19150503d8060008114612fdc576040519150601f19603f3d011682016040523d82523d6000602084013e612fe1565b606091505b509150915081801561300b57508051158061300b57508080602001905181019061300b91906134e5565b612f215760405162461bcd60e51b81526004016108ce906138ab565b6000610f86836001600160a01b0384166131b3565b6000610f8683836132d0565b60006001600160a01b038216158015906130ce5750816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b15801561309657600080fd5b505afa1580156130aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ce91906134e5565b156130da575082612b21565b8515806130e657508486145b15613102578285106130f95760006130fb565b835b9050612b21565b828581111561310e5750845b868110156131195750855b60006131258883613c7c565b905060006131338989613c7c565b9050613140878383612c87565b9998505050505050505050565b5490565b60009081526001919091016020526040902054151590565b60006131758383613151565b6131ab575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108a5565b5060006108a5565b600081815260018301602052604081205480156132c65760006131d7600183613c7c565b85549091506000906131eb90600190613c7c565b9050600086600001828154811061321257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061324357634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561325a836001613c44565b6000828152600189016020526040902055865487908061328a57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506108a5565b60009150506108a5565b815460009082106132f35760405162461bcd60e51b81526004016108ce90613783565b8260000182815481106121cf57634e487b7160e01b600052603260045260246000fd5b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b600060208284031215613387578081fd5b8135610f8681613cc4565b600080604083850312156133a4578081fd5b82356133af81613cc4565b915060208301356133bf81613cc4565b809150509250929050565b6000806000606084860312156133de578081fd5b83356133e981613cc4565b925060208401356133f981613cc4565b929592945050506040919091013590565b60008060006040848603121561341e578283fd5b833561342981613cc4565b9250602084013567ffffffffffffffff80821115613445578384fd5b818601915086601f830112613458578384fd5b813581811115613466578485fd5b87602060a08302850101111561347a578485fd5b6020830194508093505050509250925092565b6000806040838503121561349f578182fd5b82356134aa81613cc4565b915060208301356133bf81613cdc565b600080604083850312156134cc578182fd5b82356134d781613cc4565b946020939093013593505050565b6000602082840312156134f6578081fd5b8151610f8681613cdc565b600060a08284031215613512578081fd5b60405160a0810181811067ffffffffffffffff8211171561354157634e487b7160e01b83526041600452602483fd5b604052823561354f81613cc4565b80825250602083013560208201526040830135604082015260608301356060820152608083013561357f81613cc4565b60808201529392505050565b60006020828403121561359c578081fd5b5035919050565b6000602082840312156135b4578081fd5b5051919050565b600080604083850312156135cd578182fd5b8235915060208301356133bf81613cc4565b600080604083850312156135f1578182fd5b50508035926020909101359150565b60008060008060808587031215613615578182fd5b8435935060208501359250604085013561362e81613cc4565b9150606085013561363e81613cc4565b939692955090935050565b60008251815b81811015613669576020818601810151858301520161364f565b818111156136775782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039889168152602081019790975260408701959095526060860193909352608085019190915260a0840152831660c083015290911660e08201526101000190565b6001600160a01b039a8b168152602081019990995260408901979097526060880195909552608087019390935260a0860191909152851660c085015290931660e08301526101008201929092526101208101919091526101400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601190820152701512535154d51053540812539590531251607a1b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b602080825260069082015265105353d5539560d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526004908201526354494d4560e01b604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b6020808252600790820152661393d50814d15560ca1b604082015260600190565b60208082526005908201526427aba722a960d91b604082015260600190565b6020808252600490820152631410525160e21b604082015260600190565b6020808252600b908201526a1352538811115413d4d25560aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600690820152651411549253d160d21b604082015260600190565b6020808252600990820152684e4f20504152414d5360b81b604082015260600190565b60208082526003908201526211539160ea1b604082015260600190565b6020808252600b908201526a2627a1a5902a2ca822901960a91b604082015260600190565b6020808252600b908201526a119151481393d50813515560aa1b604082015260600190565b60208082526004908201526329a2a62360e11b604082015260600190565b6020808252600b908201526a16915493c8105353d5539560aa1b604082015260600190565b60208082526006908201526553484152455360d01b604082015260600190565b6020808252600e908201526d16915493c815d2551211149055d360921b604082015260600190565b60208082526005908201526420a226a4a760d91b604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b998a526001600160a01b0398891660208b015260408a01979097526060890195909552608088019390935260a087019190915260c086015260e08501528216610100840152166101208201526101400190565b918252602082015260400190565b93845260208401929092526001600160a01b03908116604084015216606082015260800190565b9283526020830191909152604082015260600190565b60008219821115613c5757613c57613cae565b500190565b600082613c7757634e487b7160e01b81526012600452602481fd5b500490565b600082821015613c8e57613c8e613cae565b500390565b6000600019821415613ca757613ca7613cae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114613cd957600080fd5b50565b8015158114613cd957600080fdfea2646970667358221220e78cf8e6ed610868dc3d549269bb38235edf487a98c2154c253483f91753c51d64736f6c634300080100330000000000000000000000003febe0e6e06bd5c470e9df3c9f058ac23c342cf7
Deployed Bytecode
0x6080604052600436106102665760003560e01c806397988dce11610144578063cf0d5af3116100b6578063e04ab1391161007a578063e04ab13914610732578063e091dd1a14610752578063e52c4b7a14610767578063f19451d814610787578063f2fde38b1461079c578063fc0633d0146107bc57610266565b8063cf0d5af314610668578063cf6dde4a1461069c578063d060e175146106bc578063d323cdbf146106dc578063d68f4dd1146106fc57610266565b8063b2fb30cb11610108578063b2fb30cb146105b3578063b4540fa7146105d3578063bb5ee001146105f3578063c368803a14610613578063c8b0cf6814610633578063ca5cc0c21461064857610266565b806397988dce1461052b5780639ecd74721461054b578063a34df14f14610560578063a6dcb8de14610573578063b1d7655c1461059357610266565b80635a5b8d9e116101dd578063783451e8116101a1578063783451e81461046f57806386de2fcb146104845780638b7b23ee146104a45780638ba74f17146104c95780638da5cb5b146104e9578063903df8061461050b57610266565b80635a5b8d9e146103da5780636588fc03146103fa578063675187a31461041a578063715018a61461043a578063741af17e1461044f57610266565b80631d7065db1161022f5780631d7065db1461030d57806323cf31181461033a5780633717dee71461035a5780633e54bacb1461037a578063441a3e701461039a5780635a04fb69146103ba57610266565b8062623ae31461026b57806303e1cdf4146102965780630cdebc9e146102ab57806313ef2b1b146102cb5780631c30ffb1146102ed575b600080fd5b34801561027757600080fd5b506102806107dc565b60405161028d9190613b69565b60405180910390f35b3480156102a257600080fd5b506102806107ed565b3480156102b757600080fd5b506102806102c63660046134ba565b6107f9565b3480156102d757600080fd5b506102eb6102e636600461340a565b6108ab565b005b3480156102f957600080fd5b506102806103083660046133ca565b610f2d565b34801561031957600080fd5b5061032d610328366004613376565b610f8d565b60405161028d9190613778565b34801561034657600080fd5b506102eb610355366004613376565b610f9a565b34801561036657600080fd5b506102eb6103753660046135df565b610ffb565b34801561038657600080fd5b506102eb6103953660046135df565b6112fc565b3480156103a657600080fd5b506102eb6103b53660046135df565b6115f1565b3480156103c657600080fd5b506102eb6103d53660046135bb565b61189e565b3480156103e657600080fd5b506102eb6103f536600461358b565b611c27565b34801561040657600080fd5b506102eb6104153660046135df565b611cb8565b34801561042657600080fd5b5061032d610435366004613376565b611fab565b34801561044657600080fd5b506102eb61201e565b34801561045b57600080fd5b506102eb61046a366004613376565b6120a7565b34801561047b57600080fd5b50610280612108565b34801561049057600080fd5b506102eb61049f36600461348d565b612114565b3480156104b057600080fd5b506104b961217b565b60405161028d9493929190613c07565b3480156104d557600080fd5b506102806104e43660046134ba565b612197565b3480156104f557600080fd5b506104fe6121e2565b60405161028d9190613682565b34801561051757600080fd5b506104fe6105263660046134ba565b6121f1565b34801561053757600080fd5b506104fe61054636600461358b565b612213565b34801561055757600080fd5b506104fe612220565b6102eb61056e366004613376565b61222f565b34801561057f57600080fd5b5061028061058e366004613376565b6122f8565b34801561059f57600080fd5b506104fe6105ae36600461358b565b612319565b3480156105bf57600080fd5b506102eb6105ce3660046135df565b612326565b3480156105df57600080fd5b506102eb6105ee36600461348d565b61259a565b3480156105ff57600080fd5b5061028061060e366004613392565b612663565b34801561061f57600080fd5b5061028061062e366004613376565b612692565b34801561063f57600080fd5b506104fe6126a4565b34801561065457600080fd5b506102806106633660046134ba565b6126b3565b34801561067457600080fd5b5061068861068336600461358b565b612759565b60405161028d9897969594939291906136d3565b3480156106a857600080fd5b5061032d6106b7366004613376565b6127ab565b3480156106c857600080fd5b506102806106d7366004613376565b6127b8565b3480156106e857600080fd5b506102806106f736600461358b565b6127d3565b34801561070857600080fd5b5061071c61071736600461358b565b6128ca565b60405161028d9a99989796959493929190613ba6565b34801561073e57600080fd5b5061028061074d36600461358b565b612a83565b34801561075e57600080fd5b50610280612b2a565b34801561077357600080fd5b506104fe61078236600461358b565b612b30565b34801561079357600080fd5b50610280612b3d565b3480156107a857600080fd5b506102eb6107b7366004613376565b612b43565b3480156107c857600080fd5b506102eb6107d7366004613600565b612c03565b60006107e8600c612c7c565b905090565b60006107e8600a612c7c565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108289190613682565b60206040518083038186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087891906135a3565b6001600160a01b0385166000908152600960205260409020549091506108a19084908390612c87565b9150505b92915050565b600260015414156108d75760405162461bcd60e51b81526004016108ce90613b32565b60405180910390fd5b6002600155806108f95760405162461bcd60e51b81526004016108ce906139ba565b6014546001600160a01b03161561096b57601454604051633c6202c960e21b81526001600160a01b039091169063f1880b249061093a908690600401613682565b60006040518083038186803b15801561095257600080fd5b505afa158015610966573d6000803e3d6000fd5b505050505b6000805b828110156109c05783838281811061099757634e487b7160e01b600052603260045260246000fd5b905060a0020160200135826109ac9190613c44565b9150806109b881613c93565b91505061096f565b506040516370a0823160e01b81526000906001600160a01b038616906370a08231906109f0903090600401613682565b60206040518083038186803b158015610a0857600080fd5b505afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4091906135a3565b9050610a4e85333085612d36565b600081866001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a7d9190613682565b60206040518083038186803b158015610a9557600080fd5b505afa158015610aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acd91906135a3565b610ad79190613c7c565b9050610ae4600a87612e26565b610b25576000610afc82600e60000154612710612c87565b601054909150610b179088906001600160a01b031683612e3b565b610b218183613c7c565b9150505b6000805b85811015610f1f576000878783818110610b5357634e487b7160e01b600052603260045260246000fd5b905060a00201803603810190610b699190613501565b90508060600151816040015110610b925760405162461bcd60e51b81526004016108ce9061399a565b6402540be400816060015110610bba5760405162461bcd60e51b81526004016108ce906137c5565b60065481602001511015610be05760405162461bcd60e51b81526004016108ce90613940565b6000610bf182602001518689612c87565b6001600160a01b038b16600090815260096020526040902054909150610c1957809350610c4f565b6001600160a01b038a16600090815260096020526040902054610c4c9082908815610c445788610c47565b60015b612c87565b93505b60008411610c6f5760405162461bcd60e51b81526004016108ce90613a87565b6001600160a01b038a1660009081526009602052604081208054869290610c97908490613c44565b90915550610ca790508187613c44565b9550610cb1613316565b6001600160a01b03808c16825260208201869052604084015160608084019190915284015160808084019190915260055460a08401528451821660c08401528401511615610d835782608001516001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e91906134e5565b5060808301516001600160a01b031660e08201525b60058054600090815260046020818152604092839020855181546001600160a01b039182166001600160a01b0319918216178355928701516001830155938601516002808301919091556060870151600383015560808701519382019390935560a08601519481019490945560c085015160068501805491851691831691909117905560e085015160079094018054949093169316929092179055610e28908c612f28565b506001600160a01b03808c166000908152600760209081526040808320600554815460018101835591855283852090910155865190931682526008905220610e70818d612f28565b506001600160a01b038c1660009081526002820160209081526040822060058054825460018101845592855292842090910191909155805491610eb283613c93565b91905055507f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b968260a001518d8460c001518686606001518760800151604051610f0096959493929190613b72565b60405180910390a1505050508080610f1790613c93565b915050610b29565b505060018055505050505050565b6001600160a01b038084166000908152600860209081526040808320938616835260029093019052908120805483908110610f7857634e487b7160e01b600052603260045260246000fd5b906000526020600020015490505b9392505050565b60006108a5600a83612e26565b610fa2612f3d565b6001600160a01b0316610fb36121e2565b6001600160a01b031614610fd95760405162461bcd60e51b81526004016108ce90613965565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561101e5760405162461bcd60e51b81526004016108ce90613b32565b600260015560008281526004602052604090206006548210156110535760405162461bcd60e51b81526004016108ce90613940565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611083903090600401613682565b60206040518083038186803b15801561109b57600080fd5b505afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d391906135a3565b82549091506110ed906001600160a01b0316333086612d36565b81546040516370a0823160e01b815260009183916001600160a01b03909116906370a0823190611121903090600401613682565b60206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906135a3565b61117b9190613c7c565b835490915061119590600a906001600160a01b0316612e26565b6111da5760006111ad82600e60000154612710612c87565b84546010549192506111cc916001600160a01b03918216911683612e3b565b6111d68183613c7c565b9150505b82546001600160a01b03166000908152600960205260408120546111ff575080611228565b83546001600160a01b031660009081526009602052604090205461122590839085612c87565b90505b600081116112485760405162461bcd60e51b81526004016108ce90613a87565b83546001600160a01b031660009081526009602052604081208054839290611271908490613c44565b925050819055508084600101600082825461128c9190613c44565b9091555050600584015484546006860154600387015460048801546040517f4d0f9887048089b093c92bec885ab529000723bce1a79f4e81a5990619910b96956112e89590946001600160a01b03918216949116928992613b72565b60405180910390a150506001805550505050565b6002600154141561131f5760405162461bcd60e51b81526004016108ce90613b32565b60026001556013546001600160a01b031661134c5760405162461bcd60e51b81526004016108ce906138e2565b600082815260046020526040902060068101546001600160a01b031633146113865760405162461bcd60e51b81526004016108ce90613903565b60008160020154826001015461139c9190613c7c565b9050600081116113be5760405162461bcd60e51b81526004016108ce90613827565b81546040516370a0823160e01b81526000916001600160a01b0316906370a08231906113ee903090600401613682565b60206040518083038186803b15801561140657600080fd5b505afa15801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906135a3565b83546001600160a01b0316600090815260096020526040812054919250906114699084908490612c87565b8454601354919250611488916001600160a01b03918216911683612f41565b601360009054906101000a90046001600160a01b03166001600160a01b03166322a3d1a48560000160009054906101000a90046001600160a01b031686600101548760020154886003015489600401548a600501548b60060160009054906101000a90046001600160a01b03168c60070160009054906101000a90046001600160a01b03168a8f6040518b63ffffffff1660e01b81526004016115349a9998979695949392919061371b565b602060405180830381600087803b15801561154e57600080fd5b505af1158015611562573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158691906134e5565b506001840154600285015583546001600160a01b0316600090815260096020526040812080548592906115ba908490613c7c565b90915550506040517f8b1497abd425402b9139208bcb7f83d61a7545712a632d73a1ae68039cd593ab906112e89088908490613bf9565b600260015414156116145760405162461bcd60e51b81526004016108ce90613b32565b6002600155600082815260046020526040902060068101546001600160a01b031633146116535760405162461bcd60e51b81526004016108ce90613903565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611683903090600401613682565b60206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d391906135a3565b82546001600160a01b0316600090815260096020526040812054919250906116fc908584612c87565b90508015801561170c5750600084115b1561171f578061171b81613c93565b9150505b6000811161173f5760405162461bcd60e51b81526004016108ce90613aa7565b600061174e8460050154612a83565b90508061175c836001613c44565b14156117a25783546001600160a01b03166000908152600960205260409020546117909061178a8186613c5c565b85612c87565b6117a2578161179e81613c93565b9250505b818110156117c25760405162461bcd60e51b81526004016108ce90613827565b818460020160008282546117d69190613c44565b909155505083546001600160a01b03166000908152600960205260408120546118029084908690612c87565b85546001600160a01b0316600090815260096020526040812080549293508592909190611830908490613c7c565b9091555050845461184b906001600160a01b03163383612e3b565b84546040517fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc91611889916001600160a01b039091169084906136ba565b60405180910390a15050600180555050505050565b600260015414156118c15760405162461bcd60e51b81526004016108ce90613b32565b6002600155336001600160a01b03821614156118ef5760405162461bcd60e51b81526004016108ce90613a44565b600082815260046020526040902060068101546001600160a01b031633146119295760405162461bcd60e51b81526004016108ce90613903565b611931613316565b8160000160009054906101000a90046001600160a01b031681600001906001600160a01b031690816001600160a01b03168152505081600101548160200181815250508160020154816040018181525050816003015481606001818152505081600401548160800181815250506005548160a0018181525050828160c001906001600160a01b031690816001600160a01b0316815250508160070160009054906101000a90046001600160a01b03168160e001906001600160a01b031690816001600160a01b0316815250508060046000600554815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600760008360000160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206005549080600181540180825580915050600190039060005260206000200160009091909190915055600060086000856001600160a01b03166001600160a01b031681526020019081526020016000209050611b8a8360000160009054906101000a90046001600160a01b031682600001612f2890919063ffffffff16565b5082546001600160a01b031660009081526002820160209081526040822060a0850151815460018101835591845291832001556005805491611bcb83613c93565b90915550506001830154600284015560a08201516040517fc1329eea12893a6eff780df43cf4ec708fdc6ce7fbacf84ee8cf9355a9af1dd891611c149188919033908990613c07565b60405180910390a1505060018055505050565b60026001541415611c4a5760405162461bcd60e51b81526004016108ce90613b32565b6002600155600081815260046020526040902060068101546001600160a01b03163314611c895760405162461bcd60e51b81526004016108ce90613903565b60078101546001600160a01b0316611ca057600080fd5b60070180546001600160a01b03191690555060018055565b60026001541415611cdb5760405162461bcd60e51b81526004016108ce90613b32565b600260015580611cfd5760405162461bcd60e51b81526004016108ce90613a62565b600082815260046020526040902060068101546001600160a01b03163314611d375760405162461bcd60e51b81526004016108ce90613903565b600381015415611d595760405162461bcd60e51b81526004016108ce906139fa565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611d89903090600401613682565b60206040518083038186803b158015611da157600080fd5b505afa158015611db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd991906135a3565b82546001600160a01b031660009081526009602052604081205491925090611e02908584612c87565b90508260010154818460020154611e199190613c44565b1115611e2457600080fd5b611e2c613316565b83546001600160a01b039081168252602082018390526004850154608083015260055460a08301523360c083015260078501541660e0820152600284018054839190600090611e7c908490613c44565b9091555050600580546000908152600460208181526040808420865181546001600160a01b03199081166001600160a01b03928316178355888501516001808501919091558985015160028086019190915560608b0151600386015560808b01519785019790975560a08a018051858b015560c08b0151600686018054851691861691909117905560e08b015160079586018054909416908516179092558c548316885292855283872088548154808601835591895286892090910155338752600885528387208c54909216875294018352908420925183549182018455928452908320015581549190611f6f83613c93565b91905055507fbfc02f4250f5e54a31a72371b1932061a0245db2afb5124b547306f6ebffd8ad868260a00151876040516112e893929190613c2e565b6000816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe657600080fd5b505afa158015611ffa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a591906134e5565b612026612f3d565b6001600160a01b03166120376121e2565b6001600160a01b03161461205d5760405162461bcd60e51b81526004016108ce90613965565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6120af612f3d565b6001600160a01b03166120c06121e2565b6001600160a01b0316146120e65760405162461bcd60e51b81526004016108ce90613965565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60006107e86002612c7c565b61211c612f3d565b6001600160a01b031661212d6121e2565b6001600160a01b0316146121535760405162461bcd60e51b81526004016108ce90613965565b801561216a57612164600c83612f28565b50612177565b612175600c83613027565b505b5050565b600e54600f546010546011546001600160a01b03918216911684565b6001600160a01b03821660009081526007602052604081208054839081106121cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000546001600160a01b031690565b6001600160a01b0382166000908152600860205260408120610f86908361303c565b60006108a560028361303c565b6013546001600160a01b031681565b61223a600a82612e26565b156122575760405162461bcd60e51b81526004016108ce90613922565b6011546001600160a01b03166122ca57600f5434146122885760405162461bcd60e51b81526004016108ce90613a1f565b601054600f546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156122c4573d6000803e3d6000fd5b506122ed565b601154601054600f546122ed926001600160a01b03908116923392911690612d36565b612177600a82612f28565b6001600160a01b03811660009081526008602052604081206108a590612c7c565b60006108a5600a8361303c565b600260015414156123495760405162461bcd60e51b81526004016108ce90613b32565b60026001556402540be40081106123725760405162461bcd60e51b81526004016108ce9061388d565b600082815260046020526040902060068101546001600160a01b031633146123ac5760405162461bcd60e51b81526004016108ce90613903565b818160040154106123cf5760405162461bcd60e51b81526004016108ce906139dd565b80546123e690600a906001600160a01b0316612e26565b612550576000816002015482600101546124009190613c7c565b9050600061241682600e60000154612710612c87565b83546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319061244b903090600401613682565b60206040518083038186803b15801561246357600080fd5b505afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b91906135a3565b84546001600160a01b0316600090815260096020526040812054919250906124e5908490849015610c445787546001600160a01b0316600090815260096020526040902054610c47565b8554601054919250612504916001600160a01b03918216911683612e3b565b828560020160008282546125189190613c44565b909155505084546001600160a01b031660009081526009602052604081208054859290612546908490613c7c565b9091555050505050505b600481018290556040517fefaff1b90138281d215452c67f793017f52e456f65c28ac63f5309a89a059b47906125899085908590613bf9565b60405180910390a150506001805550565b601254604051632a35efd360e21b81526001600160a01b039091169063a8d7bf4c906125ca903390600401613682565b60206040518083038186803b1580156125e257600080fd5b505afa1580156125f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261a91906134e5565b8061262b575061262b600c33612e26565b6126475760405162461bcd60e51b81526004016108ce90613acf565b801561265857612164600a83612f28565b612175600a83613027565b6001600160a01b0391821660009081526008602090815260408083209390941682526002909201909152205490565b60096020526000908152604090205481565b6014546001600160a01b031681565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016126e29190613682565b60206040518083038186803b1580156126fa57600080fd5b505afa15801561270e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273291906135a3565b6001600160a01b0385166000908152600960205260409020549091506108a1908483612c87565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460068601546007909601546001600160a01b03958616979496939592939192918216911688565b60006108a5600c83612e26565b6001600160a01b031660009081526007602052604090205490565b6000818152600460205260408120600581015482906127f190612a83565b82546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612826903090600401613682565b60206040518083038186803b15801561283e57600080fd5b505afa158015612852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287691906135a3565b83546001600160a01b0316600090815260096020526040812054919250906128c0908490849015610c445786546001600160a01b0316600090815260096020526040902054610c47565b9695505050505050565b600081815260046020818152604080842081516101008101835281546001600160a01b0390811680835260018401549583019590955260028301548285015260038301546060830152828601546080830152600583015460a08301526006830154811660c083015260079092015490911660e082015290516370a0823160e01b81528493849384938493849384938493849384939192849290916370a082319161297691309101613682565b60206040518083038186803b15801561298e57600080fd5b505afa1580156129a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c691906135a3565b82516001600160a01b03166000908152600960205260408120549192509015612a085782516001600160a01b0316600090815260096020526040902054612a0b565b60015b90506000612a1e84602001518484612c87565b90506000612a3185604001518585612c87565b90508460a0015185600001518383886020015189604001518a606001518b608001518c60c001518d60e001519e509e509e509e509e509e509e509e509e509e5050505050509193959799509193959799565b60008181526004602052604081206003810154829015612aa4576002612aa7565b60015b905060008160ff16600114612ac0578260010154612ad4565b82600201548360010154612ad49190613c7c565b90506000612b048460030154856004015484428860070160009054906101000a90046001600160a01b0316613048565b90508260ff1660021415612b215760028401546128c09082613c7c565b95945050505050565b60055481565b60006108a5600c8361303c565b60065481565b612b4b612f3d565b6001600160a01b0316612b5c6121e2565b6001600160a01b031614612b825760405162461bcd60e51b81526004016108ce90613965565b6001600160a01b038116612ba85760405162461bcd60e51b81526004016108ce90613847565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612c0b612f3d565b6001600160a01b0316612c1c6121e2565b6001600160a01b031614612c425760405162461bcd60e51b81526004016108ce90613965565b600e93909355600f91909155601080546001600160a01b039283166001600160a01b03199182161790915560118054929093169116179055565b60006108a58261314d565b600080806000198587098587029250828110838203039150508060001415612cc15760008411612cb657600080fd5b508290049050610f86565b808411612ccd57600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b600080856001600160a01b03166323b872dd868686604051602401612d5d93929190613696565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612d969190613649565b6000604051808303816000865af19150503d8060008114612dd3576040519150601f19603f3d011682016040523d82523d6000602084013e612dd8565b606091505b5091509150818015612e02575080511580612e02575080806020019051810190612e0291906134e5565b612e1e5760405162461bcd60e51b81526004016108ce90613aee565b505050505050565b6000610f86836001600160a01b038416613151565b600080846001600160a01b031663a9059cbb8585604051602401612e609291906136ba565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612e999190613649565b6000604051808303816000865af19150503d8060008114612ed6576040519150601f19603f3d011682016040523d82523d6000602084013e612edb565b606091505b5091509150818015612f05575080511580612f05575080806020019051810190612f0591906134e5565b612f215760405162461bcd60e51b81526004016108ce906137f0565b5050505050565b6000610f86836001600160a01b038416613169565b3390565b600080846001600160a01b031663095ea7b38585604051602401612f669291906136ba565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612f9f9190613649565b6000604051808303816000865af19150503d8060008114612fdc576040519150601f19603f3d011682016040523d82523d6000602084013e612fe1565b606091505b509150915081801561300b57508051158061300b57508080602001905181019061300b91906134e5565b612f215760405162461bcd60e51b81526004016108ce906138ab565b6000610f86836001600160a01b0384166131b3565b6000610f8683836132d0565b60006001600160a01b038216158015906130ce5750816001600160a01b031663f968f4936040518163ffffffff1660e01b815260040160206040518083038186803b15801561309657600080fd5b505afa1580156130aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ce91906134e5565b156130da575082612b21565b8515806130e657508486145b15613102578285106130f95760006130fb565b835b9050612b21565b828581111561310e5750845b868110156131195750855b60006131258883613c7c565b905060006131338989613c7c565b9050613140878383612c87565b9998505050505050505050565b5490565b60009081526001919091016020526040902054151590565b60006131758383613151565b6131ab575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108a5565b5060006108a5565b600081815260018301602052604081205480156132c65760006131d7600183613c7c565b85549091506000906131eb90600190613c7c565b9050600086600001828154811061321257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061324357634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561325a836001613c44565b6000828152600189016020526040902055865487908061328a57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506108a5565b60009150506108a5565b815460009082106132f35760405162461bcd60e51b81526004016108ce90613783565b8260000182815481106121cf57634e487b7160e01b600052603260045260246000fd5b60405180610100016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b600060208284031215613387578081fd5b8135610f8681613cc4565b600080604083850312156133a4578081fd5b82356133af81613cc4565b915060208301356133bf81613cc4565b809150509250929050565b6000806000606084860312156133de578081fd5b83356133e981613cc4565b925060208401356133f981613cc4565b929592945050506040919091013590565b60008060006040848603121561341e578283fd5b833561342981613cc4565b9250602084013567ffffffffffffffff80821115613445578384fd5b818601915086601f830112613458578384fd5b813581811115613466578485fd5b87602060a08302850101111561347a578485fd5b6020830194508093505050509250925092565b6000806040838503121561349f578182fd5b82356134aa81613cc4565b915060208301356133bf81613cdc565b600080604083850312156134cc578182fd5b82356134d781613cc4565b946020939093013593505050565b6000602082840312156134f6578081fd5b8151610f8681613cdc565b600060a08284031215613512578081fd5b60405160a0810181811067ffffffffffffffff8211171561354157634e487b7160e01b83526041600452602483fd5b604052823561354f81613cc4565b80825250602083013560208201526040830135604082015260608301356060820152608083013561357f81613cc4565b60808201529392505050565b60006020828403121561359c578081fd5b5035919050565b6000602082840312156135b4578081fd5b5051919050565b600080604083850312156135cd578182fd5b8235915060208301356133bf81613cc4565b600080604083850312156135f1578182fd5b50508035926020909101359150565b60008060008060808587031215613615578182fd5b8435935060208501359250604085013561362e81613cc4565b9150606085013561363e81613cc4565b939692955090935050565b60008251815b81811015613669576020818601810151858301520161364f565b818111156136775782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039889168152602081019790975260408701959095526060860193909352608085019190915260a0840152831660c083015290911660e08201526101000190565b6001600160a01b039a8b168152602081019990995260408901979097526060880195909552608087019390935260a0860191909152851660c085015290931660e08301526101008201929092526101208101919091526101400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601190820152701512535154d51053540812539590531251607a1b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b602080825260069082015265105353d5539560d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526004908201526354494d4560e01b604082015260600190565b6020808252601e908201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604082015260600190565b6020808252600790820152661393d50814d15560ca1b604082015260600190565b60208082526005908201526427aba722a960d91b604082015260600190565b6020808252600490820152631410525160e21b604082015260600190565b6020808252600b908201526a1352538811115413d4d25560aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600690820152651411549253d160d21b604082015260600190565b6020808252600990820152684e4f20504152414d5360b81b604082015260600190565b60208082526003908201526211539160ea1b604082015260600190565b6020808252600b908201526a2627a1a5902a2ca822901960a91b604082015260600190565b6020808252600b908201526a119151481393d50813515560aa1b604082015260600190565b60208082526004908201526329a2a62360e11b604082015260600190565b6020808252600b908201526a16915493c8105353d5539560aa1b604082015260600190565b60208082526006908201526553484152455360d01b604082015260600190565b6020808252600e908201526d16915493c815d2551211149055d360921b604082015260600190565b60208082526005908201526420a226a4a760d91b604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b998a526001600160a01b0398891660208b015260408a01979097526060890195909552608088019390935260a087019190915260c086015260e08501528216610100840152166101208201526101400190565b918252602082015260400190565b93845260208401929092526001600160a01b03908116604084015216606082015260800190565b9283526020830191909152604082015260600190565b60008219821115613c5757613c57613cae565b500190565b600082613c7757634e487b7160e01b81526012600452602481fd5b500490565b600082821015613c8e57613c8e613cae565b500390565b6000600019821415613ca757613ca7613cae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114613cd957600080fd5b50565b8015158114613cd957600080fdfea2646970667358221220e78cf8e6ed610868dc3d549269bb38235edf487a98c2154c253483f91753c51d64736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003febe0e6e06bd5c470e9df3c9f058ac23c342cf7
-----Decoded View---------------
Arg [0] : _uncxAdmins (address): 0x3febE0E6E06BD5C470e9DF3c9f058aC23c342CF7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003febe0e6e06bd5c470e9df3c9f058ac23c342cf7
Deployed Bytecode Sourcemap
3940:23676:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27212:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26794:114;;;;;;;;;;;;;:::i;23984:230::-;;;;;;;;;;-1:-1:-1;23984:230:6;;;;;:::i;:::-;;:::i;9831:2939::-;;;;;;;;;;-1:-1:-1;9831:2939:6;;;;;:::i;:::-;;:::i;:::-;;26586:180;;;;;;;;;;-1:-1:-1;26586:180:6;;;;;:::i;:::-;;:::i;27054:134::-;;;;;;;;;;-1:-1:-1;27054:134:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7410:94::-;;;;;;;;;;-1:-1:-1;7410:94:6;;;;;:::i;:::-;;:::i;16232:1265::-;;;;;;;;;;-1:-1:-1;16232:1265:6;;;;;:::i;:::-;;:::i;20792:1044::-;;;;;;;;;;-1:-1:-1;20792:1044:6;;;;;:::i;:::-;;:::i;13141:1610::-;;;;;;;;;;-1:-1:-1;13141:1610:6;;;;;:::i;:::-;;:::i;17717:1334::-;;;;;;;;;;-1:-1:-1;17717:1334:6;;;;;:::i;:::-;;:::i;22105:289::-;;;;;;;;;;-1:-1:-1;22105:289:6;;;;;:::i;:::-;;:::i;19353:1337::-;;;;;;;;;;-1:-1:-1;19353:1337:6;;;;;:::i;:::-;;:::i;22511:138::-;;;;;;;;;;-1:-1:-1;22511:138:6;;;;;:::i;:::-;;:::i;1752:145:4:-;;;;;;;;;;;;;:::i;7512:110:6:-;;;;;;;;;;-1:-1:-1;7512:110:6;;;;;:::i;:::-;;:::i;25580:98::-;;;;;;;;;;;;;:::i;8050:197::-;;;;;;;;;;-1:-1:-1;8050:197:6;;;;;:::i;:::-;;:::i;6423:21::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;25937:143::-;;;;;;;;;;-1:-1:-1;25937:143:6;;;;;:::i;:::-;;:::i;1120:85:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26254:155:6:-;;;;;;;;;;-1:-1:-1;26254:155:6;;;;;:::i;:::-;;:::i;25686:111::-;;;;;;;;;;-1:-1:-1;25686:111:6;;;;;:::i;:::-;;:::i;6484:25::-;;;;;;;;;;;;;:::i;8326:529::-;;;;;;:::i;:::-;;:::i;26109:137::-;;;;;;;;;;-1:-1:-1;26109:137:6;;;;;:::i;:::-;;:::i;26916:130::-;;;;;;;;;;-1:-1:-1;26916:130:6;;;;;:::i;:::-;;:::i;14876:1118::-;;;;;;;;;;-1:-1:-1;14876:1118:6;;;;;:::i;:::-;;:::i;8946:295::-;;;;;;;;;;-1:-1:-1;8946:295:6;;;;;:::i;:::-;;:::i;26417:161::-;;;;;;;;;;-1:-1:-1;26417:161:6;;;;;:::i;:::-;;:::i;5789:38::-;;;;;;;;;;-1:-1:-1;5789:38:6;;;;;:::i;:::-;;:::i;6514:32::-;;;;;;;;;;;;;:::i;24220:230::-;;;;;;;;;;-1:-1:-1;24220:230:6;;;;;:::i;:::-;;:::i;5350:42::-;;;;;;;;;;-1:-1:-1;5350:42:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;27479:134::-;;;;;;;;;;-1:-1:-1;27479:134:6;;;;;:::i;:::-;;:::i;25805:124::-;;;;;;;;;;-1:-1:-1;25805:124:6;;;;;:::i;:::-;;:::i;23499:462::-;;;;;;;;;;-1:-1:-1;23499:462:6;;;;;:::i;:::-;;:::i;24609:963::-;;;;;;;;;;-1:-1:-1;24609:963:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;22761:647::-;;;;;;;;;;-1:-1:-1;22761:647:6;;;;;:::i;:::-;;:::i;5429:24::-;;;;;;;;;;;;;:::i;27337:134::-;;;;;;;;;;-1:-1:-1;27337:134:6;;;;;:::i;:::-;;:::i;5533:36::-;;;;;;;;;;;;;:::i;2046:240:4:-;;;;;;;;;;-1:-1:-1;2046:240:4;;;;;:::i;:::-;;:::i;7630:302:6:-;;;;;;;;;;-1:-1:-1;7630:302:6;;;;;:::i;:::-;;:::i;27212:117::-;27273:7;27296:27;:18;:25;:27::i;:::-;27289:34;;27212:117;:::o;26794:114::-;26852:7;26875:27;:18;:25;:27::i;23984:230::-;24072:7;24088:15;24113:6;-1:-1:-1;;;;;24106:24:6;;24139:4;24106:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24193:14:6;;;;;;:6;:14;;;;;;24088:57;;-1:-1:-1;24159:49:6;;24175:7;;24088:57;;24159:15;:49::i;:::-;24152:56;;;23984:230;;;;;:::o;9831:2939::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;;;;;;;;;1749:1;2459:7;:18;9935:23:6;9927:45:::1;;;;-1:-1:-1::0;;;9927:45:6::1;;;;;;;:::i;:::-;9991:9;::::0;-1:-1:-1;;;;;9991:9:6::1;9983:32:::0;9979:85:::1;;10028:9;::::0;:28:::1;::::0;-1:-1:-1;;;10028:28:6;;-1:-1:-1;;;;;10028:9:6;;::::1;::::0;:20:::1;::::0;:28:::1;::::0;10049:6;;10028:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9979:85;10070:19;10105:9:::0;10100:106:::1;10120:23:::0;;::::1;10100:106;;;10176:12;;10189:1;10176:15;;;;;-1:-1:-1::0;;;10176:15:6::1;;;;;;;;;;;;;;:22;;;10161:37;;;;;:::i;:::-;::::0;-1:-1:-1;10145:3:6;::::1;::::0;::::1;:::i;:::-;;;;10100:106;;;-1:-1:-1::0;10238:39:6::1;::::0;-1:-1:-1;;;10238:39:6;;10214:21:::1;::::0;-1:-1:-1;;;;;10238:24:6;::::1;::::0;::::1;::::0;:39:::1;::::0;10271:4:::1;::::0;10238:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10214:63;;10284:88;10316:6;10332:10;10353:4;10360:11;10284:31;:88::i;:::-;10379:16;10440:13;10405:6;-1:-1:-1::0;;;;;10398:24:6::1;;10431:4;10398:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;10379:74:::0;-1:-1:-1;10480:35:6::1;:18;10508:6:::0;10480:27:::1;:35::i;:::-;10475:222;;10526:15;10544:47;10560:8;10570:4;:13;;;10585:5;10544:15;:47::i;:::-;10636:15:::0;;10526:65;;-1:-1:-1;10600:61:6::1;::::0;10628:6;;-1:-1:-1;;;;;10636:15:6::1;10526:65:::0;10600:27:::1;:61::i;:::-;10670:19;10682:7:::0;10670:19;::::1;:::i;:::-;;;10475:222;;10709:14;10739:9:::0;10734:2031:::1;10754:23:::0;;::::1;10734:2031;;;10795:28;10826:12;;10839:1;10826:15;;;;;-1:-1:-1::0;;;10826:15:6::1;;;;;;;;;;;;;;10795:46;;;;;;;;;;:::i;:::-;;;10887:10;:22;;;10860:10;:24;;;:49;10852:68;;;;-1:-1:-1::0;;;10852:68:6::1;;;;;;;:::i;:::-;10964:4;10939:10;:22;;;:29;10931:59;;;;-1:-1:-1::0;;;10931:59:6::1;;;;;;;:::i;:::-;11088:15;;11067:10;:17;;;:36;;11059:60;;;;-1:-1:-1::0;;;11059:60:6::1;;;;;;;:::i;:::-;11130:22;11155:57;11171:10;:17;;;11190:8;11200:11;11155:15;:57::i;:::-;-1:-1:-1::0;;;;;11229:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;;11130:82;;-1:-1:-1;11225:200:6::1;;11272:14;11263:23;;11225:200;;;-1:-1:-1::0;;;;;11358:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;;11326:87:::1;::::0;11342:14;;11374:18;;:38:::1;;11399:13;11374:38;;;11395:1;11374:38;11326:15;:87::i;:::-;11317:96;;11225:200;11452:1;11443:6;:10;11435:29;;;;-1:-1:-1::0;;;11435:29:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11475:14:6;::::1;;::::0;;;:6:::1;:14;::::0;;;;:24;;11493:6;;11475:14;:24:::1;::::0;11493:6;;11475:24:::1;:::i;:::-;::::0;;;-1:-1:-1;11510:31:6::1;::::0;-1:-1:-1;11527:14:6;11510:31;::::1;:::i;:::-;;;11554:27;;:::i;:::-;-1:-1:-1::0;;;;;11592:32:6;;::::1;::::0;;11635:26:::1;::::0;::::1;:35:::0;;;11708:24:::1;::::0;::::1;::::0;11681::::1;::::0;;::::1;:51:::0;;;;11768:22;::::1;::::0;11743::::1;::::0;;::::1;:47:::0;;;;11821:5:::1;::::0;11801:17:::1;::::0;::::1;:25:::0;11856:16;;11837:35;::::1;:16;::::0;::::1;:35:::0;11887:20;::::1;::::0;:34:::1;::::0;11883:369:::1;;12146:10;:20;;;-1:-1:-1::0;;;;;12129:51:6::1;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12220:20:6::1;::::0;::::1;::::0;-1:-1:-1;;;;;12197:43:6::1;:20;::::0;::::1;:43:::0;11883:369:::1;12311:5;::::0;;12305:12:::1;::::0;;;:5:::1;:12;::::0;;;;;;;;:25;;;;-1:-1:-1;;;;;12305:25:6;;::::1;-1:-1:-1::0;;;;;;12305:25:6;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;12341:18:::1;::::0;12352:6;12341:10:::1;:18::i;:::-;-1:-1:-1::0;;;;;;12370:19:6;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;12395:5:::1;::::0;12370:31;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;12489:16;;12483:23;;::::1;::::0;;:5:::1;:23:::0;;;12517:29:::1;12483:23:::0;12382:6;12517:21:::1;:29::i;:::-;-1:-1:-1::0;;;;;;12557:26:6;::::1;;::::0;;;:18:::1;::::0;::::1;:26;::::0;;;;;;12589:5:::1;::::0;;12557:38;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;;;12616:8;;;::::1;::::0;::::1;:::i;:::-;;;;;;12640:117;12647:10;:17;;;12666:6;12674:10;:16;;;12692:14;12708:10;:24;;;12734:10;:22;;;12640:117;;;;;;;;;;;:::i;:::-;;;;;;;;10734:2031;;;;10779:3;;;;;:::i;:::-;;;;10734:2031;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;;;9831:2939:6:o;26586:180::-;-1:-1:-1;;;;;26718:12:6;;;26695:7;26718:12;;;:5;:12;;;;;;;;:34;;;;;:26;;;;:34;;;;;:42;;26753:6;;26718:42;;;;-1:-1:-1;;;26718:42:6;;;;;;;;;;;;;;;;;26711:49;;26586:180;;;;;;:::o;27054:134::-;27127:4;27147:35;:18;27175:6;27147:27;:35::i;7410:94::-;1343:12:4;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7478:8:6::1;:20:::0;;-1:-1:-1;;;;;;7478:20:6::1;-1:-1:-1::0;;;;;7478:20:6;;;::::1;::::0;;;::::1;::::0;;7410:94::o;16232:1265::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;16319:26:6::1;16348:14:::0;;;:5:::1;:14;::::0;;;;16388:15:::1;::::0;16377:26;::::1;;16369:50;;;;-1:-1:-1::0;;;16369:50:6::1;;;;;;;:::i;:::-;16463:21:::0;;16456:54:::1;::::0;-1:-1:-1;;;16456:54:6;;16432:21:::1;::::0;-1:-1:-1;;;;;16463:21:6::1;::::0;16456:39:::1;::::0;:54:::1;::::0;16504:4:::1;::::0;16456:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16549:21:::0;;16432:78;;-1:-1:-1;16517:99:6::1;::::0;-1:-1:-1;;;;;16549:21:6::1;16580:10;16601:4;16608:7:::0;16517:31:::1;:99::i;:::-;16655:21:::0;;16648:54:::1;::::0;-1:-1:-1;;;16648:54:6;;16623:22:::1;::::0;16705:13;;-1:-1:-1;;;;;16655:21:6;;::::1;::::0;16648:39:::1;::::0;:54:::1;::::0;16696:4:::1;::::0;16648:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;16780:21:::0;;16623:95;;-1:-1:-1;16752:50:6::1;::::0;:18:::1;::::0;-1:-1:-1;;;;;16780:21:6::1;16752:27;:50::i;:::-;16747:270;;16815:15;16833:53;16849:14;16865:4;:13;;;16880:5;16833:15;:53::i;:::-;16925:21:::0;;16948:15;;16815:71;;-1:-1:-1;16897:76:6::1;::::0;-1:-1:-1;;;;;16925:21:6;;::::1;::::0;16948:15:::1;16815:71:::0;16897:27:::1;:76::i;:::-;16984:25;17002:7:::0;16984:25;::::1;:::i;:::-;;;16747:270;;17055:21:::0;;-1:-1:-1;;;;;17055:21:6::1;17023:14;17048:29:::0;;;:6:::1;:29;::::0;;;;;17044:189:::1;;-1:-1:-1::0;17102:14:6;17044:189:::1;;;17187:21:::0;;-1:-1:-1;;;;;17187:21:6::1;17180:29;::::0;;;:6:::1;:29;::::0;;;;;17148:77:::1;::::0;17164:14;;17211:13;17148:15:::1;:77::i;:::-;17139:86;;17044:189;17256:1;17247:6;:10;17239:29;;;;-1:-1:-1::0;;;17239:29:6::1;;;;;;;:::i;:::-;17282:21:::0;;-1:-1:-1;;;;;17282:21:6::1;17275:29;::::0;;;:6:::1;:29;::::0;;;;:39;;17308:6;;17275:29;:39:::1;::::0;17308:6;;17275:39:::1;:::i;:::-;;;;;;;;17349:6;17321:8;:24;;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17374:15:6::1;::::0;::::1;::::0;17391:21;;17414:14:::1;::::0;::::1;::::0;17446:22:::1;::::0;::::1;::::0;17470:20:::1;::::0;::::1;::::0;17367:124:::1;::::0;::::1;::::0;::::1;::::0;17374:15;;-1:-1:-1;;;;;17391:21:6;;::::1;::::0;17414:14;::::1;::::0;17430;;17367:124:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;16232:1265:6:o;20792:1044::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;20889:8:6::1;::::0;-1:-1:-1;;;;;20889:8:6::1;20873:51;;;;-1:-1:-1::0;;;20873:51:6::1;;;;;;;:::i;:::-;20931:26;20960:14:::0;;;:5:::1;:14;::::0;;;;20989::::1;::::0;::::1;::::0;-1:-1:-1;;;;;20989:14:6::1;21007:10;20989:28;20981:46;;;;-1:-1:-1::0;;;20981:46:6::1;;;;;;;:::i;:::-;21034:23;21087:8;:24;;;21060:8;:24;;;:51;;;;:::i;:::-;21034:77;;21144:1;21126:15;:19;21118:38;;;;-1:-1:-1::0;;;21118:38:6::1;;;;;;;:::i;:::-;21190:21:::0;;21183:54:::1;::::0;-1:-1:-1;;;21183:54:6;;21165:15:::1;::::0;-1:-1:-1;;;;;21190:21:6::1;::::0;21183:39:::1;::::0;:54:::1;::::0;21231:4:::1;::::0;21183:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21318:21:::0;;-1:-1:-1;;;;;21318:21:6::1;21244:22;21311:29:::0;;;:6:::1;:29;::::0;;;;;21165:72;;-1:-1:-1;21244:22:6;21269:72:::1;::::0;21285:15;;21165:72;;21269:15:::1;:72::i;:::-;21381:21:::0;;21412:8:::1;::::0;21244:97;;-1:-1:-1;21354:84:6::1;::::0;-1:-1:-1;;;;;21381:21:6;;::::1;::::0;21412:8:::1;21244:97:::0;21354:26:::1;:84::i;:::-;21445:8;;;;;;;;;-1:-1:-1::0;;;;;21445:8:6::1;-1:-1:-1::0;;;;;21445:16:6::1;;21462:8;:21;;;;;;;;;;-1:-1:-1::0;;;;;21462:21:6::1;21485:8;:24;;;21511:8;:24;;;21537:8;:22;;;21566:8;:20;;;21588:8;:15;;;21605:8;:14;;;;;;;;;;-1:-1:-1::0;;;;;21605:14:6::1;21621:8;:18;;;;;;;;;;-1:-1:-1::0;;;;;21621:18:6::1;21641:14;21657:7;21445:220;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;21705:24:6::1;::::0;::::1;::::0;21678::::1;::::0;::::1;:51:::0;21743:21;;-1:-1:-1;;;;;21743:21:6::1;-1:-1:-1::0;21736:29:6;;;:6:::1;:29;::::0;;;;:48;;21769:15;;-1:-1:-1;21736:48:6::1;::::0;21769:15;;21736:48:::1;:::i;:::-;::::0;;;-1:-1:-1;;21796:34:6::1;::::0;::::1;::::0;::::1;::::0;21806:7;;21815:14;;21796:34:::1;:::i;13141:1610::-:0;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;13223:26:6::1;13252:14:::0;;;:5:::1;:14;::::0;;;;13281::::1;::::0;::::1;::::0;-1:-1:-1;;;;;13281:14:6::1;13299:10;13281:28;13273:46;;;;-1:-1:-1::0;;;13273:46:6::1;;;;;;;:::i;:::-;13407:21:::0;;13400:54:::1;::::0;-1:-1:-1;;;13400:54:6;;13382:15:::1;::::0;-1:-1:-1;;;;;13407:21:6::1;::::0;13400:39:::1;::::0;:54:::1;::::0;13448:4:::1;::::0;13400:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13505:21:::0;;-1:-1:-1;;;;;13505:21:6::1;13461:18;13498:29:::0;;;:6:::1;:29;::::0;;;;;13382:72;;-1:-1:-1;13461:18:6;13482:64:::1;::::0;13529:7;13382:72;13482:15:::1;:64::i;:::-;13461:85:::0;-1:-1:-1;13691:15:6;;:30;::::1;;;;13720:1;13710:7;:11;13691:30;13687:66;;;13732:13:::0;::::1;::::0;::::1;:::i;:::-;;;;13687:66;13780:1;13767:10;:14;13759:41;;;;-1:-1:-1::0;;;13759:41:6::1;;;;;;;:::i;:::-;13807:26;13836:38;13858:8;:15;;;13836:21;:38::i;:::-;13807:67:::0;-1:-1:-1;13807:67:6;13996:14:::1;:10:::0;14009:1:::1;13996:14;:::i;:::-;:36;13992:197;;;14070:21:::0;;-1:-1:-1;;;;;14070:21:6::1;14063:29;::::0;;;:6:::1;:29;::::0;;;;;14047:96:::1;::::0;14094:39:::1;14063:29:::0;14094:7;:39:::1;:::i;:::-;14135:7;14047:15;:96::i;:::-;14043:139;;14160:12:::0;::::1;::::0;::::1;:::i;:::-;;;;14043:139;14225:10;14203:18;:32;;14195:51;;;;-1:-1:-1::0;;;14195:51:6::1;;;;;;;:::i;:::-;14281:10;14253:8;:24;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;14520:21:6;;-1:-1:-1;;;;;14520:21:6::1;14451:22;14513:29:::0;;;:6:::1;:29;::::0;;;;;14476:67:::1;::::0;14492:10;;14504:7;;14476:15:::1;:67::i;:::-;14557:21:::0;;-1:-1:-1;;;;;14557:21:6::1;14550:29;::::0;;;:6:::1;:29;::::0;;;;:43;;14451:92;;-1:-1:-1;14583:10:6;;14550:29;;;:43:::1;::::0;14583:10;;14550:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;14634:21:6;;14606:78:::1;::::0;-1:-1:-1;;;;;14634:21:6::1;14657:10;14669:14:::0;14606:27:::1;:78::i;:::-;14707:21:::0;;14696:49:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;14707:21:6;;::::1;::::0;14730:14;;14696:49:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;;;13141:1610:6:o;17717:1334::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;17830:10:6::1;-1:-1:-1::0;;;;;17830:23:6;::::1;;;17822:40;;;;-1:-1:-1::0;;;17822:40:6::1;;;;;;;:::i;:::-;17869:33;17905:14:::0;;;:5:::1;:14;::::0;;;;17934:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;17934:21:6::1;17959:10;17934:35;17926:53;;;;-1:-1:-1::0;;;17926:53:6::1;;;;;;;:::i;:::-;17992:27;;:::i;:::-;18052:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18052:28:6::1;18026:10;:23;;:54;-1:-1:-1::0;;;;;18026:54:6::1;;;-1:-1:-1::0;;;;;18026:54:6::1;;;::::0;::::1;18116:15;:31;;;18087:10;:26;;:60;;;::::0;::::1;18183:15;:31;;;18154:10;:26;;:60;;;::::0;::::1;18248:15;:29;;;18221:10;:24;;:56;;;::::0;::::1;18309:15;:27;;;18284:10;:22;;:52;;;::::0;::::1;18363:5;;18343:10;:17;;:25;;;::::0;::::1;18394:9;18375:10;:16;;:28;-1:-1:-1::0;;;;;18375:28:6::1;;;-1:-1:-1::0;;;;;18375:28:6::1;;;::::0;::::1;18433:15;:25;;;;;;;;;;-1:-1:-1::0;;;;;18433:25:6::1;18410:10;:20;;:48;-1:-1:-1::0;;;;;18410:48:6::1;;;-1:-1:-1::0;;;;;18410:48:6::1;;;::::0;::::1;18519:10;18504:5;:12;18510:5;;18504:12;;;;;;;;;;;:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;-1:-1:-1::0;;;;;18504:25:6::1;;;;;;;;;18536:11;:41;18548:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18548:28:6::1;-1:-1:-1::0;;;;;18536:41:6::1;-1:-1:-1::0;;;;;18536:41:6::1;;;;;;;;;;;;18583:5;;18536:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18645:25;18673:5;:16;18679:9;-1:-1:-1::0;;;;;18673:16:6::1;-1:-1:-1::0;;;;;18673:16:6::1;;;;;;;;;;;;18645:44;;18696:55;18722:15;:28;;;;;;;;;;-1:-1:-1::0;;;;;18722:28:6::1;18696:8;:21;;:25;;:55;;;;:::i;:::-;-1:-1:-1::0;18781:28:6;;-1:-1:-1;;;;;18781:28:6::1;18758:52;::::0;;;:22:::1;::::0;::::1;:52;::::0;;;;;;18816:17:::1;::::0;::::1;::::0;18758:76;;18781:28;18758:76;::::1;::::0;;;;;;;;::::1;::::0;18841:5:::1;:8:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;18937:31:6::1;::::0;::::1;::::0;18903::::1;::::0;::::1;:65:::0;19004:17:::1;::::0;::::1;::::0;18980:65:::1;::::0;::::1;::::0;::::1;::::0;18995:7;;19004:17;19023:10:::1;::::0;19035:9;;18980:65:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;;;17717:1334:6:o;22105:289::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;22177:26:6::1;22206:14:::0;;;:5:::1;:14;::::0;;;;22235::::1;::::0;::::1;::::0;-1:-1:-1;;;;;22235:14:6::1;22253:10;22235:28;22227:46;;;;-1:-1:-1::0;;;22227:46:6::1;;;;;;;:::i;:::-;22288:18;::::0;::::1;::::0;-1:-1:-1;;;;;22288:18:6::1;22280:41;;;::::0;::::1;;22357:18;;:31:::0;;-1:-1:-1;;;;;;22357:31:6::1;::::0;;-1:-1:-1;22357:31:6;2632:22:5;;22105:289:6:o;19353:1337::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;19444:11:6;19436:35:::1;;;;-1:-1:-1::0;;;19436:35:6::1;;;;;;;:::i;:::-;19478:26;19507:14:::0;;;:5:::1;:14;::::0;;;;19536::::1;::::0;::::1;::::0;-1:-1:-1;;;;;19536:14:6::1;19554:10;19536:28;19528:46;;;;-1:-1:-1::0;;;19528:46:6::1;;;;;;;:::i;:::-;19589:22;::::0;::::1;::::0;:27;19581:51:::1;;;;-1:-1:-1::0;;;19581:51:6::1;;;;;;;:::i;:::-;19722:21:::0;;19715:54:::1;::::0;-1:-1:-1;;;19715:54:6;;19697:15:::1;::::0;-1:-1:-1;;;;;19722:21:6::1;::::0;19715:39:::1;::::0;:54:::1;::::0;19763:4:::1;::::0;19715:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19824:21:::0;;-1:-1:-1;;;;;19824:21:6::1;19776:22;19817:29:::0;;;:6:::1;:29;::::0;;;;;19697:72;;-1:-1:-1;19776:22:6;19801:64:::1;::::0;19848:7;19697:72;19801:15:::1;:64::i;:::-;19776:89;;19927:8;:24;;;19909:14;19882:8;:24;;;:41;;;;:::i;:::-;:69;;19874:78;;;::::0;::::1;;19965:27;;:::i;:::-;20025:21:::0;;-1:-1:-1;;;;;20025:21:6;;::::1;19999:47:::0;;20053:26:::1;::::0;::::1;:43:::0;;;20128:20:::1;::::0;::::1;::::0;20103:22:::1;::::0;::::1;:45:::0;20175:5:::1;::::0;20155:17:::1;::::0;::::1;:25:::0;20206:10:::1;20187:16;::::0;::::1;:29:::0;20246:18:::1;::::0;::::1;::::0;::::1;20223:20;::::0;::::1;:41:::0;20305:24:::1;::::0;::::1;:42:::0;;20082:14;;20305:24;20025:21:::1;::::0;20305:42:::1;::::0;20082:14;;20305:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;20403:5:6::1;::::0;;20397:12:::1;::::0;;;:5:::1;:12;::::0;;;;;;;:25;;;;-1:-1:-1;;;;;;20397:25:6;;::::1;-1:-1:-1::0;;;;;20397:25:6;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;20397:25:6;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;;;20441:21;;;::::1;20429:34:::0;;;;;;;;20469:5;;20429:46;;;;::::1;::::0;;;;;;;;;;::::1;::::0;20537:10:::1;20531:17:::0;;:5:::1;:17:::0;;;;;20563:21;;;;::::1;20531:54:::0;;:31;::::1;:54:::0;;;;;20591:17;;20531:78;;;;::::1;::::0;;;;;;;;::::1;::::0;20616:8;;;20403:5;20616:8:::1;::::0;::::1;:::i;:::-;;;;;;20636:48;20648:7;20657:10;:17;;;20676:7;20636:48;;;;;;;;:::i;22511:138::-:0;22577:4;22617:9;-1:-1:-1;;;;;22600:40:6;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1752:145:4:-;1343:12;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;1858:1:::1;1842:6:::0;;1821:40:::1;::::0;-1:-1:-1;;;;;1842:6:4;;::::1;::::0;1821:40:::1;::::0;1858:1;;1821:40:::1;1888:1;1871:19:::0;;-1:-1:-1;;;;;;1871:19:4::1;::::0;;1752:145::o;7512:110:6:-;1343:12:4;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7595:9:6::1;:21:::0;;-1:-1:-1;;;;;;7595:21:6::1;-1:-1:-1::0;;;;;7595:21:6;;;::::1;::::0;;;::::1;::::0;;7512:110::o;25580:98::-;25634:7;25657:15;:6;:13;:15::i;8050:197::-;1343:12:4;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;8135:4:6::1;8131:111;;;8150:29;:18;8173:5:::0;8150:22:::1;:29::i;:::-;;8131:111;;;8202:32;:18;8228:5:::0;8202:25:::1;:32::i;:::-;;8131:111;8050:197:::0;;:::o;6423:21::-;;;;;;;;;-1:-1:-1;;;;;6423:21:6;;;;;;:::o;25937:143::-;-1:-1:-1;;;;;26047:19:6;;26024:7;26047:19;;;:11;:19;;;;;:27;;26067:6;;26047:27;;;;-1:-1:-1;;;26047:27:6;;;;;;;;;;;;;;;;;26040:34;;25937:143;;;;:::o;1120:85:4:-;1166:7;1192:6;-1:-1:-1;;;;;1192:6:4;1120:85;:::o;26254:155:6:-;-1:-1:-1;;;;;26367:12:6;;26344:7;26367:12;;;:5;:12;;;;;:36;;26396:6;26367:28;:36::i;25686:111::-;25751:7;25774:17;:6;25784;25774:9;:17::i;6484:25::-;;;-1:-1:-1;;;;;6484:25:6;;:::o;8326:529::-;8408:35;:18;8436:6;8408:27;:35::i;:::-;8407:36;8399:53;;;;-1:-1:-1;;;8399:53:6;;;;;;;:::i;:::-;8486:21;;-1:-1:-1;;;;;8486:21:6;8482:329;;8557:19;;8544:9;:32;8536:56;;;;-1:-1:-1;;;8536:56:6;;;;;;;:::i;:::-;8605:15;;8630:19;;8605:45;;-1:-1:-1;;;;;8605:15:6;;;;:45;;;;;8630:19;8605:15;:45;:15;:45;8630:19;8605:15;:45;;;;;;;;;;;;;;;;;;;;;8482:329;;;8719:21;;8764:15;;8781:19;;8679:122;;-1:-1:-1;;;;;8719:21:6;;;;8751:10;;8764:15;;;8679:31;:122::i;:::-;8819:30;:18;8842:6;8819:22;:30::i;26109:137::-;-1:-1:-1;;;;;26206:12:6;;26183:7;26206:12;;;:5;:12;;;;;:34;;:32;:34::i;26916:130::-;26988:7;27011:29;:18;27033:6;27011:21;:29::i;14876:1118::-;1749:1:5;2329:7;;:19;;2321:63;;;;-1:-1:-1;;;2321:63:5;;;;;;;:::i;:::-;1749:1;2459:7;:18;14984:4:6::1;14969:19:::0;::::1;14961:36;;;;-1:-1:-1::0;;;14961:36:6::1;;;;;;;:::i;:::-;15062:26;15091:14:::0;;;:5:::1;:14;::::0;;;;15120::::1;::::0;::::1;::::0;-1:-1:-1;;;;;15120:14:6::1;15138:10;15120:28;15112:46;;;;-1:-1:-1::0;;;15112:46:6::1;;;;;;;:::i;:::-;15196:12;15173:8;:20;;;:35;15165:51;;;;-1:-1:-1::0;;;15165:51:6::1;;;;;;;:::i;:::-;15276:21:::0;;15248:50:::1;::::0;:18:::1;::::0;-1:-1:-1;;;;;15276:21:6::1;15248:27;:50::i;:::-;15243:661;;15311:23;15364:8;:24;;;15337:8;:24;;;:51;;;;:::i;:::-;15311:77;;15399:19;15421:54;15437:15;15454:4;:13;;;15469:5;15421:15;:54::i;:::-;15511:21:::0;;15504:54:::1;::::0;-1:-1:-1;;;15504:54:6;;15399:76;;-1:-1:-1;15486:15:6::1;::::0;-1:-1:-1;;;;;15511:21:6;;::::1;::::0;15504:39:::1;::::0;:54:::1;::::0;15552:4:::1;::::0;15504:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15636:21:::0;;-1:-1:-1;;;;;15636:21:6::1;15569:19;15629:29:::0;;;:6:::1;:29;::::0;;;;;15486:72;;-1:-1:-1;15569:19:6;15591:109:::1;::::0;15607:11;;15486:72;;15629:34;:70:::1;;15677:21:::0;;-1:-1:-1;;;;;15677:21:6::1;15670:29;::::0;;;:6:::1;:29;::::0;;;;;15629:70:::1;;15591:109;15739:21:::0;;15762:15;;15569:131;;-1:-1:-1;15711:80:6::1;::::0;-1:-1:-1;;;;;15739:21:6;;::::1;::::0;15762:15:::1;15569:131:::0;15711:27:::1;:80::i;:::-;15830:11;15802:8;:24;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15859:21:6;;-1:-1:-1;;;;;15859:21:6::1;15852:29;::::0;;;:6:::1;:29;::::0;;;;:44;;15885:11;;15852:29;:44:::1;::::0;15885:11;;15852:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;15243:661:6::1;15910:20;::::0;::::1;:35:::0;;;15957:31:::1;::::0;::::1;::::0;::::1;::::0;15966:7;;15933:12;;15957:31:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;1706:1:5;2632:22;;-1:-1:-1;14876:1118:6:o;8946:295::-;9028:11;;:35;;-1:-1:-1;;;9028:35:6;;-1:-1:-1;;;;;9028:11:6;;;;:23;;:35;;9052:10;;9028:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;;-1:-1:-1;9067:39:6;:18;9095:10;9067:27;:39::i;:::-;9020:96;;;;-1:-1:-1;;;9020:96:6;;;;;;;:::i;:::-;9127:4;9123:113;;;9142:30;:18;9165:6;9142:22;:30::i;9123:113::-;9195:33;:18;9221:6;9195:25;:33::i;26417:161::-;-1:-1:-1;;;;;26531:12:6;;;26508:7;26531:12;;;:5;:12;;;;;;;;:34;;;;;;:26;;;;:34;;;;:41;;26417:161::o;5789:38::-;;;;;;;;;;;;;:::o;6514:32::-;;;-1:-1:-1;;;;;6514:32:6;;:::o;24220:230::-;24308:7;24324:15;24349:6;-1:-1:-1;;;;;24342:24:6;;24375:4;24342:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24411:14:6;;;;;;:6;:14;;;;;;24324:57;;-1:-1:-1;24395:49:6;;24427:7;24324:57;24395:15;:49::i;5350:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5350:42:6;;;;;;;;;;;;;;;;;;:::o;27479:134::-;27553:4;27573:34;:18;27601:5;27573:27;:34::i;25805:124::-;-1:-1:-1;;;;;25897:19:6;25874:7;25897:19;;;:11;:19;;;;;:26;;25805:124::o;23499:462::-;23571:7;23616:14;;;:5;:14;;;;;23688:15;;;;23571:7;;23666:38;;:21;:38::i;:::-;23736:21;;23729:54;;-1:-1:-1;;;23729:54:6;;23637:67;;-1:-1:-1;23711:15:6;;-1:-1:-1;;;;;23736:21:6;;;;23729:39;;:54;;23777:4;;23729:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23865:21;;-1:-1:-1;;;;;23865:21:6;23790:20;23858:29;;;:6;:29;;;;;;23711:72;;-1:-1:-1;23790:20:6;23813:116;;23829:18;;23711:72;;23858:34;:70;;23906:21;;-1:-1:-1;;;;;23906:21:6;23899:29;;;;:6;:29;;;;;;23858:70;;23813:116;23790:139;23499:462;-1:-1:-1;;;;;;23499:462:6:o;24609:963::-;24667:7;24795:14;;;:5;:14;;;;;;;;24766:43;;;;;;;;;-1:-1:-1;;;;;24766:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24838:55;;-1:-1:-1;;;24838:55:6;;24667:7;;;;;;;;;;;;;;;;;;24766:43;;24667:7;;24766:43;;24838:40;;:55;;24887:4;;24838:55;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24934:22;;-1:-1:-1;;;;;24927:30:6;24902:22;24927:30;;;:6;:30;;;;;;24820:73;;-1:-1:-1;24902:22:6;24927:35;:72;;24976:22;;-1:-1:-1;;;;;24969:30:6;;;;;:6;:30;;;;;;24927:72;;;24965:1;24927:72;24902:97;;25131:23;25157:67;25173:9;:25;;;25200:7;25209:14;25157:15;:67::i;:::-;25131:93;;25233:23;25259:67;25275:9;:25;;;25302:7;25311:14;25259:15;:67::i;:::-;25233:93;;25343:9;:16;;;25361:9;:22;;;25385:15;25402;25419:9;:25;;;25446:9;:25;;;25473:9;:23;;;25498:9;:21;;;25529:9;:15;;;25546:9;:19;;;25335:231;;;;;;;;;;;;;;;;;;;;;;;;;24609:963;;;;;;;;;;;:::o;22761:647::-;22831:7;22876:14;;;:5;:14;;;;;22914:22;;;;22831:7;;22914:27;:35;;22948:1;22914:35;;;22944:1;22914:35;22897:52;;22956:14;22973:8;:13;;22985:1;22973:13;:94;;23043:8;:24;;;22973:94;;;23016:8;:24;;;22989:8;:24;;;:51;;;;:::i;:::-;22956:111;;23074:20;23116:178;23166:8;:22;;;23198:8;:20;;;23228:6;23244:15;23269:8;:18;;;;;;;;;;-1:-1:-1;;;;;23269:18:6;23116:40;:178::i;:::-;23101:193;;23305:8;:13;;23317:1;23305:13;23301:76;;;23345:24;;;;23329:40;;;;:::i;23301:76::-;23390:12;22761:647;-1:-1:-1;;;;;22761:647:6:o;5429:24::-;;;;:::o;27337:134::-;27413:7;27436:29;:18;27458:6;27436:21;:29::i;5533:36::-;;;;:::o;2046:240:4:-;1343:12;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;2134:22:4;::::1;2126:73;;;;-1:-1:-1::0;;;2126:73:4::1;;;;;;;:::i;:::-;2235:6;::::0;;2214:38:::1;::::0;-1:-1:-1;;;;;2214:38:4;;::::1;::::0;2235:6;::::1;::::0;2214:38:::1;::::0;::::1;2262:6;:17:::0;;-1:-1:-1;;;;;;2262:17:4::1;-1:-1:-1::0;;;;;2262:17:4;;;::::1;::::0;;;::::1;::::0;;2046:240::o;7630:302:6:-;1343:12:4;:10;:12::i;:::-;-1:-1:-1;;;;;1332:23:4;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1332:23:4;;1324:68;;;;-1:-1:-1;;;1324:68:4;;;;;;;:::i;:::-;7773:4:6::1;:25:::0;;;;7805:19;:37;;;;7849:15;:29;;-1:-1:-1;;;;;7849:29:6;;::::1;-1:-1:-1::0;;;;;;7849:29:6;;::::1;;::::0;;;7885:21;:41;;;;;::::1;::::0;::::1;;::::0;;7630:302::o;7294:115:1:-;7357:7;7383:19;7391:3;7383:7;:19::i;889:4081:2:-;1005:14;;;-1:-1:-1;;1521:1:2;1518;1511:20;1561:1;1558;1554:9;1545:18;;1613:5;1609:2;1606:13;1598:5;1594:2;1590:14;1586:34;1577:43;;;1706:5;1715:1;1706:10;1702:185;;;1755:1;1741:11;:15;1733:24;;;;;;-1:-1:-1;1810:23:2;;;;-1:-1:-1;1862:13:2;;1702:185;2018:5;2004:11;:19;1996:28;;;;;;2309:17;2387:11;2384:1;2381;2374:25;3845:1;2825;2791:31;;:35;;2790:51;;2950:22;;;;3826:1;:15;;3825:21;;4092:17;;;4088:21;;4081:28;4155:17;;;4151:21;;4144:28;4219:17;;;4215:21;;4208:28;4283:17;;;4279:21;;4272:28;4347:17;;;4343:21;;4336:28;4412:17;;;4408:21;;;4401:28;;;2775:12;3373;;;3369:23;;;3365:31;;;2520:20;;;2509:32;;;3434:12;;;;2564:21;;3099:16;;;;3425:21;;;;4912:11;;;-1:-1:-1;;;;889:4081:2:o;802:323:7:-;902:12;916:17;937:5;-1:-1:-1;;;;;937:10:7;971;983:4;989:2;993:5;948:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;948:51:7;;;;;;;;;;;937:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;901:99;;;;1019:7;:57;;;;-1:-1:-1;1031:11:7;;:16;;:44;;;1062:4;1051:24;;;;;;;;;;;;:::i;:::-;1011:106;;;;-1:-1:-1;;;1011:106:7;;;;;;;:::i;:::-;802:323;;;;;;:::o;7048:165:1:-;7128:4;7151:55;7161:3;-1:-1:-1;;;;;7181:23:1;;7151:9;:55::i;500:294:7:-;582:12;596:17;617:5;-1:-1:-1;;;;;617:10:7;651;663:2;667:5;628:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;628:45:7;;;;;;;;;;;617:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:93;;;;693:7;:57;;;;-1:-1:-1;705:11:7;;:16;;:44;;;736:4;725:24;;;;;;;;;;;;:::i;:::-;685:101;;;;-1:-1:-1;;;685:101:7;;;;;;;:::i;:::-;500:294;;;;;:::o;6493:150:1:-;6563:4;6586:50;6591:3;-1:-1:-1;;;;;6611:23:1;;6586:4;:50::i;644:96:0:-;723:10;644:96;:::o;200:292:7:-;281:12;295:17;316:5;-1:-1:-1;;;;;316:10:7;350;362:2;366:5;327:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;327:45:7;;;;;;;;;;;316:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;280:93;;;;392:7;:57;;;;-1:-1:-1;404:11:7;;:16;;:44;;;435:4;424:24;;;;;;;;;;;;:::i;:::-;384:100;;;;-1:-1:-1;;;384:100:7;;;;;;;:::i;6811:156:1:-;6884:4;6907:53;6915:3;-1:-1:-1;;;;;6935:23:1;;6907:7;:53::i;7741:156::-;7815:7;7865:22;7869:3;7881:5;7865:3;:22::i;486:1303:9:-;639:7;-1:-1:-1;;;;;969:23:9;;;;;;:69;;;1013:9;-1:-1:-1;;;;;996:40:9;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;965:105;;;-1:-1:-1;1056:6:9;1049:13;;965:105;1140:18;;;:50;;;1179:11;1162:13;:28;1140:50;1136:118;;;1224:9;1210:11;:23;:36;;1245:1;1210:36;;;1236:6;1210:36;1203:43;;;;1136:118;1334:9;1354:23;;;1350:71;;;-1:-1:-1;1402:11:9;1350:71;1443:13;1431:9;:25;1427:75;;;-1:-1:-1;1481:13:9;1427:75;1508:15;1526:25;1538:13;1526:9;:25;:::i;:::-;1508:43;-1:-1:-1;1558:18:9;1579:27;1593:13;1579:11;:27;:::i;:::-;1558:48;;1620:44;1636:6;1644:7;1653:10;1620:15;:44::i;:::-;1613:51;486:1303;-1:-1:-1;;;;;;;;;486:1303:9:o;4077:107:1:-;4159:18;;4077:107::o;3869:127::-;3942:4;3965:19;;;:12;;;;;:19;;;;;;:24;;;3869:127::o;1704:404::-;1767:4;1788:21;1798:3;1803:5;1788:9;:21::i;:::-;1783:319;;-1:-1:-1;1825:23:1;;;;;;;;:11;:23;;;;;;;;;;;;;2005:18;;1983:19;;;:12;;;:19;;;;;;:40;;;;2037:11;;1783:319;-1:-1:-1;2086:5:1;2079:12;;2276:1512;2342:4;2479:19;;;:12;;;:19;;;;;;2513:15;;2509:1273;;2870:21;2894:14;2907:1;2894:10;:14;:::i;:::-;2942:18;;2870:38;;-1:-1:-1;2922:17:1;;2942:22;;2963:1;;2942:22;:::i;:::-;2922:42;;3204:17;3224:3;:11;;3236:9;3224:22;;;;;;-1:-1:-1;;;3224:22:1;;;;;;;;;;;;;;;;;3204:42;;3367:9;3338:3;:11;;3350:13;3338:26;;;;;;-1:-1:-1;;;3338:26:1;;;;;;;;;;;;;;;;;;:38;3468:17;:13;3484:1;3468:17;:::i;:::-;3442:23;;;;:12;;;:23;;;;;:43;3591:17;;3442:3;;3591:17;;;-1:-1:-1;;;3591:17:1;;;;;;;;;;;;;;;;;;;;;;;;;;3683:3;:12;;:19;3696:5;3683:19;;;;;;;;;;;3676:26;;;3724:4;3717:11;;;;;;;;2509:1273;3766:5;3759:12;;;;;4516:201;4610:18;;4583:7;;4610:26;-1:-1:-1;4602:73:1;;;;-1:-1:-1;;;4602:73:1;;;;;;;:::i;:::-;4692:3;:11;;4704:5;4692:18;;;;;;-1:-1:-1;;;4692:18:1;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:259:10:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:10;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:470::-;;;;831:2;819:9;810:7;806:23;802:32;799:2;;;852:6;844;837:22;799:2;896:9;883:23;915:33;942:5;915:33;:::i;:::-;967:5;-1:-1:-1;1024:2:10;1009:18;;996:32;1037:35;996:32;1037:35;:::i;:::-;789:366;;1091:7;;-1:-1:-1;;;1145:2:10;1130:18;;;;1117:32;;789:366::o;1160:834::-;;;;1353:2;1341:9;1332:7;1328:23;1324:32;1321:2;;;1374:6;1366;1359:22;1321:2;1418:9;1405:23;1437:33;1464:5;1437:33;:::i;:::-;1489:5;-1:-1:-1;1545:2:10;1530:18;;1517:32;1568:18;1598:14;;;1595:2;;;1630:6;1622;1615:22;1595:2;1673:6;1662:9;1658:22;1648:32;;1718:7;1711:4;1707:2;1703:13;1699:27;1689:2;;1745:6;1737;1730:22;1689:2;1790;1777:16;1816:2;1808:6;1805:14;1802:2;;;1837:6;1829;1822:22;1802:2;1898:7;1893:2;1885:4;1877:6;1873:17;1869:2;1865:26;1861:35;1858:48;1855:2;;;1924:6;1916;1909:22;1855:2;1960;1956;1952:11;1942:21;;1982:6;1972:16;;;;;1311:683;;;;;:::o;1999:396::-;;;2125:2;2113:9;2104:7;2100:23;2096:32;2093:2;;;2146:6;2138;2131:22;2093:2;2190:9;2177:23;2209:33;2236:5;2209:33;:::i;:::-;2261:5;-1:-1:-1;2318:2:10;2303:18;;2290:32;2331;2290;2331;:::i;2400:327::-;;;2529:2;2517:9;2508:7;2504:23;2500:32;2497:2;;;2550:6;2542;2535:22;2497:2;2594:9;2581:23;2613:33;2640:5;2613:33;:::i;:::-;2665:5;2717:2;2702:18;;;;2689:32;;-1:-1:-1;;;2487:240:10:o;2732:257::-;;2852:2;2840:9;2831:7;2827:23;2823:32;2820:2;;;2873:6;2865;2858:22;2820:2;2910:9;2904:16;2929:30;2953:5;2929:30;:::i;3562:969::-;;3701:3;3689:9;3680:7;3676:23;3672:33;3669:2;;;3723:6;3715;3708:22;3669:2;3761;3755:9;3803:3;3795:6;3791:16;3873:6;3861:10;3858:22;3837:18;3825:10;3822:34;3819:62;3816:2;;;-1:-1:-1;;;3904:36:10;;3963:4;3960:1;3953:15;3996:4;3911:6;3981:20;3816:2;4027;4020:22;4064:23;;4096:33;4064:23;4096:33;:::i;:::-;4153:5;4145:6;4138:21;;4220:2;4209:9;4205:18;4192:32;4187:2;4179:6;4175:15;4168:57;4286:2;4275:9;4271:18;4258:32;4253:2;4245:6;4241:15;4234:57;4352:2;4341:9;4337:18;4324:32;4319:2;4311:6;4307:15;4300:57;4409:3;4398:9;4394:19;4381:33;4423:35;4450:7;4423:35;:::i;:::-;4486:3;4474:16;;4467:33;4478:6;3659:872;-1:-1:-1;;;3659:872:10:o;4536:190::-;;4648:2;4636:9;4627:7;4623:23;4619:32;4616:2;;;4669:6;4661;4654:22;4616:2;-1:-1:-1;4697:23:10;;4606:120;-1:-1:-1;4606:120:10:o;4731:194::-;;4854:2;4842:9;4833:7;4829:23;4825:32;4822:2;;;4875:6;4867;4860:22;4822:2;-1:-1:-1;4903:16:10;;4812:113;-1:-1:-1;4812:113:10:o;4930:335::-;;;5067:2;5055:9;5046:7;5042:23;5038:32;5035:2;;;5088:6;5080;5073:22;5035:2;5129:9;5116:23;5106:33;;5189:2;5178:9;5174:18;5161:32;5202:33;5229:5;5202:33;:::i;5270:258::-;;;5399:2;5387:9;5378:7;5374:23;5370:32;5367:2;;;5420:6;5412;5405:22;5367:2;-1:-1:-1;;5448:23:10;;;5518:2;5503:18;;;5490:32;;-1:-1:-1;5357:171:10:o;5533:547::-;;;;;5704:3;5692:9;5683:7;5679:23;5675:33;5672:2;;;5726:6;5718;5711:22;5672:2;5767:9;5754:23;5744:33;;5824:2;5813:9;5809:18;5796:32;5786:42;;5878:2;5867:9;5863:18;5850:32;5891:33;5918:5;5891:33;:::i;:::-;5943:5;-1:-1:-1;6000:2:10;5985:18;;5972:32;6013:35;5972:32;6013:35;:::i;:::-;5662:418;;;;-1:-1:-1;5662:418:10;;-1:-1:-1;;5662:418:10:o;6085:430::-;;6252:6;6246:13;6277:3;6289:129;6303:6;6300:1;6297:13;6289:129;;;6401:4;6385:14;;;6381:25;;6375:32;6362:11;;;6355:53;6318:12;6289:129;;;6436:6;6433:1;6430:13;6427:2;;;6471:3;6462:6;6457:3;6453:16;6446:29;6427:2;-1:-1:-1;6493:16:10;;;;;6222:293;-1:-1:-1;;6222:293:10:o;6520:203::-;-1:-1:-1;;;;;6684:32:10;;;;6666:51;;6654:2;6639:18;;6621:102::o;6728:375::-;-1:-1:-1;;;;;6986:15:10;;;6968:34;;7038:15;;;;7033:2;7018:18;;7011:43;7085:2;7070:18;;7063:34;;;;6918:2;6903:18;;6885:218::o;7108:274::-;-1:-1:-1;;;;;7300:32:10;;;;7282:51;;7364:2;7349:18;;7342:34;7270:2;7255:18;;7237:145::o;7387:744::-;-1:-1:-1;;;;;7786:15:10;;;7768:34;;7833:2;7818:18;;7811:34;;;;7876:2;7861:18;;7854:34;;;;7919:2;7904:18;;7897:34;;;;7962:3;7947:19;;7940:35;;;;7748:3;7991:19;;7984:35;8056:15;;8050:3;8035:19;;8028:44;8109:15;;;8103:3;8088:19;;8081:44;7717:3;7702:19;;7684:447::o;8136:888::-;-1:-1:-1;;;;;8591:15:10;;;8573:34;;8638:2;8623:18;;8616:34;;;;8681:2;8666:18;;8659:34;;;;8724:2;8709:18;;8702:34;;;;8767:3;8752:19;;8745:35;;;;8553:3;8796:19;;8789:35;;;;8861:15;;8855:3;8840:19;;8833:44;8914:15;;;8908:3;8893:19;;8886:44;8961:3;8946:19;;8939:35;;;;9005:3;8990:19;;8983:35;;;;8522:3;8507:19;;8489:535::o;9029:187::-;9194:14;;9187:22;9169:41;;9157:2;9142:18;;9124:92::o;9677:398::-;9879:2;9861:21;;;9918:2;9898:18;;;9891:30;9957:34;9952:2;9937:18;;9930:62;-1:-1:-1;;;10023:2:10;10008:18;;10001:32;10065:3;10050:19;;9851:224::o;10080:341::-;10282:2;10264:21;;;10321:2;10301:18;;;10294:30;-1:-1:-1;;;10355:2:10;10340:18;;10333:47;10412:2;10397:18;;10254:167::o;10426:355::-;10628:2;10610:21;;;10667:2;10647:18;;;10640:30;10706:33;10701:2;10686:18;;10679:61;10772:2;10757:18;;10600:181::o;10786:329::-;10988:2;10970:21;;;11027:1;11007:18;;;11000:29;-1:-1:-1;;;11060:2:10;11045:18;;11038:36;11106:2;11091:18;;10960:155::o;11120:402::-;11322:2;11304:21;;;11361:2;11341:18;;;11334:30;11400:34;11395:2;11380:18;;11373:62;-1:-1:-1;;;11466:2:10;11451:18;;11444:36;11512:3;11497:19;;11294:228::o;11527:327::-;11729:2;11711:21;;;11768:1;11748:18;;;11741:29;-1:-1:-1;;;11801:2:10;11786:18;;11779:34;11845:2;11830:18;;11701:153::o;11859:354::-;12061:2;12043:21;;;12100:2;12080:18;;;12073:30;12139:32;12134:2;12119:18;;12112:60;12204:2;12189:18;;12033:180::o;12218:330::-;12420:2;12402:21;;;12459:1;12439:18;;;12432:29;-1:-1:-1;;;12492:2:10;12477:18;;12470:37;12539:2;12524:18;;12392:156::o;12553:328::-;12755:2;12737:21;;;12794:1;12774:18;;;12767:29;-1:-1:-1;;;12827:2:10;12812:18;;12805:35;12872:2;12857:18;;12727:154::o;12886:327::-;13088:2;13070:21;;;13127:1;13107:18;;;13100:29;-1:-1:-1;;;13160:2:10;13145:18;;13138:34;13204:2;13189:18;;13060:153::o;13218:335::-;13420:2;13402:21;;;13459:2;13439:18;;;13432:30;-1:-1:-1;;;13493:2:10;13478:18;;13471:41;13544:2;13529:18;;13392:161::o;13558:356::-;13760:2;13742:21;;;13779:18;;;13772:30;13838:34;13833:2;13818:18;;13811:62;13905:2;13890:18;;13732:182::o;13919:329::-;14121:2;14103:21;;;14160:1;14140:18;;;14133:29;-1:-1:-1;;;14193:2:10;14178:18;;14171:36;14239:2;14224:18;;14093:155::o;14253:332::-;14455:2;14437:21;;;14494:1;14474:18;;;14467:29;-1:-1:-1;;;14527:2:10;14512:18;;14505:39;14576:2;14561:18;;14427:158::o;14590:326::-;14792:2;14774:21;;;14831:1;14811:18;;;14804:29;-1:-1:-1;;;14864:2:10;14849:18;;14842:33;14907:2;14892:18;;14764:152::o;14921:335::-;15123:2;15105:21;;;15162:2;15142:18;;;15135:30;-1:-1:-1;;;15196:2:10;15181:18;;15174:41;15247:2;15232:18;;15095:161::o;15261:335::-;15463:2;15445:21;;;15502:2;15482:18;;;15475:30;-1:-1:-1;;;15536:2:10;15521:18;;15514:41;15587:2;15572:18;;15435:161::o;15601:327::-;15803:2;15785:21;;;15842:1;15822:18;;;15815:29;-1:-1:-1;;;15875:2:10;15860:18;;15853:34;15919:2;15904:18;;15775:153::o;15933:335::-;16135:2;16117:21;;;16174:2;16154:18;;;16147:30;-1:-1:-1;;;16208:2:10;16193:18;;16186:41;16259:2;16244:18;;16107:161::o;16273:329::-;16475:2;16457:21;;;16514:1;16494:18;;;16487:29;-1:-1:-1;;;16547:2:10;16532:18;;16525:36;16593:2;16578:18;;16447:155::o;16607:338::-;16809:2;16791:21;;;16848:2;16828:18;;;16821:30;-1:-1:-1;;;16882:2:10;16867:18;;16860:44;16936:2;16921:18;;16781:164::o;16950:328::-;17152:2;17134:21;;;17191:1;17171:18;;;17164:29;-1:-1:-1;;;17224:2:10;17209:18;;17202:35;17269:2;17254:18;;17124:154::o;17283:400::-;17485:2;17467:21;;;17524:2;17504:18;;;17497:30;17563:34;17558:2;17543:18;;17536:62;-1:-1:-1;;;17629:2:10;17614:18;;17607:34;17673:3;17658:19;;17457:226::o;17688:355::-;17890:2;17872:21;;;17929:2;17909:18;;;17902:30;17968:33;17963:2;17948:18;;17941:61;18034:2;18019:18;;17862:181::o;18048:177::-;18194:25;;;18182:2;18167:18;;18149:76::o;18230:591::-;18517:25;;;-1:-1:-1;;;;;18616:15:10;;;18611:2;18596:18;;18589:43;18668:15;;;;18663:2;18648:18;;18641:43;18715:2;18700:18;;18693:34;18758:3;18743:19;;18736:35;;;;18569:3;18787:19;;18780:35;18504:3;18489:19;;18471:350::o;18826:888::-;19225:25;;;-1:-1:-1;;;;;19324:15:10;;;19319:2;19304:18;;19297:43;19371:2;19356:18;;19349:34;;;;19414:2;19399:18;;19392:34;;;;19457:3;19442:19;;19435:35;;;;19277:3;19486:19;;19479:35;;;;19545:3;19530:19;;19523:35;19589:3;19574:19;;19567:35;19639:15;;19633:3;19618:19;;19611:44;19692:15;19686:3;19671:19;;19664:44;19212:3;19197:19;;19179:535::o;19719:248::-;19893:25;;;19949:2;19934:18;;19927:34;19881:2;19866:18;;19848:119::o;19972:463::-;20219:25;;;20275:2;20260:18;;20253:34;;;;-1:-1:-1;;;;;20361:15:10;;;20356:2;20341:18;;20334:43;20413:15;20408:2;20393:18;;20386:43;20206:3;20191:19;;20173:262::o;20900:319::-;21102:25;;;21158:2;21143:18;;21136:34;;;;21201:2;21186:18;;21179:34;21090:2;21075:18;;21057:162::o;21224:128::-;;21295:1;21291:6;21288:1;21285:13;21282:2;;;21301:18;;:::i;:::-;-1:-1:-1;21337:9:10;;21272:80::o;21357:217::-;;21423:1;21413:2;;-1:-1:-1;;;21448:31:10;;21502:4;21499:1;21492:15;21530:4;21455:1;21520:15;21413:2;-1:-1:-1;21559:9:10;;21403:171::o;21579:125::-;;21647:1;21644;21641:8;21638:2;;;21652:18;;:::i;:::-;-1:-1:-1;21689:9:10;;21628:76::o;21709:135::-;;-1:-1:-1;;21769:17:10;;21766:2;;;21789:18;;:::i;:::-;-1:-1:-1;21836:1:10;21825:13;;21756:88::o;21849:127::-;21910:10;21905:3;21901:20;21898:1;21891:31;21941:4;21938:1;21931:15;21965:4;21962:1;21955:15;21981:133;-1:-1:-1;;;;;22058:31:10;;22048:42;;22038:2;;22104:1;22101;22094:12;22038:2;22028:86;:::o;22119:120::-;22207:5;22200:13;22193:21;22186:5;22183:32;22173:2;;22229:1;22226;22219:12
Swarm Source
ipfs://e78cf8e6ed610868dc3d549269bb38235edf487a98c2154c253483f91753c51d
Loading...
Loading
Loading...
Loading
OVERVIEW
Trustless smart contract available for token vesting on the Ethereum chain. The UNCX Network team has deployed this contract.Net Worth in USD
$27,468,367.53
Net Worth in ETH
13,888.405139
Token Allocations
BANANA
55.17%
HANU
7.84%
ALVA
5.03%
Others
31.95%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 55.17% | $4.41 | 3,436,551.8368 | $15,155,193.6 | |
| ETH | 7.84% | <$0.000001 | 32,675,605,857,418.051 | $2,154,302.69 | |
| ETH | 5.03% | $0.0129 | 107,082,688.4046 | $1,381,395.59 | |
| ETH | 4.87% | $0.00252 | 530,790,945.6475 | $1,337,529 | |
| ETH | 4.86% | $0.066812 | 19,965,000.01 | $1,333,901.58 | |
| ETH | 3.86% | $0.000804 | 1,320,000,000 | $1,061,333.28 | |
| ETH | 2.46% | $0.002613 | 258,253,062.5 | $674,797.17 | |
| ETH | 1.80% | $0.494076 | 1,000,000 | $494,076 | |
| ETH | 1.29% | $0.00016 | 2,210,204,479.495 | $353,279.08 | |
| ETH | 1.17% | $0.001383 | 232,835,248.5389 | $322,104.28 | |
| ETH | 1.11% | <$0.000001 | 98,637,590,252,607.766 | $305,340.02 | |
| ETH | 1.09% | $0.00003 | 10,000,000,000.559 | $300,100 | |
| ETH | 1.06% | $0.004003 | 72,974,089.4121 | $292,105.06 | |
| ETH | 1.00% | $0.001971 | 139,157,064.346 | $274,245.18 | |
| ETH | 0.44% | $0.000247 | 484,291,177.2135 | $119,803.95 | |
| ETH | 0.43% | $0.089994 | 1,300,000 | $116,992.2 | |
| ETH | 0.40% | $0.000001 | 131,732,057,223.3816 | $110,652.45 | |
| ETH | 0.30% | $0.004193 | 19,930,000 | $83,566.89 | |
| ETH | 0.29% | $0.000008 | 10,077,968,015.0432 | $79,918.29 | |
| ETH | 0.29% | $39.84 | 2,000 | $79,680 | |
| ETH | 0.27% | $0.000218 | 345,000,000 | $75,285.9 | |
| ETH | 0.27% | $0.811771 | 90,000 | $73,059.39 | |
| ETH | 0.25% | $0.000081 | 860,157,624.1314 | $69,328.7 | |
| ETH | 0.24% | $0.000155 | 419,314,191.4906 | $65,129.48 | |
| ETH | 0.21% | $0.002985 | 18,907,864.4328 | $56,438.99 | |
| ETH | 0.19% | $0.021039 | 2,454,632 | $51,642.07 | |
| ETH | 0.18% | $0.000131 | 375,000,000 | $49,098.75 | |
| ETH | 0.18% | $0.002887 | 17,000,000 | $49,081.76 | |
| ETH | 0.18% | $0.00002 | 2,406,388,919.9877 | $48,782.47 | |
| ETH | 0.18% | $0.061152 | 796,263.8019 | $48,693.12 | |
| ETH | 0.15% | $0.001678 | 25,000,000 | $41,951.75 | |
| ETH | 0.15% | $0.00014 | 298,950,000 | $41,724.45 | |
| ETH | 0.15% | $0.000407 | 100,500,000 | $40,942.7 | |
| ETH | 0.14% | $0.000863 | 43,630,663.7594 | $37,662.86 | |
| ETH | 0.13% | $0.000002 | 17,000,000,000 | $35,808.91 | |
| ETH | 0.13% | $0.000084 | 426,074,763.8068 | $35,595.43 | |
| ETH | 0.11% | $0.000117 | 259,069,856.5495 | $30,230.86 | |
| ETH | 0.11% | $0.001368 | 21,670,501.868 | $29,650.84 | |
| ETH | 0.10% | $0.057566 | 498,250 | $28,682.34 | |
| ETH | 0.09% | $0.025006 | 1,000,000 | $25,005.64 | |
| ETH | 0.08% | $0.017082 | 1,327,060.0118 | $22,668.75 | |
| ETH | 0.08% | $0.00001 | 2,276,956,140.8923 | $22,473.56 | |
| ETH | 0.08% | $0.001454 | 15,435,858.4111 | $22,448.68 | |
| ETH | 0.08% | $0.006494 | 3,406,941 | $22,124.33 | |
| ETH | 0.08% | $0.008794 | 2,479,036.75 | $21,800.3 | |
| ETH | 0.08% | $0.003889 | 5,500,000 | $21,387.19 | |
| ETH | 0.07% | $0.000651 | 30,767,000 | $20,025.32 | |
| ETH | 0.07% | $0.000171 | 108,172,313.275 | $18,540.73 | |
| ETH | 0.06% | $0.000043 | 396,376,004.0258 | $16,964.89 | |
| ETH | 0.06% | $0.120642 | 139,510 | $16,830.77 | |
| ETH | 0.06% | $0.003299 | 4,982,500 | $16,438.91 | |
| ETH | 0.05% | $0.000883 | 16,251,529.9143 | $14,351.04 | |
| ETH | 0.05% | $0.001084 | 12,500,000 | $13,552 | |
| ETH | 0.04% | <$0.000001 | 344,897,244,651.5661 | $10,686.99 | |
| ETH | 0.04% | $0.000045 | 229,195,000 | $10,416.91 | |
| ETH | 0.04% | $0.000035 | 298,950,000 | $10,355.63 | |
| ETH | 0.04% | $0.001548 | 6,554,465.3906 | $10,146.97 | |
| ETH | 0.03% | $0.000003 | 2,790,074,898.4919 | $9,514.16 | |
| ETH | 0.03% | $0.011925 | 774,742.1817 | $9,239.06 | |
| ETH | 0.03% | $0.000006 | 1,500,000,000.46 | $9,165 | |
| ETH | 0.03% | $0.000092 | 87,000,000 | $7,971.19 | |
| ETH | 0.03% | $0.049298 | 158,586.8524 | $7,818.02 | |
| ETH | 0.02% | $0.000027 | 239,000,000 | $6,539.04 | |
| ETH | 0.02% | $0.000307 | 20,926,500 | $6,424.44 | |
| ETH | 0.02% | $0.00006 | 99,650,000 | $5,983.67 | |
| ETH | 0.02% | $0.00091 | 6,468,059 | $5,885.03 | |
| ETH | 0.02% | $0.00004 | 144,990,750 | $5,787.72 | |
| ETH | 0.02% | $0.000055 | 99,301,225 | $5,486.39 | |
| ETH | 0.02% | $0.002376 | 2,300,000 | $5,464.96 | |
| ETH | 0.02% | $0.104059 | 49,825 | $5,184.76 | |
| ETH | 0.02% | $0.00139 | 3,709,016.628 | $5,157.02 | |
| ETH | 0.02% | $0.000017 | 296,284,909.4144 | $5,096.1 | |
| ETH | 0.02% | $0.000297 | 16,699,893.4607 | $4,960.54 | |
| ETH | 0.02% | $0.000563 | 8,577,708.6286 | $4,827.02 | |
| ETH | 0.02% | <$0.000001 | 2,000,000,000,000 | $4,236 | |
| ETH | 0.02% | $0.000785 | 5,361,170 | $4,206 | |
| ETH | 0.02% | $0.000067 | 61,607,616 | $4,153.59 | |
| ETH | 0.02% | $4.74 | 873.25 | $4,139.21 | |
| ETH | 0.02% | $0.041228 | 100,000 | $4,122.83 | |
| ETH | 0.01% | $0.0001 | 38,700,000 | $3,878.9 | |
| ETH | 0.01% | $0.004488 | 827,751.4129 | $3,715.08 | |
| ETH | 0.01% | $0.000194 | 18,435,250 | $3,570.81 | |
| ETH | 0.01% | $0.002127 | 1,494,750 | $3,178.59 | |
| ETH | 0.01% | $0.000313 | 9,795,515.1806 | $3,065.31 | |
| ETH | 0.01% | $0.000355 | 8,031,469.6345 | $2,852.06 | |
| ETH | <0.01% | $0.003832 | 697,000 | $2,670.63 | |
| ETH | <0.01% | $0.035003 | 72,500 | $2,537.7 | |
| ETH | <0.01% | $0.000824 | 2,983,533.843 | $2,458.64 | |
| ETH | <0.01% | $0.001621 | 1,450,500 | $2,350.64 | |
| ETH | <0.01% | $0.000479 | 4,754,422.2476 | $2,276.42 | |
| ETH | <0.01% | $0.04417 | 50,000 | $2,208.52 | |
| ETH | <0.01% | <$0.000001 | 42,069,696,969 | $2,185.65 | |
| ETH | <0.01% | $0.520137 | 4,200 | $2,184.58 | |
| ETH | <0.01% | $0.010889 | 200,000 | $2,177.75 | |
| ETH | <0.01% | $0.000022 | 99,837,160.089 | $2,169.46 | |
| ETH | <0.01% | $0.124615 | 17,113.0361 | $2,132.54 | |
| ETH | <0.01% | $0.016202 | 130,000 | $2,106.27 | |
| ETH | <0.01% | $0.020274 | 100,000 | $2,027.44 | |
| ETH | <0.01% | $0.000947 | 1,993,000 | $1,888.01 | |
| ETH | <0.01% | $0.000001 | 2,003,499,327.0965 | $1,540.3 | |
| ETH | <0.01% | $0.104264 | 14,336 | $1,494.73 | |
| ETH | <0.01% | $0.001575 | 898,250 | $1,414.66 | |
| ETH | <0.01% | $0.000007 | 202,600,000 | $1,379.71 | |
| ETH | <0.01% | $0.000006 | 224,212,500 | $1,345.28 | |
| ETH | <0.01% | $0.00 | 4,374,012,655,237.4927 | $0.00 | |
| ETH | <0.01% | <$0.000001 | 7,474,602,642,835.0518 | $1,204.18 | |
| ETH | <0.01% | $0.000164 | 6,400,000 | $1,049.47 | |
| ETH | <0.01% | $0.000001 | 877,969,916.7623 | $955.4 | |
| ETH | <0.01% | $0.000195 | 4,900,415.3648 | $953.57 | |
| ETH | <0.01% | $0.00019 | 4,972,763.1493 | $942.79 | |
| ETH | <0.01% | $0.000006 | 139,834,006.8955 | $872.56 | |
| ETH | <0.01% | $0.000175 | 4,982,500 | $872.34 | |
| ETH | <0.01% | $0.000002 | 448,425,000 | $856.49 | |
| ETH | <0.01% | <$0.000001 | 42,500,000,000,000 | $825.56 | |
| ETH | <0.01% | $0.000039 | 20,696,969 | $799.32 | |
| ETH | <0.01% | $0.000115 | 6,903,630.7545 | $791.5 | |
| ETH | <0.01% | $0.000784 | 996,500 | $781.53 | |
| ETH | <0.01% | $0.000008 | 90,095,164.8925 | $740.58 | |
| ETH | <0.01% | $0.000127 | 4,982,500 | $633.38 | |
| ETH | <0.01% | $0.000008 | 78,992,500 | $631.94 | |
| ETH | <0.01% | $0.000072 | 8,413,800 | $607.05 | |
| ETH | <0.01% | $0.000122 | 4,733,375 | $578.42 | |
| ETH | <0.01% | $1,977.73 | 0.2711 | $536.26 | |
| ETH | <0.01% | $0.000035 | 15,000,000 | $530.55 | |
| ETH | <0.01% | $0.000015 | 32,736,438.0361 | $492.36 | |
| ETH | <0.01% | $76,149 | 0.00637073 | $485.12 | |
| ETH | <0.01% | $0.000006 | 73,344,841.088 | $461.34 | |
| ETH | <0.01% | $29.84 | 14.0058 | $417.93 | |
| ETH | <0.01% | $0.000036 | 9,965,000 | $353.96 | |
| ETH | <0.01% | $0.001115 | 282,808.7082 | $315.2 | |
| ETH | <0.01% | $0.000848 | 350,000 | $296.89 | |
| ETH | <0.01% | $0.000126 | 2,234,336.4438 | $280.54 | |
| ETH | <0.01% | <$0.000001 | 2,019,243,000,000 | $265.29 | |
| ETH | <0.01% | $0.000009 | 25,834,055.965 | $237.67 | |
| ETH | <0.01% | $0.000301 | 754,605.4288 | $226.83 | |
| ETH | <0.01% | $0.005882 | 37,867 | $222.74 | |
| ETH | <0.01% | $0.000057 | 3,850,000 | $217.95 | |
| ETH | <0.01% | $0.999894 | 198.4163 | $198.4 | |
| ETH | <0.01% | $0.00 | 41,592.9123 | $0.00 | |
| ETH | <0.01% | $0.00101 | 150,000 | $151.53 | |
| ETH | <0.01% | $0.007117 | 20,693.9737 | $147.27 | |
| ETH | <0.01% | $0.060047 | 2,100.6416 | $126.14 | |
| ETH | <0.01% | $0.00039 | 298,950 | $116.46 | |
| ETH | <0.01% | $0.000005 | 20,199,026.8529 | $93.32 | |
| ETH | <0.01% | $0.000116 | 800,111 | $92.44 | |
| ETH | <0.01% | $0.001824 | 49,825 | $90.86 | |
| ETH | <0.01% | $0.999788 | 88.63 | $88.61 | |
| ETH | <0.01% | $0.000941 | 86,094.5887 | $81.04 | |
| ETH | <0.01% | <$0.000001 | 250,000,000,000 | $71.03 | |
| ETH | <0.01% | $0.000136 | 490,317.15 | $66.89 | |
| ETH | <0.01% | $0.000003 | 23,048,259.5094 | $63.38 | |
| ETH | <0.01% | $0.000004 | 12,777,134.7283 | $52.64 | |
| ETH | <0.01% | $0.001756 | 26,251.8653 | $46.09 | |
| ETH | <0.01% | $0.000197 | 199,500 | $39.33 | |
| ETH | <0.01% | $0.000758 | 50,000 | $37.9 | |
| ETH | <0.01% | $0.00 | 11,651.3179 | $0.00 | |
| ETH | <0.01% | $0.000019 | 1,250,001 | $24.13 | |
| ETH | <0.01% | <$0.000001 | 52,000,000 | $18.31 | |
| ETH | <0.01% | $0.000673 | 22,544.5988 | $15.16 | |
| ETH | <0.01% | <$0.000001 | 426,410,332.8734 | $15.13 | |
| ETH | <0.01% | $0.093191 | 103 | $9.6 | |
| ETH | <0.01% | $0.000471 | 20,245.0866 | $9.53 | |
| ETH | <0.01% | $0.00032 | 14,947.5 | $4.79 | |
| ETH | <0.01% | $0.000199 | 19,930 | $3.97 | |
| ETH | <0.01% | $0.000001 | 3,035,529.7846 | $3.67 | |
| ETH | <0.01% | $0.001488 | 2,256.5557 | $3.36 | |
| ETH | <0.01% | $5,132.49 | 0.00035255 | $1.81 | |
| ETH | <0.01% | $0.000034 | 50,000 | $1.7 | |
| ETH | <0.01% | $0.006721 | 200 | $1.34 | |
| ETH | <0.01% | $0.000409 | 3,100 | $1.27 | |
| ETH | <0.01% | $0.000498 | 1,637.3239 | $0.8154 | |
| ETH | <0.01% | $0.00213 | 110.447 | $0.2352 | |
| ETH | <0.01% | $0.000022 | 9,055.2181 | $0.1984 | |
| ETH | <0.01% | <$0.000001 | 8,090,190.2798 | $0.1197 | |
| BASE | <0.01% | $10.93 | 22 | $240.46 | |
| BASE | <0.01% | <$0.000001 | 295,774,647 | $2.31 | |
| BASE | <0.01% | $0.000486 | 4,324.6182 | $2.1 | |
| BASE | <0.01% | $0.00 | 208.74 | $0.00 | |
| POL | <0.01% | $0.00 | 20 | $0.00 | |
| POL | <0.01% | $0.107644 | 0.3 | $0.032293 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.