More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,974 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Token | 67463288 | 10 days ago | IN | 0 POL | 0.0031735 | ||||
Withdraw Token | 67463286 | 10 days ago | IN | 0 POL | 0.00318697 | ||||
Withdraw Token | 67463283 | 10 days ago | IN | 0 POL | 0.00318819 | ||||
Withdraw Token | 67366385 | 13 days ago | IN | 0 POL | 0.00383643 | ||||
Withdraw Token | 67248722 | 16 days ago | IN | 0 POL | 0.00195657 | ||||
Withdraw Token | 67204161 | 17 days ago | IN | 0 POL | 0.00202992 | ||||
Withdraw Token | 67096376 | 20 days ago | IN | 0 POL | 0.00737474 | ||||
Withdraw Token | 67005999 | 22 days ago | IN | 0 POL | 0.00786186 | ||||
Withdraw Token | 66998220 | 22 days ago | IN | 0 POL | 0.00395572 | ||||
Withdraw Token | 66696847 | 30 days ago | IN | 0 POL | 0.00265368 | ||||
Withdraw Token | 66572438 | 33 days ago | IN | 0 POL | 0.00585731 | ||||
Withdraw Token | 66389727 | 37 days ago | IN | 0 POL | 0.00246957 | ||||
Withdraw Token | 66334502 | 39 days ago | IN | 0 POL | 0.00253806 | ||||
Withdraw Token | 66332040 | 39 days ago | IN | 0 POL | 0.00265741 | ||||
Withdraw Token | 66263164 | 41 days ago | IN | 0 POL | 0.00886144 | ||||
Withdraw Token | 66263156 | 41 days ago | IN | 0 POL | 0.00931899 | ||||
Withdraw Token | 66253322 | 41 days ago | IN | 0 POL | 0.00487627 | ||||
Withdraw Token | 66208207 | 42 days ago | IN | 0 POL | 0.00265368 | ||||
Withdraw Token | 66194934 | 42 days ago | IN | 0 POL | 0.00265368 | ||||
Withdraw Token | 65881276 | 51 days ago | IN | 0 POL | 0.68301041 | ||||
Withdraw Token | 65729244 | 54 days ago | IN | 0 POL | 0.00560287 | ||||
Withdraw Token | 65729242 | 54 days ago | IN | 0 POL | 0.00465887 | ||||
Withdraw Token | 65729226 | 54 days ago | IN | 0 POL | 0.00566931 | ||||
Withdraw Token | 65604198 | 57 days ago | IN | 0 POL | 0.00347004 | ||||
Withdraw Token | 65417637 | 62 days ago | IN | 0 POL | 0.00419164 |
Loading...
Loading
Contract Name:
LockedDealV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-01-05 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //For whitelist, interface IWhiteList { function Check(address _Subject, uint256 _Id) external view returns(uint); function Register(address _Subject,uint256 _Id,uint256 _Amount) external; function LastRoundRegister(address _Subject,uint256 _Id) external; function CreateManualWhiteList(uint256 _ChangeUntil, address _Contract) external payable returns(uint256 Id); function ChangeCreator(uint256 _Id, address _NewCreator) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract ERC20Helper { event TransferOut(uint256 Amount, address To, address Token); event TransferIn(uint256 Amount, address From, address Token); modifier TestAllownce( address _token, address _owner, uint256 _amount ) { require( ERC20(_token).allowance(_owner, address(this)) >= _amount, "no allowance" ); _; } function TransferToken( address _Token, address _Reciver, uint256 _Amount ) internal { uint256 OldBalance = CheckBalance(_Token, address(this)); emit TransferOut(_Amount, _Reciver, _Token); ERC20(_Token).transfer(_Reciver, _Amount); require( (CheckBalance(_Token, address(this)) + _Amount) == OldBalance, "recive wrong amount of tokens" ); } function CheckBalance(address _Token, address _Subject) internal view returns (uint256) { return ERC20(_Token).balanceOf(_Subject); } function TransferInToken( address _Token, address _Subject, uint256 _Amount ) internal TestAllownce(_Token, _Subject, _Amount) { require(_Amount > 0); uint256 OldBalance = CheckBalance(_Token, address(this)); ERC20(_Token).transferFrom(_Subject, address(this), _Amount); emit TransferIn(_Amount, _Subject, _Token); require( (OldBalance + _Amount) == CheckBalance(_Token, address(this)), "recive wrong amount of tokens" ); } function ApproveAllowanceERC20( address _Token, address _Subject, uint256 _Amount ) internal { require(_Amount > 0); ERC20(_Token).approve(_Subject, _Amount); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract GovManager is Ownable { address public GovernerContract; modifier onlyOwnerOrGov() { require( msg.sender == owner() || msg.sender == GovernerContract, "Authorization Error" ); _; } function setGovernerContract(address _address) external onlyOwnerOrGov { GovernerContract = _address; } constructor() { GovernerContract = address(0); } } contract FeeBaseHelper is ERC20Helper, GovManager { event TransferInETH(uint256 Amount, address From); event NewFeeAmount(uint256 NewFeeAmount, uint256 OldFeeAmount); event NewFeeToken(address NewFeeToken, address OldFeeToken); uint256 public Fee; address public FeeToken; mapping(address => uint256) public Reserve; function PayFee(uint256 _fee) public payable { if (_fee == 0) return; if (FeeToken == address(0)) { require(msg.value >= _fee, "Not Enough Fee Provided"); emit TransferInETH(msg.value, msg.sender); } else { TransferInToken(FeeToken, msg.sender, _fee); } Reserve[FeeToken] += _fee; } function SetFeeAmount(uint256 _amount) public onlyOwnerOrGov { require(Fee != _amount, "Can't swap to same fee value"); emit NewFeeAmount(_amount, Fee); Fee = _amount; } function SetFeeToken(address _token) public onlyOwnerOrGov { require(FeeToken != _token, "Can't swap to same token"); emit NewFeeToken(_token, FeeToken); FeeToken = _token; // set address(0) to use ETH/BNB as main coin } function WithdrawFee(address _token, address _to) public onlyOwnerOrGov { require(Reserve[_token] > 0, "Fee amount is zero"); if (_token == address(0)) { payable(_to).transfer(Reserve[_token]); } else { TransferToken(_token, _to, Reserve[_token]); } Reserve[_token] = 0; } } contract LockedDealEvents { event TokenWithdrawn( uint256 PoolId, address indexed Recipient, uint256 Amount, uint256 LeftAmount ); event MassPoolsCreated(uint256 FirstPoolId, uint256 LastPoolId); event NewPoolCreated( uint256 PoolId, address indexed Token, uint256 StartTime, uint256 CliffTime, uint256 FinishTime, uint256 StartAmount, uint256 DebitedAmount, address indexed Owner ); event PoolApproval(uint256 PoolId, address indexed Spender, uint256 Amount); event PoolSplit( uint256 OldPoolId, uint256 NewPoolId, uint256 OriginalLeftAmount, uint256 NewAmount, address indexed OldOwner, address indexed NewOwner ); } /// @title contains modifiers and stores variables. contract LockedDealModifiers { mapping(uint256 => mapping(address => uint256)) public Allowance; mapping(uint256 => Pool) public AllPoolz; mapping(address => uint256[]) public MyPoolz; uint256 public Index; address public WhiteList_Address; bool public isTokenFilterOn; // use to enable/disable token filter uint256 public TokenFeeWhiteListId; uint256 public TokenFilterWhiteListId; uint256 public UserWhiteListId; uint256 public maxTransactionLimit; struct Pool { uint256 StartTime; uint256 CliffTime; uint256 FinishTime; uint256 StartAmount; uint256 DebitedAmount; // withdrawn amount address Owner; address Token; } modifier notZeroAddress(address _address) { require(_address != address(0x0), "Zero Address is not allowed"); _; } modifier isPoolValid(uint256 _PoolId) { require(_PoolId < Index, "Pool does not exist"); _; } modifier notZeroValue(uint256 _Amount) { require(_Amount > 0, "Amount must be greater than zero"); _; } modifier isPoolOwner(uint256 _PoolId) { require( AllPoolz[_PoolId].Owner == msg.sender, "You are not Pool Owner" ); _; } modifier isAllowed(uint256 _PoolId, uint256 _amount) { require( _amount <= Allowance[_PoolId][msg.sender], "Not enough Allowance" ); _; } modifier isBelowLimit(uint256 _num) { require( _num > 0 && _num <= maxTransactionLimit, "Invalid array length limit" ); _; } } contract LockedManageable is FeeBaseHelper, LockedDealEvents, LockedDealModifiers { constructor() { maxTransactionLimit = 400; isTokenFilterOn = false; // disable token filter whitelist } function setWhiteListAddress(address _address) external onlyOwner { WhiteList_Address = _address; } function setTokenFeeWhiteListId(uint256 _id) external onlyOwner { TokenFeeWhiteListId = _id; } function setTokenFilterWhiteListId(uint256 _id) external onlyOwner { TokenFilterWhiteListId = _id; } function setUserWhiteListId(uint256 _id) external onlyOwner { UserWhiteListId = _id; } function swapTokenFilter() external onlyOwner { isTokenFilterOn = !isTokenFilterOn; } function isTokenWithFee(address _tokenAddress) public view returns (bool) { return WhiteList_Address == address(0) || !(IWhiteList(WhiteList_Address).Check( _tokenAddress, TokenFeeWhiteListId ) > 0); } function isTokenWhiteListed(address _tokenAddress) public view returns (bool) { return WhiteList_Address == address(0) || !isTokenFilterOn || IWhiteList(WhiteList_Address).Check( _tokenAddress, TokenFilterWhiteListId ) > 0; } function isUserPaysFee(address _UserAddress) public view returns (bool) { return WhiteList_Address == address(0) || !(IWhiteList(WhiteList_Address).Check( _UserAddress, UserWhiteListId ) > 0); } function setMaxTransactionLimit(uint256 _newLimit) external onlyOwner { maxTransactionLimit = _newLimit; } } contract LockedPoolz is LockedManageable { modifier isTokenValid(address _Token) { require(isTokenWhiteListed(_Token), "Need Valid ERC20 Token"); //check if _Token is ERC20 _; } function SplitPool( uint256 _PoolId, uint256 _NewAmount, address _NewOwner ) internal returns (uint256 newPoolId) { uint256 leftAmount = remainingAmount(_PoolId); require(leftAmount > 0, "Pool is Empty"); require(leftAmount >= _NewAmount, "Not Enough Amount Balance"); assert(_NewAmount * 10**18 > _NewAmount); Pool storage pool = AllPoolz[_PoolId]; uint256 _Ratio = (_NewAmount * 10**18) / leftAmount; uint256 newPoolDebitedAmount = (pool.DebitedAmount * _Ratio) / 10**18; uint256 newPoolStartAmount = (pool.StartAmount * _Ratio) / 10**18; pool.StartAmount -= newPoolStartAmount; pool.DebitedAmount -= newPoolDebitedAmount; newPoolId = CreatePool( pool.Token, pool.StartTime, pool.CliffTime, pool.FinishTime, newPoolStartAmount, newPoolDebitedAmount, _NewOwner ); emit PoolSplit( _PoolId, newPoolId, remainingAmount(_PoolId), _NewAmount, msg.sender, _NewOwner ); } //create a new pool function CreatePool( address _Token, // token to lock address uint256 _StartTime, // Until what time the pool will Start uint256 _CliffTime, // Before CliffTime can't withdraw tokens uint256 _FinishTime, // Until what time the pool will end uint256 _StartAmount, // Total amount of the tokens to sell in the pool uint256 _DebitedAmount, // Withdrawn amount address _Owner // Who the tokens belong to ) internal isTokenValid(_Token) returns (uint256 poolId) { require( _StartTime <= _FinishTime, "StartTime is greater than FinishTime" ); //register the pool AllPoolz[Index] = Pool( _StartTime, _CliffTime, _FinishTime, _StartAmount, _DebitedAmount, _Owner, _Token ); MyPoolz[_Owner].push(Index); emit NewPoolCreated( Index, _Token, _StartTime, _CliffTime, _FinishTime, _StartAmount, _DebitedAmount, _Owner ); poolId = Index; Index++; } function remainingAmount(uint256 _PoolId) internal view returns (uint256 amount) { amount = AllPoolz[_PoolId].StartAmount - AllPoolz[_PoolId].DebitedAmount; } } /// @title contains array utility functions library Array { /// @dev returns a new slice of the array function KeepNElementsInArray(uint256[] memory _arr, uint256 _n) internal pure returns (uint256[] memory newArray) { if (_arr.length == _n) return _arr; require(_arr.length > _n, "can't cut more then got"); newArray = new uint256[](_n); for (uint256 i = 0; i < _n; i++) { newArray[i] = _arr[i]; } return newArray; } function KeepNElementsInArray(address[] memory _arr, uint256 _n) internal pure returns (address[] memory newArray) { if (_arr.length == _n) return _arr; require(_arr.length > _n, "can't cut more then got"); newArray = new address[](_n); for (uint256 i = 0; i < _n; i++) { newArray[i] = _arr[i]; } return newArray; } /// @return true if the array is ordered function isArrayOrdered(uint256[] memory _arr) internal pure returns (bool) { require(_arr.length > 0, "array should be greater than zero"); uint256 temp = _arr[0]; for (uint256 i = 1; i < _arr.length; i++) { if (temp > _arr[i]) { return false; } temp = _arr[i]; } return true; } /// @return sum of the array elements function getArraySum(uint256[] memory _array) internal pure returns (uint256) { uint256 sum = 0; for (uint256 i = 0; i < _array.length; i++) { sum = sum + _array[i]; } return sum; } /// @return true if the element exists in the array function isInArray(address[] memory _arr, address _elem) internal pure returns (bool) { for (uint256 i = 0; i < _arr.length; i++) { if (_arr[i] == _elem) return true; } return false; } } contract LockedCreation is LockedPoolz { function CreateNewPool( address _Token, //token to lock address uint256 _StartTime, //Until what time the pool will start uint256 _CliffTime, //Before CliffTime can't withdraw tokens uint256 _FinishTime, //Until what time the pool will end uint256 _StartAmount, //Total amount of the tokens to sell in the pool address _Owner // Who the tokens belong to ) external payable notZeroAddress(_Owner) notZeroValue(_StartAmount) { TransferInToken(_Token, msg.sender, _StartAmount); payFee(_Token, Fee); CreatePool( _Token, _StartTime, _CliffTime, _FinishTime, _StartAmount, 0, _Owner ); } function CreateMassPools( address _Token, uint256[] calldata _StartTime, uint256[] calldata _CliffTime, uint256[] calldata _FinishTime, uint256[] calldata _StartAmount, address[] calldata _Owner ) external payable isBelowLimit(_Owner.length) { require(_Owner.length == _FinishTime.length, "Date Array Invalid"); require(_StartTime.length == _FinishTime.length, "Date Array Invalid"); require(_Owner.length == _StartAmount.length, "Amount Array Invalid"); require(_CliffTime.length == _FinishTime.length,"CliffTime Array Invalid"); TransferInToken(_Token, msg.sender, Array.getArraySum(_StartAmount)); payFee(_Token, Fee * _Owner.length); uint256 firstPoolId = Index; for (uint256 i = 0; i < _Owner.length; i++) { CreatePool( _Token, _StartTime[i], _CliffTime[i], _FinishTime[i], _StartAmount[i], 0, _Owner[i] ); } uint256 lastPoolId = Index - 1; emit MassPoolsCreated(firstPoolId, lastPoolId); } // create pools with respect to finish time function CreatePoolsWrtTime( address _Token, uint256[] calldata _StartTime, uint256[] calldata _CliffTime, uint256[] calldata _FinishTime, uint256[] calldata _StartAmount, address[] calldata _Owner ) external payable isBelowLimit(_Owner.length * _FinishTime.length) { require(_Owner.length == _StartAmount.length, "Amount Array Invalid"); require(_FinishTime.length == _StartTime.length, "Date Array Invalid"); require(_CliffTime.length == _FinishTime.length, "CliffTime Array Invalid"); TransferInToken( _Token, msg.sender, Array.getArraySum(_StartAmount) * _FinishTime.length ); uint256 firstPoolId = Index; payFee(_Token, Fee * _Owner.length * _FinishTime.length); for (uint256 i = 0; i < _FinishTime.length; i++) { for (uint256 j = 0; j < _Owner.length; j++) { CreatePool( _Token, _StartTime[i], _CliffTime[i], _FinishTime[i], _StartAmount[j], 0, _Owner[j] ); } } uint256 lastPoolId = Index - 1; emit MassPoolsCreated(firstPoolId, lastPoolId); } function payFee(address _token, uint256 _amount) internal { if (isTokenWithFee(_token) && isUserPaysFee(msg.sender)) { PayFee(_amount); } } } contract LockedControl is LockedCreation { function TransferPoolOwnership(uint256 _PoolId, address _NewOwner) external isPoolValid(_PoolId) isPoolOwner(_PoolId) notZeroAddress(_NewOwner) returns (uint256 newPoolId) { Pool storage pool = AllPoolz[_PoolId]; require(_NewOwner != pool.Owner, "Can't be the same owner"); uint256 _remainingAmount = remainingAmount(_PoolId); newPoolId = SplitPool(_PoolId, _remainingAmount, _NewOwner); } function SplitPoolAmount( uint256 _PoolId, uint256 _NewAmount, address _NewOwner ) external isPoolValid(_PoolId) isPoolOwner(_PoolId) notZeroValue(_NewAmount) notZeroAddress(_NewOwner) returns (uint256) { return SplitPool(_PoolId, _NewAmount, _NewOwner); } function ApproveAllowance( uint256 _PoolId, uint256 _Amount, address _Spender ) external isPoolValid(_PoolId) isPoolOwner(_PoolId) notZeroAddress(_Spender) { Allowance[_PoolId][_Spender] = _Amount; emit PoolApproval(_PoolId, _Spender, _Amount); } function SplitPoolAmountFrom( uint256 _PoolId, uint256 _Amount, address _Address ) external isPoolValid(_PoolId) isAllowed(_PoolId, _Amount) notZeroValue(_Amount) notZeroAddress(_Address) returns (uint256 poolId) { poolId = SplitPool(_PoolId, _Amount, _Address); uint256 _NewAmount = Allowance[_PoolId][msg.sender] - _Amount; Allowance[_PoolId][msg.sender] = _NewAmount; } } contract LockedPoolzData is LockedControl { function GetAllMyPoolsId(address _UserAddress) public view returns (uint256[] memory) { return MyPoolz[_UserAddress]; } // function GetMyPoolzwithBalance function GetMyPoolsId(address _UserAddress) public view returns (uint256[] memory) { uint256[] storage allIds = MyPoolz[_UserAddress]; uint256[] memory ids = new uint256[](allIds.length); uint256 index; for (uint256 i = 0; i < allIds.length; i++) { if ( AllPoolz[allIds[i]].StartAmount > AllPoolz[allIds[i]].DebitedAmount ) { ids[index++] = allIds[i]; } } return Array.KeepNElementsInArray(ids, index); } function GetPoolsData(uint256[] memory _ids) public view returns (Pool[] memory data) { data = new Pool[](_ids.length); for (uint256 i = 0; i < _ids.length; i++) { require(_ids[i] < Index, "Pool does not exist"); data[i] = Pool( AllPoolz[_ids[i]].StartTime, AllPoolz[_ids[i]].CliffTime, AllPoolz[_ids[i]].FinishTime, AllPoolz[_ids[i]].StartAmount, AllPoolz[_ids[i]].DebitedAmount, AllPoolz[_ids[i]].Owner, AllPoolz[_ids[i]].Token ); } } function GetMyPoolsIdByToken(address _UserAddress, address[] memory _Tokens) public view returns (uint256[] memory) { uint256[] storage allIds = MyPoolz[_UserAddress]; uint256[] memory ids = new uint256[](allIds.length); uint256 index; for (uint256 i = 0; i < allIds.length; i++) { if (Array.isInArray(_Tokens, AllPoolz[allIds[i]].Token)) { ids[index++] = allIds[i]; } } return Array.KeepNElementsInArray(ids, index); } function GetMyPoolDataByToken( address _UserAddress, address[] memory _Tokens ) external view returns (Pool[] memory pools, uint256[] memory poolIds) { poolIds = GetMyPoolsIdByToken(_UserAddress, _Tokens); pools = GetPoolsData(poolIds); } function GetMyPoolsData(address _UserAddress) external view returns (Pool[] memory data) { data = GetPoolsData(GetMyPoolsId(_UserAddress)); } function GetAllMyPoolsData(address _UserAddress) external view returns (Pool[] memory data) { data = GetPoolsData(GetAllMyPoolsId(_UserAddress)); } } contract LockedDealV2 is LockedPoolzData { function getWithdrawableAmount(uint256 _PoolId) public view isPoolValid(_PoolId) returns (uint256) { Pool memory pool = AllPoolz[_PoolId]; if (block.timestamp < pool.StartTime) return 0; if (pool.FinishTime < block.timestamp) return remainingAmount(_PoolId); uint256 totalPoolDuration = pool.FinishTime - pool.StartTime; uint256 timePassed = block.timestamp - pool.StartTime; uint256 timePassedPermille = timePassed * 1000; uint256 ratioPermille = timePassedPermille / totalPoolDuration; uint256 debitableAmount = (pool.StartAmount * ratioPermille) / 1000; return debitableAmount - pool.DebitedAmount; } //@dev no use of revert to make sure the loop will work function WithdrawToken(uint256 _PoolId) external returns (uint256 withdrawnAmount) { //pool is finished + got left overs + did not took them Pool storage pool = AllPoolz[_PoolId]; if ( _PoolId < Index && pool.CliffTime <= block.timestamp && remainingAmount(_PoolId) > 0 ) { withdrawnAmount = getWithdrawableAmount(_PoolId); uint256 tempDebitAmount = withdrawnAmount + pool.DebitedAmount; pool.DebitedAmount = tempDebitAmount; TransferToken(pool.Token, pool.Owner, withdrawnAmount); emit TokenWithdrawn( _PoolId, pool.Owner, withdrawnAmount, remainingAmount(_PoolId) ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"FirstPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LastPoolId","type":"uint256"}],"name":"MassPoolsCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"NewFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OldFeeAmount","type":"uint256"}],"name":"NewFeeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewFeeToken","type":"address"},{"indexed":false,"internalType":"address","name":"OldFeeToken","type":"address"}],"name":"NewFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"PoolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"Token","type":"address"},{"indexed":false,"internalType":"uint256","name":"StartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"CliffTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"FinishTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"StartAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"Owner","type":"address"}],"name":"NewPoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"PoolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"Spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"PoolApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"OldPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"NewPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OriginalLeftAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"NewAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"OldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"NewOwner","type":"address"}],"name":"PoolSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"PoolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"Recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LeftAmount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"}],"name":"TransferInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"To","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferOut","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AllPoolz","outputs":[{"internalType":"uint256","name":"StartTime","type":"uint256"},{"internalType":"uint256","name":"CliffTime","type":"uint256"},{"internalType":"uint256","name":"FinishTime","type":"uint256"},{"internalType":"uint256","name":"StartAmount","type":"uint256"},{"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"internalType":"address","name":"Owner","type":"address"},{"internalType":"address","name":"Token","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"Allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"address","name":"_Spender","type":"address"}],"name":"ApproveAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Token","type":"address"},{"internalType":"uint256[]","name":"_StartTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_CliffTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_FinishTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_StartAmount","type":"uint256[]"},{"internalType":"address[]","name":"_Owner","type":"address[]"}],"name":"CreateMassPools","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_Token","type":"address"},{"internalType":"uint256","name":"_StartTime","type":"uint256"},{"internalType":"uint256","name":"_CliffTime","type":"uint256"},{"internalType":"uint256","name":"_FinishTime","type":"uint256"},{"internalType":"uint256","name":"_StartAmount","type":"uint256"},{"internalType":"address","name":"_Owner","type":"address"}],"name":"CreateNewPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_Token","type":"address"},{"internalType":"uint256[]","name":"_StartTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_CliffTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_FinishTime","type":"uint256[]"},{"internalType":"uint256[]","name":"_StartAmount","type":"uint256[]"},{"internalType":"address[]","name":"_Owner","type":"address[]"}],"name":"CreatePoolsWrtTime","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FeeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"}],"name":"GetAllMyPoolsData","outputs":[{"components":[{"internalType":"uint256","name":"StartTime","type":"uint256"},{"internalType":"uint256","name":"CliffTime","type":"uint256"},{"internalType":"uint256","name":"FinishTime","type":"uint256"},{"internalType":"uint256","name":"StartAmount","type":"uint256"},{"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"internalType":"address","name":"Owner","type":"address"},{"internalType":"address","name":"Token","type":"address"}],"internalType":"struct LockedDealModifiers.Pool[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"}],"name":"GetAllMyPoolsId","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"},{"internalType":"address[]","name":"_Tokens","type":"address[]"}],"name":"GetMyPoolDataByToken","outputs":[{"components":[{"internalType":"uint256","name":"StartTime","type":"uint256"},{"internalType":"uint256","name":"CliffTime","type":"uint256"},{"internalType":"uint256","name":"FinishTime","type":"uint256"},{"internalType":"uint256","name":"StartAmount","type":"uint256"},{"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"internalType":"address","name":"Owner","type":"address"},{"internalType":"address","name":"Token","type":"address"}],"internalType":"struct LockedDealModifiers.Pool[]","name":"pools","type":"tuple[]"},{"internalType":"uint256[]","name":"poolIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"}],"name":"GetMyPoolsData","outputs":[{"components":[{"internalType":"uint256","name":"StartTime","type":"uint256"},{"internalType":"uint256","name":"CliffTime","type":"uint256"},{"internalType":"uint256","name":"FinishTime","type":"uint256"},{"internalType":"uint256","name":"StartAmount","type":"uint256"},{"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"internalType":"address","name":"Owner","type":"address"},{"internalType":"address","name":"Token","type":"address"}],"internalType":"struct LockedDealModifiers.Pool[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"}],"name":"GetMyPoolsId","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"},{"internalType":"address[]","name":"_Tokens","type":"address[]"}],"name":"GetMyPoolsIdByToken","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"GetPoolsData","outputs":[{"components":[{"internalType":"uint256","name":"StartTime","type":"uint256"},{"internalType":"uint256","name":"CliffTime","type":"uint256"},{"internalType":"uint256","name":"FinishTime","type":"uint256"},{"internalType":"uint256","name":"StartAmount","type":"uint256"},{"internalType":"uint256","name":"DebitedAmount","type":"uint256"},{"internalType":"address","name":"Owner","type":"address"},{"internalType":"address","name":"Token","type":"address"}],"internalType":"struct LockedDealModifiers.Pool[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GovernerContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyPoolz","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"PayFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SetFeeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"SetFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"},{"internalType":"uint256","name":"_NewAmount","type":"uint256"},{"internalType":"address","name":"_NewOwner","type":"address"}],"name":"SplitPoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"address","name":"_Address","type":"address"}],"name":"SplitPoolAmountFrom","outputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TokenFeeWhiteListId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenFilterWhiteListId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"},{"internalType":"address","name":"_NewOwner","type":"address"}],"name":"TransferPoolOwnership","outputs":[{"internalType":"uint256","name":"newPoolId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UserWhiteListId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhiteList_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"WithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"}],"name":"WithdrawToken","outputs":[{"internalType":"uint256","name":"withdrawnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PoolId","type":"uint256"}],"name":"getWithdrawableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTokenFilterOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isTokenWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isTokenWithFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_UserAddress","type":"address"}],"name":"isUserPaysFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setGovernerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setTokenFeeWhiteListId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setTokenFilterWhiteListId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setUserWhiteListId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWhiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokenFilter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000046565b600180546001600160a01b0319169055610190600d556009805460ff60a01b1916905562000096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61438980620000a66000396000f3fe6080604052600436106103085760003560e01c806371035fb21161019a578063a4b910fb116100e1578063d854f7021161008a578063eefe26e011610064578063eefe26e0146108e2578063f2f6fb0b146109a2578063f2fde38b146109c257600080fd5b8063d854f7021461088f578063da0ff68c146108af578063eb41051e146108c257600080fd5b8063bef7a2f0116100bb578063bef7a2f014610836578063d3e7f8261461084c578063d5e57e0b1461086257600080fd5b8063a4b910fb146107c4578063af09f518146107e4578063aff1a3111461081657600080fd5b80638da5cb5b11610143578063a143ed3a1161011d578063a143ed3a1461074c578063a173c08f14610784578063a3f5f6f2146107a457600080fd5b80638da5cb5b146106e15780639642ec0c1461070c57806399724fc11461073957600080fd5b8063875f438411610174578063875f43841461068e5780638a4454e9146106ae5780638baa9f9c146106c157600080fd5b806371035fb214610639578063715018a6146106595780637a9d7c141461066e57600080fd5b80634767422c1161025e5780635d1d104011610207578063676c8458116101e1578063676c8458146105e357806367e02dd9146105f95780636f7b53f41461061957600080fd5b80635d1d10401461058d578063657c64f0146105ad57806366818967146105c357600080fd5b80634c82ffe1116102385780634c82ffe11461052a57806358f24d3c1461054a5780635ace4d961461057757600080fd5b80634767422c146104b0578063481531e9146104dd5780634a6a51bb1461050a57600080fd5b8063179664b5116102c057806333e38a2a1161029a57806333e38a2a1461045a5780633b8850701461046d5780633dfd71bb1461048257600080fd5b8063179664b5146103ea5780631bdd8b7c1461040a57806327bbea3a1461043a57600080fd5b806309ea3b36116102f157806309ea3b36146103585780630cd8e9651461037857806311c09e82146103ca57600080fd5b806308048d501461030d5780630842bcbb14610336575b600080fd5b34801561031957600080fd5b50610323600c5481565b6040519081526020015b60405180910390f35b34801561034257600080fd5b50610356610351366004613c54565b6109e2565b005b34801561036457600080fd5b50610356610373366004613c6f565b610ba9565b34801561038457600080fd5b506001546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032d565b3480156103d657600080fd5b506103566103e5366004613c6f565b610bb6565b3480156103f657600080fd5b50610323610405366004613c88565b610bc3565b34801561041657600080fd5b5061042a610425366004613c54565b610dfa565b604051901515815260200161032d565b34801561044657600080fd5b50610356610455366004613c54565b610ee2565b610356610468366004613d00565b610f31565b34801561047957600080fd5b506103566112c1565b34801561048e57600080fd5b506104a261049d366004613ea9565b611316565b60405161032d92919061401e565b3480156104bc57600080fd5b506104d06104cb366004614043565b611337565b60405161032d91906140d4565b3480156104e957600080fd5b506003546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561051657600080fd5b50610356610525366004613c6f565b611686565b34801561053657600080fd5b5061042a610545366004613c54565b611693565b34801561055657600080fd5b5061056a610565366004613c54565b611731565b60405161032d91906140e7565b34801561058357600080fd5b5061032360085481565b34801561059957600080fd5b506103566105a83660046140fa565b6117aa565b3480156105b957600080fd5b50610323600a5481565b3480156105cf57600080fd5b506103566105de366004613c54565b611999565b3480156105ef57600080fd5b50610323600d5481565b34801561060557600080fd5b5061042a610614366004613c54565b611a83565b34801561062557600080fd5b5061056a610634366004613ea9565b611b8f565b34801561064557600080fd5b506104d0610654366004613c54565b611cd3565b34801561066557600080fd5b50610356611ce1565b34801561067a57600080fd5b50610356610689366004613c6f565b611cf5565b34801561069a57600080fd5b506103236106a9366004613c6f565b611d02565b6103566106bc36600461412f565b611e99565b3480156106cd57600080fd5b506103566106dc366004614187565b611fb4565b3480156106ed57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103a5565b34801561071857600080fd5b506009546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b610356610747366004613d00565b6121b1565b34801561075857600080fd5b50610323610767366004613c88565b600560209081526000928352604080842090915290825290205481565b34801561079057600080fd5b5061032361079f3660046141b1565b612498565b3480156107b057600080fd5b506104d06107bf366004613c54565b6124c9565b3480156107d057600080fd5b506103236107df366004613c6f565b6124d7565b3480156107f057600080fd5b5060095461042a9074010000000000000000000000000000000000000000900460ff1681565b34801561082257600080fd5b5061056a610831366004613c54565b6125d4565b34801561084257600080fd5b5061032360025481565b34801561085857600080fd5b50610323600b5481565b34801561086e57600080fd5b5061032361087d366004613c54565b60046020526000908152604090205481565b34801561089b57600080fd5b506103566108aa366004613c6f565b61272a565b6103566108bd366004613c6f565b61287a565b3480156108ce57600080fd5b506103236108dd3660046140fa565b6129ac565b3480156108ee57600080fd5b506109546108fd366004613c6f565b6006602081905260009182526040909120805460018201546002830154600384015460048501546005860154959096015493959294919390929173ffffffffffffffffffffffffffffffffffffffff908116911687565b604080519788526020880196909652948601939093526060850191909152608084015273ffffffffffffffffffffffffffffffffffffffff90811660a08401521660c082015260e00161032d565b3480156109ae57600080fd5b506103236109bd3660046140fa565b612ba0565b3480156109ce57600080fd5b506103566109dd366004613c54565b612ddd565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a1f575060015473ffffffffffffffffffffffffffffffffffffffff1633145b610a8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f720000000000000000000000000060448201526064015b60405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff808316911603610b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e2774207377617020746f2073616d6520746f6b656e00000000000000006044820152606401610a81565b6003546040805173ffffffffffffffffffffffffffffffffffffffff808516825290921660208301527f2a649a96ed014013ba4748bc2952462a2adb0707fb5a2f30ff1f9041425f168f910160405180910390a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610bb1612e94565b600a55565b610bbe612e94565b600c55565b6000826008548110610c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600084815260066020526040902060050154849073ffffffffffffffffffffffffffffffffffffffff163314610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8373ffffffffffffffffffffffffffffffffffffffff8116610d41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b6000868152600660205260409020600581015473ffffffffffffffffffffffffffffffffffffffff90811690871603610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e2774206265207468652073616d65206f776e65720000000000000000006044820152606401610a81565b6000610de188612f15565b9050610dee888289612f38565b98975050505050505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580610edc5750600954600c546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91610e9891879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa158015610eb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed991906141db565b11155b92915050565b610eea612e94565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b808015801590610f435750600d548111155b610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c6964206172726179206c656e677468206c696d69740000000000006044820152606401610a81565b818614611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b89861461107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b8184146110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e7420417272617920496e76616c69640000000000000000000000006044820152606401610a81565b87861461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436c69666654696d6520417272617920496e76616c69640000000000000000006044820152606401610a81565b6111938c3361118e88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061319792505050565b6131e5565b6002546111ac908d906111a7908590614223565b613482565b60085460005b83811015611263576112508e8e8e848181106111d0576111d061423a565b905060200201358d8d858181106111e9576111e961423a565b905060200201358c8c868181106112025761120261423a565b905060200201358b8b8781811061121b5761121b61423a565b9050602002013560008b8b898181106112365761123661423a565b905060200201602081019061124b9190613c54565b6134ad565b508061125b81614269565b9150506111b2565b506000600160085461127591906142a1565b60408051848152602081018390529192507ffed9136a20cf7e2f3f82ad9987d856cb6718d7c7def71593e6383dab1877eacd910160405180910390a15050505050505050505050505050565b6112c9612e94565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6060806113238484611b8f565b905061132e81611337565b91509250929050565b6060815167ffffffffffffffff81111561135357611353613e07565b6040519080825280602002602001820160405280156113f057816020015b6113dd6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816113715790505b50905060005b8251811015611680576008548382815181106114145761141461423a565b602002602001015110611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b6040518060e00160405280600660008685815181106114a4576114a461423a565b60200260200101518152602001908152602001600020600001548152602001600660008685815181106114d9576114d961423a565b602002602001015181526020019081526020016000206001015481526020016006600086858151811061150e5761150e61423a565b60200260200101518152602001908152602001600020600201548152602001600660008685815181106115435761154361423a565b60200260200101518152602001908152602001600020600301548152602001600660008685815181106115785761157861423a565b60200260200101518152602001908152602001600020600401548152602001600660008685815181106115ad576115ad61423a565b6020026020010151815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600660008685815181106116185761161861423a565b60209081029190910181015182528101919091526040016000206006015473ffffffffffffffffffffffffffffffffffffffff16905282518390839081106116625761166261423a565b6020026020010181905250808061167890614269565b9150506113f6565b50919050565b61168e612e94565b600b55565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580610edc5750600954600a546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91610e9891879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561179e57602002820191906000526020600020905b81548152602001906001019080831161178a575b50505050509050919050565b826008548110611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600084815260066020526040902060050154849073ffffffffffffffffffffffffffffffffffffffff1633146118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8273ffffffffffffffffffffffffffffffffffffffff8116611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b600086815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168085529083529281902088905580518981529182018890527fef177b9f5ffc7f728510c5b4201368d1f257f367423c17a32f71f04f12ed90e1910160405180910390a2505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806119d6575060015473ffffffffffffffffffffffffffffffffffffffff1633145b611a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580611ac6575060095474010000000000000000000000000000000000000000900460ff16155b80610edc5750600954600b546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91611b4791879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8891906141db565b1192915050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040812080546060929067ffffffffffffffff811115611bd257611bd2613e07565b604051908082528060200260200182016040528015611bfb578160200160208202803683370190505b5090506000805b8354811015611cbe57611c5f8660066000878581548110611c2557611c2561423a565b6000918252602080832090910154835282019290925260400190206006015473ffffffffffffffffffffffffffffffffffffffff16613805565b15611cac57838181548110611c7657611c7661423a565b9060005260206000200154838380611c8d90614269565b945081518110611c9f57611c9f61423a565b6020026020010181815250505b80611cb681614269565b915050611c02565b50611cc98282613884565b9695505050505050565b6060610edc6104cb83611731565b611ce9612e94565b611cf36000613998565b565b611cfd612e94565b600d55565b6000816008548110611d70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600083815260066020818152604092839020835160e08101855281548082526001830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015473ffffffffffffffffffffffffffffffffffffffff90811660a086015292015490911660c0830152421015611df9576000925050611680565b4281604001511015611e1657611e0e84612f15565b925050611680565b80516040820151600091611e29916142a1565b8251909150600090611e3b90426142a1565b90506000611e4b826103e8614223565b90506000611e5984836142b4565b905060006103e8828760600151611e709190614223565b611e7a91906142b4565b9050856080015181611e8c91906142a1565b9998505050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff8116611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b8260008111611f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b611f8d8833866131e5565b611f9988600254613482565b611fa988888888886000896134ad565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ff1575060015473ffffffffffffffffffffffffffffffffffffffff1633145b612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546120e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f46656520616d6f756e74206973207a65726f00000000000000000000000000006044820152606401610a81565b73ffffffffffffffffffffffffffffffffffffffff82166121565773ffffffffffffffffffffffffffffffffffffffff8281166000908152600460205260408082205490519284169281156108fc0292818181858888f19350505050158015612150573d6000803e3d6000fd5b50612189565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546121899083908390613a0d565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040812055565b6121bb8582614223565b6000811180156121cd5750600d548111155b612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c6964206172726179206c656e677468206c696d69740000000000006044820152606401610a81565b81841461229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e7420417272617920496e76616c69640000000000000000000000006044820152606401610a81565b858a14612305576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b87861461236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436c69666654696d6520417272617920496e76616c69640000000000000000006044820152606401610a81565b6123bd8c33898990506123b389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061319792505050565b61118e9190614223565b6008546002546123e0908e9089906123d6908790614223565b6111a79190614223565b60005b878110156112635760005b84811015612485576124728f8f8f8581811061240c5761240c61423a565b905060200201358e8e868181106124255761242561423a565b905060200201358d8d8781811061243e5761243e61423a565b905060200201358c8c878181106124575761245761423a565b9050602002013560008c8c898181106112365761123661423a565b508061247d81614269565b9150506123ee565b508061249081614269565b9150506123e3565b600760205281600052604060002081815481106124b457600080fd5b90600052602060002001600091509150505481565b6060610edc6104cb836125d4565b6000818152600660205260408120600854831080156124fa575042816001015411155b801561250e5750600061250c84612f15565b115b156116805761251c83611d02565b9150600081600401548361253091906142ef565b60048301819055600683015460058401549192506125689173ffffffffffffffffffffffffffffffffffffffff918216911685613a0d565b600582015473ffffffffffffffffffffffffffffffffffffffff167faa7132423a39dd83fa4078bd4d7b7d0d0d614b9837f0fd5d23e1afd9aa9bc29d85856125af82612f15565b6040805193845260208401929092529082015260600160405180910390a25050919050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040812080546060929067ffffffffffffffff81111561261757612617613e07565b604051908082528060200260200182016040528015612640578160200160208202803683370190505b5090506000805b835481101561271657600660008583815481106126665761266661423a565b9060005260206000200154815260200190815260200160002060040154600660008684815481106126995761269961423a565b90600052602060002001548152602001908152602001600020600301541115612704578381815481106126ce576126ce61423a565b90600052602060002001548383806126e590614269565b9450815181106126f7576126f761423a565b6020026020010181815250505b8061270e81614269565b915050612647565b506127218282613884565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612767575060015473ffffffffffffffffffffffffffffffffffffffff1633145b6127cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b8060025403612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616e2774207377617020746f2073616d65206665652076616c7565000000006044820152606401610a81565b6002546040805183815260208101929092527f9d7f8f903b5290796d6b981141519d69dacf3b8bc9d0a19fabd782e73e886191910160405180910390a1600255565b806000036128855750565b60035473ffffffffffffffffffffffffffffffffffffffff16612949578034101561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f7420456e6f756768204665652050726f76696465640000000000000000006044820152606401610a81565b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a161296d565b60035461296d9073ffffffffffffffffffffffffffffffffffffffff1633836131e5565b60035473ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040812080548392906129a49084906142ef565b909155505050565b6000836008548110612a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600085815260066020526040902060050154859073ffffffffffffffffffffffffffffffffffffffff163314612aac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8460008111612b17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b8473ffffffffffffffffffffffffffffffffffffffff8116612b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b610dee888888612f38565b6000836008548110612c0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600085815260056020908152604080832033845290915290205485908590811115612c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f75676820416c6c6f77616e63650000000000000000000000006044820152606401610a81565b8560008111612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b8573ffffffffffffffffffffffffffffffffffffffff8116612d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b612d89898989612f38565b60008a815260056020908152604080832033845290915281205491975090612db2908a906142a1565b60009a8b52600560209081526040808d20338e52909152909a20999099555093979650505050505050565b612de5612e94565b73ffffffffffffffffffffffffffffffffffffffff8116612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a81565b612e9181613998565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a81565b60008181526006602052604081206004810154600390910154610edc91906142a1565b600080612f4485612f15565b905060008111612fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f506f6f6c20697320456d707479000000000000000000000000000000000000006044820152606401610a81565b8381101561301a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420456e6f75676820416d6f756e742042616c616e6365000000000000006044820152606401610a81565b8361302d81670de0b6b3a7640000614223565b1161303a5761303a614302565b6000858152600660205260408120908261305c87670de0b6b3a7640000614223565b61306691906142b4565b90506000670de0b6b3a76400008284600401546130839190614223565b61308d91906142b4565b90506000670de0b6b3a76400008385600301546130aa9190614223565b6130b491906142b4565b9050808460030160008282546130ca91906142a1565b92505081905550818460040160008282546130e591906142a1565b909155505060068401548454600186015460028701546131209373ffffffffffffffffffffffffffffffffffffffff1692919085878d6134ad565b955073ffffffffffffffffffffffffffffffffffffffff8716337fa0476a3982a956dfeb384f486e366aa2934444bec6d2295018f1ce71ce9858708b8961316682612f15565b60408051938452602084019290925290820152606081018c905260800160405180910390a350505050509392505050565b600080805b83518110156131de578381815181106131b7576131b761423a565b6020026020010151826131ca91906142ef565b9150806131d681614269565b91505061319c565b5092915050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa15801561325f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328391906141db565b10156132eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f20616c6c6f77616e636500000000000000000000000000000000000000006044820152606401610a81565b600084116132f857600080fd5b60006133048730613b90565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015613383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a79190614331565b506040805186815273ffffffffffffffffffffffffffffffffffffffff888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16134088730613b90565b61341286836142ef565b14613479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e730000006044820152606401610a81565b50505050505050565b61348b82611693565b801561349b575061349b33610dfa565b156134a9576134a98161287a565b5050565b6000876134b981611a83565b61351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6565642056616c696420455243323020546f6b656e000000000000000000006044820152606401610a81565b858811156135ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f537461727454696d652069732067726561746572207468616e2046696e69736860448201527f54696d65000000000000000000000000000000000000000000000000000000006064820152608401610a81565b6040518060e001604052808981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff16815250600660006008548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060085490806001815401808255809150506001900390600052602060002001600090919091909150558273ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f39d1ebc42b80acd5d644ca70fb0bd75d236e2c54c7f90436e8c6edf34d1d345d6008548b8b8b8b8b6040516137d996959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a3600880549250829060006137f483614269565b919050555050979650505050505050565b6000805b835181101561387a578273ffffffffffffffffffffffffffffffffffffffff1684828151811061383b5761383b61423a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613868576001915050610edc565b8061387281614269565b915050613809565b5060009392505050565b606081835103613895575081610edc565b818351116138ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616e277420637574206d6f7265207468656e20676f740000000000000000006044820152606401610a81565b8167ffffffffffffffff81111561391857613918613e07565b604051908082528060200260200182016040528015613941578160200160208202803683370190505b50905060005b828110156131de578381815181106139615761396161423a565b602002602001015182828151811061397b5761397b61423a565b60209081029190910101528061399081614269565b915050613947565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a198430613b90565b6040805184815273ffffffffffffffffffffffffffffffffffffffff868116602083015287168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a16040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af1158015613ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0c9190614331565b508082613b198630613b90565b613b2391906142ef565b14613b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e730000006044820152606401610a81565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152600091908416906370a0823190602401602060405180830381865afa158015613c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2491906141db565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613c4f57600080fd5b919050565b600060208284031215613c6657600080fd5b613c2482613c2b565b600060208284031215613c8157600080fd5b5035919050565b60008060408385031215613c9b57600080fd5b82359150613cab60208401613c2b565b90509250929050565b60008083601f840112613cc657600080fd5b50813567ffffffffffffffff811115613cde57600080fd5b6020830191508360208260051b8501011115613cf957600080fd5b9250929050565b600080600080600080600080600080600060c08c8e031215613d2157600080fd5b613d2a8c613c2b565b9a5067ffffffffffffffff8060208e01351115613d4657600080fd5b613d568e60208f01358f01613cb4565b909b50995060408d0135811015613d6c57600080fd5b613d7c8e60408f01358f01613cb4565b909950975060608d0135811015613d9257600080fd5b613da28e60608f01358f01613cb4565b909750955060808d0135811015613db857600080fd5b613dc88e60808f01358f01613cb4565b909550935060a08d0135811015613dde57600080fd5b50613def8d60a08e01358e01613cb4565b81935080925050509295989b509295989b9093969950565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e7d57613e7d613e07565b604052919050565b600067ffffffffffffffff821115613e9f57613e9f613e07565b5060051b60200190565b60008060408385031215613ebc57600080fd5b613ec583613c2b565b915060208084013567ffffffffffffffff811115613ee257600080fd5b8401601f81018613613ef357600080fd5b8035613f06613f0182613e85565b613e36565b81815260059190911b82018301908381019088831115613f2557600080fd5b928401925b82841015613f4a57613f3b84613c2b565b82529284019290840190613f2a565b80955050505050509250929050565b600081518084526020808501945080840160005b83811015613fe357815180518852838101518489015260408082015190890152606080820151908901526080808201519089015260a08082015173ffffffffffffffffffffffffffffffffffffffff908116918a019190915260c091820151169088015260e09096019590820190600101613f6d565b509495945050505050565b600081518084526020808501945080840160005b83811015613fe357815187529582019590820190600101614002565b6040815260006140316040830185613f59565b82810360208401526127218185613fee565b6000602080838503121561405657600080fd5b823567ffffffffffffffff81111561406d57600080fd5b8301601f8101851361407e57600080fd5b803561408c613f0182613e85565b81815260059190911b820183019083810190878311156140ab57600080fd5b928401925b828410156140c9578335825292840192908401906140b0565b979650505050505050565b602081526000613c246020830184613f59565b602081526000613c246020830184613fee565b60008060006060848603121561410f57600080fd5b833592506020840135915061412660408501613c2b565b90509250925092565b60008060008060008060c0878903121561414857600080fd5b61415187613c2b565b95506020870135945060408701359350606087013592506080870135915061417b60a08801613c2b565b90509295509295509295565b6000806040838503121561419a57600080fd5b6141a383613c2b565b9150613cab60208401613c2b565b600080604083850312156141c457600080fd5b6141cd83613c2b565b946020939093013593505050565b6000602082840312156141ed57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610edc57610edc6141f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429a5761429a6141f4565b5060010190565b81810381811115610edc57610edc6141f4565b6000826142ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610edc57610edc6141f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006020828403121561434357600080fd5b81518015158114613c2457600080fdfea2646970667358221220bdcc7da990c7aaa04bba809e8e04013ff7016a5e76cf8e89dfc90884b5eb4a2b64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106103085760003560e01c806371035fb21161019a578063a4b910fb116100e1578063d854f7021161008a578063eefe26e011610064578063eefe26e0146108e2578063f2f6fb0b146109a2578063f2fde38b146109c257600080fd5b8063d854f7021461088f578063da0ff68c146108af578063eb41051e146108c257600080fd5b8063bef7a2f0116100bb578063bef7a2f014610836578063d3e7f8261461084c578063d5e57e0b1461086257600080fd5b8063a4b910fb146107c4578063af09f518146107e4578063aff1a3111461081657600080fd5b80638da5cb5b11610143578063a143ed3a1161011d578063a143ed3a1461074c578063a173c08f14610784578063a3f5f6f2146107a457600080fd5b80638da5cb5b146106e15780639642ec0c1461070c57806399724fc11461073957600080fd5b8063875f438411610174578063875f43841461068e5780638a4454e9146106ae5780638baa9f9c146106c157600080fd5b806371035fb214610639578063715018a6146106595780637a9d7c141461066e57600080fd5b80634767422c1161025e5780635d1d104011610207578063676c8458116101e1578063676c8458146105e357806367e02dd9146105f95780636f7b53f41461061957600080fd5b80635d1d10401461058d578063657c64f0146105ad57806366818967146105c357600080fd5b80634c82ffe1116102385780634c82ffe11461052a57806358f24d3c1461054a5780635ace4d961461057757600080fd5b80634767422c146104b0578063481531e9146104dd5780634a6a51bb1461050a57600080fd5b8063179664b5116102c057806333e38a2a1161029a57806333e38a2a1461045a5780633b8850701461046d5780633dfd71bb1461048257600080fd5b8063179664b5146103ea5780631bdd8b7c1461040a57806327bbea3a1461043a57600080fd5b806309ea3b36116102f157806309ea3b36146103585780630cd8e9651461037857806311c09e82146103ca57600080fd5b806308048d501461030d5780630842bcbb14610336575b600080fd5b34801561031957600080fd5b50610323600c5481565b6040519081526020015b60405180910390f35b34801561034257600080fd5b50610356610351366004613c54565b6109e2565b005b34801561036457600080fd5b50610356610373366004613c6f565b610ba9565b34801561038457600080fd5b506001546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032d565b3480156103d657600080fd5b506103566103e5366004613c6f565b610bb6565b3480156103f657600080fd5b50610323610405366004613c88565b610bc3565b34801561041657600080fd5b5061042a610425366004613c54565b610dfa565b604051901515815260200161032d565b34801561044657600080fd5b50610356610455366004613c54565b610ee2565b610356610468366004613d00565b610f31565b34801561047957600080fd5b506103566112c1565b34801561048e57600080fd5b506104a261049d366004613ea9565b611316565b60405161032d92919061401e565b3480156104bc57600080fd5b506104d06104cb366004614043565b611337565b60405161032d91906140d4565b3480156104e957600080fd5b506003546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561051657600080fd5b50610356610525366004613c6f565b611686565b34801561053657600080fd5b5061042a610545366004613c54565b611693565b34801561055657600080fd5b5061056a610565366004613c54565b611731565b60405161032d91906140e7565b34801561058357600080fd5b5061032360085481565b34801561059957600080fd5b506103566105a83660046140fa565b6117aa565b3480156105b957600080fd5b50610323600a5481565b3480156105cf57600080fd5b506103566105de366004613c54565b611999565b3480156105ef57600080fd5b50610323600d5481565b34801561060557600080fd5b5061042a610614366004613c54565b611a83565b34801561062557600080fd5b5061056a610634366004613ea9565b611b8f565b34801561064557600080fd5b506104d0610654366004613c54565b611cd3565b34801561066557600080fd5b50610356611ce1565b34801561067a57600080fd5b50610356610689366004613c6f565b611cf5565b34801561069a57600080fd5b506103236106a9366004613c6f565b611d02565b6103566106bc36600461412f565b611e99565b3480156106cd57600080fd5b506103566106dc366004614187565b611fb4565b3480156106ed57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166103a5565b34801561071857600080fd5b506009546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b610356610747366004613d00565b6121b1565b34801561075857600080fd5b50610323610767366004613c88565b600560209081526000928352604080842090915290825290205481565b34801561079057600080fd5b5061032361079f3660046141b1565b612498565b3480156107b057600080fd5b506104d06107bf366004613c54565b6124c9565b3480156107d057600080fd5b506103236107df366004613c6f565b6124d7565b3480156107f057600080fd5b5060095461042a9074010000000000000000000000000000000000000000900460ff1681565b34801561082257600080fd5b5061056a610831366004613c54565b6125d4565b34801561084257600080fd5b5061032360025481565b34801561085857600080fd5b50610323600b5481565b34801561086e57600080fd5b5061032361087d366004613c54565b60046020526000908152604090205481565b34801561089b57600080fd5b506103566108aa366004613c6f565b61272a565b6103566108bd366004613c6f565b61287a565b3480156108ce57600080fd5b506103236108dd3660046140fa565b6129ac565b3480156108ee57600080fd5b506109546108fd366004613c6f565b6006602081905260009182526040909120805460018201546002830154600384015460048501546005860154959096015493959294919390929173ffffffffffffffffffffffffffffffffffffffff908116911687565b604080519788526020880196909652948601939093526060850191909152608084015273ffffffffffffffffffffffffffffffffffffffff90811660a08401521660c082015260e00161032d565b3480156109ae57600080fd5b506103236109bd3660046140fa565b612ba0565b3480156109ce57600080fd5b506103566109dd366004613c54565b612ddd565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a1f575060015473ffffffffffffffffffffffffffffffffffffffff1633145b610a8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f720000000000000000000000000060448201526064015b60405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff808316911603610b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e2774207377617020746f2073616d6520746f6b656e00000000000000006044820152606401610a81565b6003546040805173ffffffffffffffffffffffffffffffffffffffff808516825290921660208301527f2a649a96ed014013ba4748bc2952462a2adb0707fb5a2f30ff1f9041425f168f910160405180910390a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610bb1612e94565b600a55565b610bbe612e94565b600c55565b6000826008548110610c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600084815260066020526040902060050154849073ffffffffffffffffffffffffffffffffffffffff163314610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8373ffffffffffffffffffffffffffffffffffffffff8116610d41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b6000868152600660205260409020600581015473ffffffffffffffffffffffffffffffffffffffff90811690871603610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e2774206265207468652073616d65206f776e65720000000000000000006044820152606401610a81565b6000610de188612f15565b9050610dee888289612f38565b98975050505050505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580610edc5750600954600c546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91610e9891879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa158015610eb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed991906141db565b11155b92915050565b610eea612e94565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b808015801590610f435750600d548111155b610fa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c6964206172726179206c656e677468206c696d69740000000000006044820152606401610a81565b818614611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b89861461107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b8184146110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e7420417272617920496e76616c69640000000000000000000000006044820152606401610a81565b87861461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436c69666654696d6520417272617920496e76616c69640000000000000000006044820152606401610a81565b6111938c3361118e88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061319792505050565b6131e5565b6002546111ac908d906111a7908590614223565b613482565b60085460005b83811015611263576112508e8e8e848181106111d0576111d061423a565b905060200201358d8d858181106111e9576111e961423a565b905060200201358c8c868181106112025761120261423a565b905060200201358b8b8781811061121b5761121b61423a565b9050602002013560008b8b898181106112365761123661423a565b905060200201602081019061124b9190613c54565b6134ad565b508061125b81614269565b9150506111b2565b506000600160085461127591906142a1565b60408051848152602081018390529192507ffed9136a20cf7e2f3f82ad9987d856cb6718d7c7def71593e6383dab1877eacd910160405180910390a15050505050505050505050505050565b6112c9612e94565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6060806113238484611b8f565b905061132e81611337565b91509250929050565b6060815167ffffffffffffffff81111561135357611353613e07565b6040519080825280602002602001820160405280156113f057816020015b6113dd6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816113715790505b50905060005b8251811015611680576008548382815181106114145761141461423a565b602002602001015110611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b6040518060e00160405280600660008685815181106114a4576114a461423a565b60200260200101518152602001908152602001600020600001548152602001600660008685815181106114d9576114d961423a565b602002602001015181526020019081526020016000206001015481526020016006600086858151811061150e5761150e61423a565b60200260200101518152602001908152602001600020600201548152602001600660008685815181106115435761154361423a565b60200260200101518152602001908152602001600020600301548152602001600660008685815181106115785761157861423a565b60200260200101518152602001908152602001600020600401548152602001600660008685815181106115ad576115ad61423a565b6020026020010151815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600660008685815181106116185761161861423a565b60209081029190910181015182528101919091526040016000206006015473ffffffffffffffffffffffffffffffffffffffff16905282518390839081106116625761166261423a565b6020026020010181905250808061167890614269565b9150506113f6565b50919050565b61168e612e94565b600b55565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580610edc5750600954600a546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91610e9891879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561179e57602002820191906000526020600020905b81548152602001906001019080831161178a575b50505050509050919050565b826008548110611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600084815260066020526040902060050154849073ffffffffffffffffffffffffffffffffffffffff1633146118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8273ffffffffffffffffffffffffffffffffffffffff8116611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b600086815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168085529083529281902088905580518981529182018890527fef177b9f5ffc7f728510c5b4201368d1f257f367423c17a32f71f04f12ed90e1910160405180910390a2505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806119d6575060015473ffffffffffffffffffffffffffffffffffffffff1633145b611a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60095460009073ffffffffffffffffffffffffffffffffffffffff161580611ac6575060095474010000000000000000000000000000000000000000900460ff16155b80610edc5750600954600b546040517fcc44919b00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cc44919b91611b4791879160040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8891906141db565b1192915050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260076020526040812080546060929067ffffffffffffffff811115611bd257611bd2613e07565b604051908082528060200260200182016040528015611bfb578160200160208202803683370190505b5090506000805b8354811015611cbe57611c5f8660066000878581548110611c2557611c2561423a565b6000918252602080832090910154835282019290925260400190206006015473ffffffffffffffffffffffffffffffffffffffff16613805565b15611cac57838181548110611c7657611c7661423a565b9060005260206000200154838380611c8d90614269565b945081518110611c9f57611c9f61423a565b6020026020010181815250505b80611cb681614269565b915050611c02565b50611cc98282613884565b9695505050505050565b6060610edc6104cb83611731565b611ce9612e94565b611cf36000613998565b565b611cfd612e94565b600d55565b6000816008548110611d70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600083815260066020818152604092839020835160e08101855281548082526001830154938201939093526002820154948101949094526003810154606085015260048101546080850152600581015473ffffffffffffffffffffffffffffffffffffffff90811660a086015292015490911660c0830152421015611df9576000925050611680565b4281604001511015611e1657611e0e84612f15565b925050611680565b80516040820151600091611e29916142a1565b8251909150600090611e3b90426142a1565b90506000611e4b826103e8614223565b90506000611e5984836142b4565b905060006103e8828760600151611e709190614223565b611e7a91906142b4565b9050856080015181611e8c91906142a1565b9998505050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff8116611f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b8260008111611f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b611f8d8833866131e5565b611f9988600254613482565b611fa988888888886000896134ad565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ff1575060015473ffffffffffffffffffffffffffffffffffffffff1633145b612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546120e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f46656520616d6f756e74206973207a65726f00000000000000000000000000006044820152606401610a81565b73ffffffffffffffffffffffffffffffffffffffff82166121565773ffffffffffffffffffffffffffffffffffffffff8281166000908152600460205260408082205490519284169281156108fc0292818181858888f19350505050158015612150573d6000803e3d6000fd5b50612189565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546121899083908390613a0d565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040812055565b6121bb8582614223565b6000811180156121cd5750600d548111155b612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c6964206172726179206c656e677468206c696d69740000000000006044820152606401610a81565b81841461229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e7420417272617920496e76616c69640000000000000000000000006044820152606401610a81565b858a14612305576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4461746520417272617920496e76616c696400000000000000000000000000006044820152606401610a81565b87861461236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436c69666654696d6520417272617920496e76616c69640000000000000000006044820152606401610a81565b6123bd8c33898990506123b389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061319792505050565b61118e9190614223565b6008546002546123e0908e9089906123d6908790614223565b6111a79190614223565b60005b878110156112635760005b84811015612485576124728f8f8f8581811061240c5761240c61423a565b905060200201358e8e868181106124255761242561423a565b905060200201358d8d8781811061243e5761243e61423a565b905060200201358c8c878181106124575761245761423a565b9050602002013560008c8c898181106112365761123661423a565b508061247d81614269565b9150506123ee565b508061249081614269565b9150506123e3565b600760205281600052604060002081815481106124b457600080fd5b90600052602060002001600091509150505481565b6060610edc6104cb836125d4565b6000818152600660205260408120600854831080156124fa575042816001015411155b801561250e5750600061250c84612f15565b115b156116805761251c83611d02565b9150600081600401548361253091906142ef565b60048301819055600683015460058401549192506125689173ffffffffffffffffffffffffffffffffffffffff918216911685613a0d565b600582015473ffffffffffffffffffffffffffffffffffffffff167faa7132423a39dd83fa4078bd4d7b7d0d0d614b9837f0fd5d23e1afd9aa9bc29d85856125af82612f15565b6040805193845260208401929092529082015260600160405180910390a25050919050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040812080546060929067ffffffffffffffff81111561261757612617613e07565b604051908082528060200260200182016040528015612640578160200160208202803683370190505b5090506000805b835481101561271657600660008583815481106126665761266661423a565b9060005260206000200154815260200190815260200160002060040154600660008684815481106126995761269961423a565b90600052602060002001548152602001908152602001600020600301541115612704578381815481106126ce576126ce61423a565b90600052602060002001548383806126e590614269565b9450815181106126f7576126f761423a565b6020026020010181815250505b8061270e81614269565b915050612647565b506127218282613884565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612767575060015473ffffffffffffffffffffffffffffffffffffffff1633145b6127cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f417574686f72697a6174696f6e204572726f72000000000000000000000000006044820152606401610a81565b8060025403612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616e2774207377617020746f2073616d65206665652076616c7565000000006044820152606401610a81565b6002546040805183815260208101929092527f9d7f8f903b5290796d6b981141519d69dacf3b8bc9d0a19fabd782e73e886191910160405180910390a1600255565b806000036128855750565b60035473ffffffffffffffffffffffffffffffffffffffff16612949578034101561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f7420456e6f756768204665652050726f76696465640000000000000000006044820152606401610a81565b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a161296d565b60035461296d9073ffffffffffffffffffffffffffffffffffffffff1633836131e5565b60035473ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040812080548392906129a49084906142ef565b909155505050565b6000836008548110612a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600085815260066020526040902060050154859073ffffffffffffffffffffffffffffffffffffffff163314612aac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f596f7520617265206e6f7420506f6f6c204f776e6572000000000000000000006044820152606401610a81565b8460008111612b17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b8473ffffffffffffffffffffffffffffffffffffffff8116612b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b610dee888888612f38565b6000836008548110612c0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610a81565b600085815260056020908152604080832033845290915290205485908590811115612c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f75676820416c6c6f77616e63650000000000000000000000006044820152606401610a81565b8560008111612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a81565b8573ffffffffffffffffffffffffffffffffffffffff8116612d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610a81565b612d89898989612f38565b60008a815260056020908152604080832033845290915281205491975090612db2908a906142a1565b60009a8b52600560209081526040808d20338e52909152909a20999099555093979650505050505050565b612de5612e94565b73ffffffffffffffffffffffffffffffffffffffff8116612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a81565b612e9181613998565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a81565b60008181526006602052604081206004810154600390910154610edc91906142a1565b600080612f4485612f15565b905060008111612fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f506f6f6c20697320456d707479000000000000000000000000000000000000006044820152606401610a81565b8381101561301a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420456e6f75676820416d6f756e742042616c616e6365000000000000006044820152606401610a81565b8361302d81670de0b6b3a7640000614223565b1161303a5761303a614302565b6000858152600660205260408120908261305c87670de0b6b3a7640000614223565b61306691906142b4565b90506000670de0b6b3a76400008284600401546130839190614223565b61308d91906142b4565b90506000670de0b6b3a76400008385600301546130aa9190614223565b6130b491906142b4565b9050808460030160008282546130ca91906142a1565b92505081905550818460040160008282546130e591906142a1565b909155505060068401548454600186015460028701546131209373ffffffffffffffffffffffffffffffffffffffff1692919085878d6134ad565b955073ffffffffffffffffffffffffffffffffffffffff8716337fa0476a3982a956dfeb384f486e366aa2934444bec6d2295018f1ce71ce9858708b8961316682612f15565b60408051938452602084019290925290820152606081018c905260800160405180910390a350505050509392505050565b600080805b83518110156131de578381815181106131b7576131b761423a565b6020026020010151826131ca91906142ef565b9150806131d681614269565b91505061319c565b5092915050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa15801561325f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328391906141db565b10156132eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f20616c6c6f77616e636500000000000000000000000000000000000000006044820152606401610a81565b600084116132f857600080fd5b60006133048730613b90565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015613383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a79190614331565b506040805186815273ffffffffffffffffffffffffffffffffffffffff888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16134088730613b90565b61341286836142ef565b14613479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e730000006044820152606401610a81565b50505050505050565b61348b82611693565b801561349b575061349b33610dfa565b156134a9576134a98161287a565b5050565b6000876134b981611a83565b61351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6565642056616c696420455243323020546f6b656e000000000000000000006044820152606401610a81565b858811156135ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f537461727454696d652069732067726561746572207468616e2046696e69736860448201527f54696d65000000000000000000000000000000000000000000000000000000006064820152608401610a81565b6040518060e001604052808981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff16815250600660006008548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060085490806001815401808255809150506001900390600052602060002001600090919091909150558273ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f39d1ebc42b80acd5d644ca70fb0bd75d236e2c54c7f90436e8c6edf34d1d345d6008548b8b8b8b8b6040516137d996959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a3600880549250829060006137f483614269565b919050555050979650505050505050565b6000805b835181101561387a578273ffffffffffffffffffffffffffffffffffffffff1684828151811061383b5761383b61423a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613868576001915050610edc565b8061387281614269565b915050613809565b5060009392505050565b606081835103613895575081610edc565b818351116138ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616e277420637574206d6f7265207468656e20676f740000000000000000006044820152606401610a81565b8167ffffffffffffffff81111561391857613918613e07565b604051908082528060200260200182016040528015613941578160200160208202803683370190505b50905060005b828110156131de578381815181106139615761396161423a565b602002602001015182828151811061397b5761397b61423a565b60209081029190910101528061399081614269565b915050613947565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a198430613b90565b6040805184815273ffffffffffffffffffffffffffffffffffffffff868116602083015287168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a16040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af1158015613ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0c9190614331565b508082613b198630613b90565b613b2391906142ef565b14613b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e730000006044820152606401610a81565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152600091908416906370a0823190602401602060405180830381865afa158015613c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2491906141db565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613c4f57600080fd5b919050565b600060208284031215613c6657600080fd5b613c2482613c2b565b600060208284031215613c8157600080fd5b5035919050565b60008060408385031215613c9b57600080fd5b82359150613cab60208401613c2b565b90509250929050565b60008083601f840112613cc657600080fd5b50813567ffffffffffffffff811115613cde57600080fd5b6020830191508360208260051b8501011115613cf957600080fd5b9250929050565b600080600080600080600080600080600060c08c8e031215613d2157600080fd5b613d2a8c613c2b565b9a5067ffffffffffffffff8060208e01351115613d4657600080fd5b613d568e60208f01358f01613cb4565b909b50995060408d0135811015613d6c57600080fd5b613d7c8e60408f01358f01613cb4565b909950975060608d0135811015613d9257600080fd5b613da28e60608f01358f01613cb4565b909750955060808d0135811015613db857600080fd5b613dc88e60808f01358f01613cb4565b909550935060a08d0135811015613dde57600080fd5b50613def8d60a08e01358e01613cb4565b81935080925050509295989b509295989b9093969950565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e7d57613e7d613e07565b604052919050565b600067ffffffffffffffff821115613e9f57613e9f613e07565b5060051b60200190565b60008060408385031215613ebc57600080fd5b613ec583613c2b565b915060208084013567ffffffffffffffff811115613ee257600080fd5b8401601f81018613613ef357600080fd5b8035613f06613f0182613e85565b613e36565b81815260059190911b82018301908381019088831115613f2557600080fd5b928401925b82841015613f4a57613f3b84613c2b565b82529284019290840190613f2a565b80955050505050509250929050565b600081518084526020808501945080840160005b83811015613fe357815180518852838101518489015260408082015190890152606080820151908901526080808201519089015260a08082015173ffffffffffffffffffffffffffffffffffffffff908116918a019190915260c091820151169088015260e09096019590820190600101613f6d565b509495945050505050565b600081518084526020808501945080840160005b83811015613fe357815187529582019590820190600101614002565b6040815260006140316040830185613f59565b82810360208401526127218185613fee565b6000602080838503121561405657600080fd5b823567ffffffffffffffff81111561406d57600080fd5b8301601f8101851361407e57600080fd5b803561408c613f0182613e85565b81815260059190911b820183019083810190878311156140ab57600080fd5b928401925b828410156140c9578335825292840192908401906140b0565b979650505050505050565b602081526000613c246020830184613f59565b602081526000613c246020830184613fee565b60008060006060848603121561410f57600080fd5b833592506020840135915061412660408501613c2b565b90509250925092565b60008060008060008060c0878903121561414857600080fd5b61415187613c2b565b95506020870135945060408701359350606087013592506080870135915061417b60a08801613c2b565b90509295509295509295565b6000806040838503121561419a57600080fd5b6141a383613c2b565b9150613cab60208401613c2b565b600080604083850312156141c457600080fd5b6141cd83613c2b565b946020939093013593505050565b6000602082840312156141ed57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610edc57610edc6141f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429a5761429a6141f4565b5060010190565b81810381811115610edc57610edc6141f4565b6000826142ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610edc57610edc6141f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006020828403121561434357600080fd5b81518015158114613c2457600080fdfea2646970667358221220bdcc7da990c7aaa04bba809e8e04013ff7016a5e76cf8e89dfc90884b5eb4a2b64736f6c63430008110033
Deployed Bytecode Sourcemap
40055:1680:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:30;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;23699:30:0;;;;;;;;21776:252;;;;;;;;;;-1:-1:-1;21776:252:0;;;;;:::i;:::-;;:::i;:::-;;25363:108;;;;;;;;;;-1:-1:-1;25363:108:0;;;;;:::i;:::-;;:::i;20409:31::-;;;;;;;;;;-1:-1:-1;20409:31:0;;;;;;;;;;;949:42:1;937:55;;;919:74;;907:2;892:18;20409:31:0;773:226:1;25601:100:0;;;;;;;;;;-1:-1:-1;25601:100:0;;;;;:::i;:::-;;:::i;35576:480::-;;;;;;;;;;-1:-1:-1;35576:480:0;;;;;:::i;:::-;;:::i;26490:281::-;;;;;;;;;;-1:-1:-1;26490:281:0;;;;;:::i;:::-;;:::i;:::-;;;1428:14:1;;1421:22;1403:41;;1391:2;1376:18;26490:281:0;1263:187:1;25242:113:0;;;;;;;;;;-1:-1:-1;25242:113:0;;;;;:::i;:::-;;:::i;32720:1203::-;;;;;;:::i;:::-;;:::i;25709:99::-;;;;;;;;;;;;;:::i;39368:284::-;;;;;;;;;;-1:-1:-1;39368:284:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;38141:658::-;;;;;;;;;;-1:-1:-1;38141:658:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21107:23::-;;;;;;;;;;-1:-1:-1;21107:23:0;;;;;;;;25479:114;;;;;;;;;;-1:-1:-1;25479:114:0;;;;;:::i;:::-;;:::i;25816:288::-;;;;;;;;;;-1:-1:-1;25816:288:0;;;;;:::i;:::-;;:::i;37336:165::-;;;;;;;;;;-1:-1:-1;37336:165:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23474:20::-;;;;;;;;;;;;;;;;36433:342;;;;;;;;;;-1:-1:-1;36433:342:0;;;;;:::i;:::-;;:::i;23614:34::-;;;;;;;;;;;;;;;;20638:117;;;;;;;;;;-1:-1:-1;20638:117:0;;;;;:::i;:::-;;:::i;23736:34::-;;;;;;;;;;;;;;;;26112:370;;;;;;;;;;-1:-1:-1;26112:370:0;;;;;:::i;:::-;;:::i;38807:553::-;;;;;;;;;;-1:-1:-1;38807:553:0;;;;;:::i;:::-;;:::i;39855:193::-;;;;;;;;;;-1:-1:-1;39855:193:0;;;;;:::i;:::-;;:::i;19554:103::-;;;;;;;;;;;;;:::i;26779:120::-;;;;;;;;;;-1:-1:-1;26779:120:0;;;;;:::i;:::-;;:::i;40103:730::-;;;;;;;;;;-1:-1:-1;40103:730:0;;;;;:::i;:::-;;:::i;31939:773::-;;;;;;:::i;:::-;;:::i;22036:348::-;;;;;;;;;;-1:-1:-1;22036:348:0;;;;;:::i;:::-;;:::i;18906:87::-;;;;;;;;;;-1:-1:-1;18952:7:0;18979:6;;;18906:87;;23503:32;;;;;;;;;;-1:-1:-1;23503:32:0;;;;;;;;33980:1358;;;;;;:::i;:::-;;:::i;23305:64::-;;;;;;;;;;-1:-1:-1;23305:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23423:44;;;;;;;;;;-1:-1:-1;23423:44:0;;;;;:::i;:::-;;:::i;39660:187::-;;;;;;;;;;-1:-1:-1;39660:187:0;;;;;:::i;:::-;;:::i;40902:830::-;;;;;;;;;;-1:-1:-1;40902:830:0;;;;;:::i;:::-;;:::i;23542:27::-;;;;;;;;;;-1:-1:-1;23542:27:0;;;;;;;;;;;37548:585;;;;;;;;;;-1:-1:-1;37548:585:0;;;;;:::i;:::-;;:::i;21082:18::-;;;;;;;;;;;;;;;;23655:37;;;;;;;;;;;;;;;;21137:42;;;;;;;;;;-1:-1:-1;21137:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;21567:201;;;;;;;;;;-1:-1:-1;21567:201:0;;;;;:::i;:::-;;:::i;21188:371::-;;;;;;:::i;:::-;;:::i;36064:361::-;;;;;;;;;;-1:-1:-1;36064:361:0;;;;;:::i;:::-;;:::i;23376:40::-;;;;;;;;;;-1:-1:-1;23376:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10485:25:1;;;10541:2;10526:18;;10519:34;;;;10569:18;;;10562:34;;;;10627:2;10612:18;;10605:34;;;;10670:3;10655:19;;10648:35;10702:42;10781:15;;;10775:3;10760:19;;10753:44;10834:15;10828:3;10813:19;;10806:44;10472:3;10457:19;23376:40:0;10170:686:1;36783:495:0;;;;;;;;;;-1:-1:-1;36783:495:0;;;;;:::i;:::-;;:::i;19812:201::-;;;;;;;;;;-1:-1:-1;19812:201:0;;;;;:::i;:::-;;:::i;21776:252::-;18952:7;18979:6;;;20508:10;:21;;:55;;-1:-1:-1;20547:16:0;;;;20533:10;:30;20508:55;20486:124;;;;;;;11063:2:1;20486:124:0;;;11045:21:1;11102:2;11082:18;;;11075:30;11141:21;11121:18;;;11114:49;11180:18;;20486:124:0;;;;;;;;;21854:8:::1;::::0;:18:::1;::::0;;::::1;:8:::0;::::1;:18:::0;21846:55:::1;;;::::0;::::1;::::0;;11411:2:1;21846:55:0::1;::::0;::::1;11393:21:1::0;11450:2;11430:18;;;11423:30;11489:26;11469:18;;;11462:54;11533:18;;21846:55:0::1;11209:348:1::0;21846:55:0::1;21937:8;::::0;21917:29:::1;::::0;;21937:8:::1;11815:15:1::0;;;11797:34;;21937:8:0;;::::1;11862:2:1::0;11847:18;;11840:43;21917:29:0::1;::::0;11709:18:1;21917:29:0::1;;;;;;;21957:8;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;21776:252::o;25363:108::-;18792:13;:11;:13::i;:::-;25438:19:::1;:25:::0;25363:108::o;25601:100::-;18792:13;:11;:13::i;:::-;25672:15:::1;:21:::0;25601:100::o;35576:480::-;35774:17;35682:7;24234:5;;24224:7;:15;24216:47;;;;;;;12096:2:1;24216:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;24216:47:0;11894:343:1;24216:47:0;24496:17:::1;::::0;;;:8:::1;:17;::::0;;;;:23:::1;;::::0;35712:7;;24496:37:::1;:23;24523:10;24496:37;24474:109;;;::::0;::::1;::::0;;12444:2:1;24474:109:0::1;::::0;::::1;12426:21:1::0;12483:2;12463:18;;;12456:30;12522:24;12502:18;;;12495:52;12564:18;;24474:109:0::1;12242:346:1::0;24474:109:0::1;35745:9:::0;24083:24:::2;::::0;::::2;24075:64;;;::::0;::::2;::::0;;12795:2:1;24075:64:0::2;::::0;::::2;12777:21:1::0;12834:2;12814:18;;;12807:30;12873:29;12853:18;;;12846:57;12920:18;;24075:64:0::2;12593:351:1::0;24075:64:0::2;35809:17:::3;35829::::0;;;:8:::3;:17;::::0;;;;35878:10:::3;::::0;::::3;::::0;::::3;::::0;;::::3;35865:23:::0;;::::3;::::0;35857:59:::3;;;::::0;::::3;::::0;;13151:2:1;35857:59:0::3;::::0;::::3;13133:21:1::0;13190:2;13170:18;;;13163:30;13229:25;13209:18;;;13202:53;13272:18;;35857:59:0::3;12949:347:1::0;35857:59:0::3;35927:24;35954;35970:7;35954:15;:24::i;:::-;35927:51;;36001:47;36011:7;36020:16;36038:9;36001;:47::i;:::-;35989:59:::0;35576:480;-1:-1:-1;;;;;;;;35576:480:0:o;26490:281::-;26593:17;;26556:4;;26593:31;:17;:31;;:170;;-1:-1:-1;26654:17:0;;26728:15;;26643:115;;;;;26761:1;;26654:17;;;26643:35;;:115;;26697:12;;26643:115;;13505:42:1;13493:55;;;;13475:74;;13580:2;13565:18;;13558:34;13463:2;13448:18;;13301:297;26643:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:119;26641:122;26593:170;26573:190;26490:281;-1:-1:-1;;26490:281:0:o;25242:113::-;18792:13;:11;:13::i;:::-;25319:17:::1;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;25242:113::o;32720:1203::-;33006:6;24883:8;;;;;:39;;;24903:19;;24895:4;:27;;24883:39;24861:115;;;;;;;13994:2:1;24861:115:0;;;13976:21:1;14033:2;14013:18;;;14006:30;14072:28;14052:18;;;14045:56;14118:18;;24861:115:0;13792:350:1;24861:115:0;33040:35;;::::1;33032:66;;;::::0;::::1;::::0;;14349:2:1;33032:66:0::1;::::0;::::1;14331:21:1::0;14388:2;14368:18;;;14361:30;14427:20;14407:18;;;14400:48;14465:18;;33032:66:0::1;14147:342:1::0;33032:66:0::1;33117:39:::0;;::::1;33109:70;;;::::0;::::1;::::0;;14349:2:1;33109:70:0::1;::::0;::::1;14331:21:1::0;14388:2;14368:18;;;14361:30;14427:20;14407:18;;;14400:48;14465:18;;33109:70:0::1;14147:342:1::0;33109:70:0::1;33198:36:::0;;::::1;33190:69;;;::::0;::::1;::::0;;14696:2:1;33190:69:0::1;::::0;::::1;14678:21:1::0;14735:2;14715:18;;;14708:30;14774:22;14754:18;;;14747:50;14814:18;;33190:69:0::1;14494:344:1::0;33190:69:0::1;33278:39:::0;;::::1;33270:74;;;::::0;::::1;::::0;;15045:2:1;33270:74:0::1;::::0;::::1;15027:21:1::0;15084:2;15064:18;;;15057:30;15123:25;15103:18;;;15096:53;15166:18;;33270:74:0::1;14843:347:1::0;33270:74:0::1;33355:68;33371:6;33379:10;33391:31;33409:12;;33391:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33391:17:0::1;::::0;-1:-1:-1;;;33391:31:0:i:1;:::-;33355:15;:68::i;:::-;33449:3;::::0;33434:35:::1;::::0;33441:6;;33449:19:::1;::::0;33455:6;;33449:19:::1;:::i;:::-;33434:6;:35::i;:::-;33502:5;::::0;33480:19:::1;33518:300;33538:17:::0;;::::1;33518:300;;;33577:229;33606:6;33631:10;;33642:1;33631:13;;;;;;;:::i;:::-;;;;;;;33663:10;;33674:1;33663:13;;;;;;;:::i;:::-;;;;;;;33695:11;;33707:1;33695:14;;;;;;;:::i;:::-;;;;;;;33728:12;;33741:1;33728:15;;;;;;;:::i;:::-;;;;;;;33762:1;33782:6;;33789:1;33782:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;33577:10;:229::i;:::-;-1:-1:-1::0;33557:3:0;::::1;::::0;::::1;:::i;:::-;;;;33518:300;;;;33828:18;33857:1;33849:5;;:9;;;;:::i;:::-;33874:41;::::0;;16253:25:1;;;16309:2;16294:18;;16287:34;;;33828:30:0;;-1:-1:-1;33874:41:0::1;::::0;16226:18:1;33874:41:0::1;;;;;;;33021:902;;32720:1203:::0;;;;;;;;;;;;:::o;25709:99::-;18792:13;:11;:13::i;:::-;25785:15:::1;::::0;;25766:34;;::::1;25785:15:::0;;;;::::1;;;25784:16;25766:34:::0;;::::1;;::::0;;25709:99::o;39368:284::-;39494:19;39515:24;39562:42;39582:12;39596:7;39562:19;:42::i;:::-;39552:52;;39623:21;39636:7;39623:12;:21::i;:::-;39615:29;;39368:284;;;;;:::o;38141:658::-;38234:18;38288:4;:11;38277:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38277:23:0;;;;;;;;;;;;;;;;;38270:30;;38316:9;38311:481;38335:4;:11;38331:1;:15;38311:481;;;38386:5;;38376:4;38381:1;38376:7;;;;;;;;:::i;:::-;;;;;;;:15;38368:47;;;;;;;12096:2:1;38368:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;38368:47:0;11894:343:1;38368:47:0;38440:340;;;;;;;;38463:8;:17;38472:4;38477:1;38472:7;;;;;;;;:::i;:::-;;;;;;;38463:17;;;;;;;;;;;:27;;;38440:340;;;;38509:8;:17;38518:4;38523:1;38518:7;;;;;;;;:::i;:::-;;;;;;;38509:17;;;;;;;;;;;:27;;;38440:340;;;;38555:8;:17;38564:4;38569:1;38564:7;;;;;;;;:::i;:::-;;;;;;;38555:17;;;;;;;;;;;:28;;;38440:340;;;;38602:8;:17;38611:4;38616:1;38611:7;;;;;;;;:::i;:::-;;;;;;;38602:17;;;;;;;;;;;:29;;;38440:340;;;;38650:8;:17;38659:4;38664:1;38659:7;;;;;;;;:::i;:::-;;;;;;;38650:17;;;;;;;;;;;:31;;;38440:340;;;;38700:8;:17;38709:4;38714:1;38709:7;;;;;;;;:::i;:::-;;;;;;;38700:17;;;;;;;;;;;:23;;;;;;;;;;;;38440:340;;;;;;38742:8;:17;38751:4;38756:1;38751:7;;;;;;;;:::i;:::-;;;;;;;;;;;;38742:17;;;;;;;;;;-1:-1:-1;38742:17:0;:23;;;;;38440:340;;38430:7;;:4;;38435:1;;38430:7;;;;;;:::i;:::-;;;;;;:350;;;;38348:3;;;;;:::i;:::-;;;;38311:481;;;;38141:658;;;:::o;25479:114::-;18792:13;:11;:13::i;:::-;25557:22:::1;:28:::0;25479:114::o;25816:288::-;25921:17;;25884:4;;25921:31;:17;:31;;:175;;-1:-1:-1;25982:17:0;;26057:19;;25971:120;;;;;26094:1;;25982:17;;;25971:35;;:120;;26025:13;;25971:120;;13505:42:1;13493:55;;;;13475:74;;13580:2;13565:18;;13558:34;13463:2;13448:18;;13301:297;37336:165:0;37472:21;;;;;;;:7;:21;;;;;;;;;37465:28;;;;;;;;;;;;;;;;;37431:16;;37465:28;;;37472:21;37465:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37336:165;;;:::o;36433:342::-;36584:7;24234:5;;24224:7;:15;24216:47;;;;;;;12096:2:1;24216:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;24216:47:0;11894:343:1;24216:47:0;24496:17:::1;::::0;;;:8:::1;:17;::::0;;;;:23:::1;;::::0;36614:7;;24496:37:::1;:23;24523:10;24496:37;24474:109;;;::::0;::::1;::::0;;12444:2:1;24474:109:0::1;::::0;::::1;12426:21:1::0;12483:2;12463:18;;;12456:30;12522:24;12502:18;;;12495:52;12564:18;;24474:109:0::1;12242:346:1::0;24474:109:0::1;36647:8:::0;24083:24:::2;::::0;::::2;24075:64;;;::::0;::::2;::::0;;12795:2:1;24075:64:0::2;::::0;::::2;12777:21:1::0;12834:2;12814:18;;;12807:30;12873:29;12853:18;;;12846:57;12920:18;;24075:64:0::2;12593:351:1::0;24075:64:0::2;36673:18:::3;::::0;;;:9:::3;:18;::::0;;;;;;;:28:::3;::::0;::::3;::::0;;;;;;;;;;:38;;;36727:40;;16253:25:1;;;16294:18;;;16287:34;;;36727:40:0::3;::::0;16226:18:1;36727:40:0::3;;;;;;;24594:1:::2;24274::::1;36433:342:::0;;;;:::o;20638:117::-;18952:7;18979:6;;;20508:10;:21;;:55;;-1:-1:-1;20547:16:0;;;;20533:10;:30;20508:55;20486:124;;;;;;;11063:2:1;20486:124:0;;;11045:21:1;11102:2;11082:18;;;11075:30;11141:21;11121:18;;;11114:49;11180:18;;20486:124:0;10861:343:1;20486:124:0;20720:16:::1;:27:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;20638:117::o;26112:370::-;26253:17;;26211:4;;26253:31;:17;:31;;:64;;-1:-1:-1;26302:15:0;;;;;;;26301:16;26253:64;:221;;;-1:-1:-1;26345:17:0;;26420:22;;26334:123;;;;;26473:1;;26345:17;;;26334:35;;:123;;26388:13;;26334:123;;13505:42:1;13493:55;;;;13475:74;;13580:2;13565:18;;13558:34;13463:2;13448:18;;13301:297;26334:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:140;26233:241;26112:370;-1:-1:-1;;26112:370:0:o;38807:553::-;38993:21;;;38966:24;38993:21;;;:7;:21;;;;;39062:13;;38932:16;;38966:24;39048:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39048:28:0;-1:-1:-1;39025:51:0;-1:-1:-1;39087:13:0;;39111:186;39135:13;;39131:17;;39111:186;;;39174:51;39190:7;39199:8;:19;39208:6;39215:1;39208:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;39199:19;;;;;;;;;;;;:25;;;;;39174:15;:51::i;:::-;39170:116;;;39261:6;39268:1;39261:9;;;;;;;;:::i;:::-;;;;;;;;;39246:3;39250:7;;;;;:::i;:::-;;;39246:12;;;;;;;;:::i;:::-;;;;;;:24;;;;;39170:116;39150:3;;;;:::i;:::-;;;;39111:186;;;;39314:38;39341:3;39346:5;39314:26;:38::i;:::-;39307:45;38807:553;-1:-1:-1;;;;;;38807:553:0:o;39855:193::-;39954:18;39997:43;40010:29;40026:12;40010:15;:29::i;19554:103::-;18792:13;:11;:13::i;:::-;19619:30:::1;19646:1;19619:18;:30::i;:::-;19554:103::o:0;26779:120::-;18792:13;:11;:13::i;:::-;26860:19:::1;:31:::0;26779:120::o;40103:730::-;40229:7;40202;24234:5;;24224:7;:15;24216:47;;;;;;;12096:2:1;24216:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;24216:47:0;11894:343:1;24216:47:0;40254:16:::1;40273:17:::0;;;:8:::1;:17;::::0;;;;;;;;40254:36;;::::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;;;;40305:15:::1;:32;40301:46;;;40346:1;40339:8;;;;;40301:46;40380:15;40362:4;:15;;;:33;40358:70;;;40404:24;40420:7;40404:15;:24::i;:::-;40397:31;;;;;40358:70;40485:14:::0;;40467:15:::1;::::0;::::1;::::0;40439:25:::1;::::0;40467:32:::1;::::0;::::1;:::i;:::-;40549:14:::0;;40439:60;;-1:-1:-1;40510:18:0::1;::::0;40531:32:::1;::::0;:15:::1;:32;:::i;:::-;40510:53:::0;-1:-1:-1;40574:26:0::1;40603:17;40510:53:::0;40616:4:::1;40603:17;:::i;:::-;40574:46:::0;-1:-1:-1;40631:21:0::1;40655:38;40676:17:::0;40574:46;40655:38:::1;:::i;:::-;40631:62;;40704:23;40767:4;40750:13;40731:4;:16;;;:32;;;;:::i;:::-;40730:41;;;;:::i;:::-;40704:67;;40807:4;:18;;;40789:15;:36;;;;:::i;:::-;40782:43:::0;40103:730;-1:-1:-1;;;;;;;;;40103:730:0:o;31939:773::-;32386:6;24083:24;;;24075:64;;;;;;;12795:2:1;24075:64:0;;;12777:21:1;12834:2;12814:18;;;12807:30;12873:29;12853:18;;;12846:57;12920:18;;24075:64:0;12593:351:1;24075:64:0;32407:12:::1;24359:1;24349:7;:11;24341:56;;;::::0;::::1;::::0;;16813:2:1;24341:56:0::1;::::0;::::1;16795:21:1::0;;;16832:18;;;16825:30;16891:34;16871:18;;;16864:62;16943:18;;24341:56:0::1;16611:356:1::0;24341:56:0::1;32432:49:::2;32448:6;32456:10;32468:12;32432:15;:49::i;:::-;32492:19;32499:6;32507:3;;32492:6;:19::i;:::-;32522:182;32547:6;32568:10;32593;32618:11;32644:12;32671:1;32687:6;32522:10;:182::i;:::-;;24150:1:::1;31939:773:::0;;;;;;;:::o;22036:348::-;18952:7;18979:6;;;20508:10;:21;;:55;;-1:-1:-1;20547:16:0;;;;20533:10;:30;20508:55;20486:124;;;;;;;11063:2:1;20486:124:0;;;11045:21:1;11102:2;11082:18;;;11075:30;11141:21;11121:18;;;11114:49;11180:18;;20486:124:0;10861:343:1;20486:124:0;22127:15:::1;::::0;::::1;22145:1;22127:15:::0;;;:7:::1;:15;::::0;;;;;22119:50:::1;;;::::0;::::1;::::0;;17174:2:1;22119:50:0::1;::::0;::::1;17156:21:1::0;17213:2;17193:18;;;17186:30;17252:20;17232:18;;;17225:48;17290:18;;22119:50:0::1;16972:342:1::0;22119:50:0::1;22184:20;::::0;::::1;22180:167;;22221:21;22243:15:::0;;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;22221:38;;:21;;::::1;::::0;:38;::::1;;;::::0;;22243:15;22221:38;22243:15;22221:21;:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22180:167;;;22319:15;::::0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;22292:43:::1;::::0;22306:6;;22314:3;;22292:13:::1;:43::i;:::-;-1:-1:-1::0;22357:15:0::1;;22375:1;22357:15:::0;;;:7:::1;:15;::::0;;;;:19;22036:348::o;33980:1358::-;34269:34;34285:11;34269:6;:34;:::i;:::-;24890:1;24883:4;:8;:39;;;;;24903:19;;24895:4;:27;;24883:39;24861:115;;;;;;;13994:2:1;24861:115:0;;;13976:21:1;14033:2;14013:18;;;14006:30;14072:28;14052:18;;;14045:56;14118:18;;24861:115:0;13792:350:1;24861:115:0;34324:36;;::::1;34316:69;;;::::0;::::1;::::0;;14696:2:1;34316:69:0::1;::::0;::::1;14678:21:1::0;14735:2;14715:18;;;14708:30;14774:22;14754:18;;;14747:50;14814:18;;34316:69:0::1;14494:344:1::0;34316:69:0::1;34404:39:::0;;::::1;34396:70;;;::::0;::::1;::::0;;14349:2:1;34396:70:0::1;::::0;::::1;14331:21:1::0;14388:2;14368:18;;;14361:30;14427:20;14407:18;;;14400:48;14465:18;;34396:70:0::1;14147:342:1::0;34396:70:0::1;34485:39:::0;;::::1;34477:75;;;::::0;::::1;::::0;;15045:2:1;34477:75:0::1;::::0;::::1;15027:21:1::0;15084:2;15064:18;;;15057:30;15123:25;15103:18;;;15096:53;15166:18;;34477:75:0::1;14843:347:1::0;34477:75:0::1;34563:139;34593:6;34614:10;34673:11;;:18;;34639:31;34657:12;;34639:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34639:17:0::1;::::0;-1:-1:-1;;;34639:31:0:i:1;:::-;:52;;;;:::i;34563:139::-;34735:5;::::0;34766:3:::1;::::0;34751:56:::1;::::0;34758:6;;34788:11;;34766:19:::1;::::0;34772:6;;34766:19:::1;:::i;:::-;:40;;;;:::i;34751:56::-;34823:9;34818:415;34838:22:::0;;::::1;34818:415;;;34887:9;34882:340;34902:17:::0;;::::1;34882:340;;;34945:261;34978:6;35007:10;;35018:1;35007:13;;;;;;;:::i;:::-;;;;;;;35043:10;;35054:1;35043:13;;;;;;;:::i;:::-;;;;;;;35079:11;;35091:1;35079:14;;;;;;;:::i;:::-;;;;;;;35116:12;;35129:1;35116:15;;;;;;;:::i;:::-;;;;;;;35154:1;35178:6;;35185:1;35178:9;;;;;;;:::i;34945:261::-;-1:-1:-1::0;34921:3:0;::::1;::::0;::::1;:::i;:::-;;;;34882:340;;;-1:-1:-1::0;34862:3:0;::::1;::::0;::::1;:::i;:::-;;;;34818:415;;23423:44:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39660:187::-;39756:18;39799:40;39812:26;39825:12;39812;:26::i;40902:830::-;40978:23;41104:17;;;:8;:17;;;;;41160:5;;41150:15;;:65;;;;;41200:15;41182:4;:14;;;:33;;41150:65;:110;;;;;41259:1;41232:24;41248:7;41232:15;:24::i;:::-;:28;41150:110;41132:593;;;41305:30;41327:7;41305:21;:30::i;:::-;41287:48;;41350:23;41394:4;:18;;;41376:15;:36;;;;:::i;:::-;41427:18;;;:36;;;41492:10;;;;41504;;;;41350:62;;-1:-1:-1;41478:54:0;;41492:10;;;;;41504;41516:15;41478:13;:54::i;:::-;41611:10;;;;;;41552:161;41585:7;41640:15;41674:24;41585:7;41674:15;:24::i;:::-;41552:161;;;17651:25:1;;;17707:2;17692:18;;17685:34;;;;17735:18;;;17728:34;17639:2;17624:18;41552:161:0;;;;;;;41272:453;41008:724;40902:830;;;:::o;37548:585::-;37701:21;;;37674:24;37701:21;;;:7;:21;;;;;37770:13;;37640:16;;37674:24;37756:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37756:28:0;-1:-1:-1;37733:51:0;-1:-1:-1;37795:13:0;;37819:251;37843:13;;37839:17;;37819:251;;;37951:8;:19;37960:6;37967:1;37960:9;;;;;;;;:::i;:::-;;;;;;;;;37951:19;;;;;;;;;;;:33;;;37900:8;:19;37909:6;37916:1;37909:9;;;;;;;;:::i;:::-;;;;;;;;;37900:19;;;;;;;;;;;:31;;;:84;37878:181;;;38034:6;38041:1;38034:9;;;;;;;;:::i;:::-;;;;;;;;;38019:3;38023:7;;;;;:::i;:::-;;;38019:12;;;;;;;;:::i;:::-;;;;;;:24;;;;;37878:181;37858:3;;;;:::i;:::-;;;;37819:251;;;;38087:38;38114:3;38119:5;38087:26;:38::i;:::-;38080:45;37548:585;-1:-1:-1;;;;;37548:585:0:o;21567:201::-;18952:7;18979:6;;;20508:10;:21;;:55;;-1:-1:-1;20547:16:0;;;;20533:10;:30;20508:55;20486:124;;;;;;;11063:2:1;20486:124:0;;;11045:21:1;11102:2;11082:18;;;11075:30;11141:21;11121:18;;;11114:49;11180:18;;20486:124:0;10861:343:1;20486:124:0;21654:7:::1;21647:3;;:14:::0;21639:55:::1;;;::::0;::::1;::::0;;17975:2:1;21639:55:0::1;::::0;::::1;17957:21:1::0;18014:2;17994:18;;;17987:30;18053;18033:18;;;18026:58;18101:18;;21639:55:0::1;17773:352:1::0;21639:55:0::1;21732:3;::::0;21710:26:::1;::::0;;16253:25:1;;;16309:2;16294:18;;16287:34;;;;21710:26:0::1;::::0;16226:18:1;21710:26:0::1;;;;;;;21747:3;:13:::0;21567:201::o;21188:371::-;21248:4;21256:1;21248:9;21244:22;;21188:371;:::o;21244:22::-;21280:8;;:22;:8;21276:240;;21340:4;21327:9;:17;;21319:53;;;;;;;18332:2:1;21319:53:0;;;18314:21:1;18371:2;18351:18;;;18344:30;18410:25;18390:18;;;18383:53;18453:18;;21319:53:0;18130:347:1;21319:53:0;21392:36;;;21406:9;18656:25:1;;21417:10:0;18712:2:1;18697:18;;18690:83;21392:36:0;;18629:18:1;21392:36:0;;;;;;;21276:240;;;21477:8;;21461:43;;21477:8;;21487:10;21499:4;21461:15;:43::i;:::-;21534:8;;;;21526:17;;;;:7;:17;;;;;:25;;21547:4;;21526:17;:25;;21547:4;;21526:25;:::i;:::-;;;;-1:-1:-1;;;21188:371:0:o;36064:361::-;36344:7;36218;24234:5;;24224:7;:15;24216:47;;;;;;;12096:2:1;24216:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;24216:47:0;11894:343:1;24216:47:0;24496:17:::1;::::0;;;:8:::1;:17;::::0;;;;:23:::1;;::::0;36248:7;;24496:37:::1;:23;24523:10;24496:37;24474:109;;;::::0;::::1;::::0;;12444:2:1;24474:109:0::1;::::0;::::1;12426:21:1::0;12483:2;12463:18;;;12456:30;12522:24;12502:18;;;12495:52;12564:18;;24474:109:0::1;12242:346:1::0;24474:109:0::1;36279:10:::2;24359:1;24349:7;:11;24341:56;;;::::0;::::2;::::0;;16813:2:1;24341:56:0::2;::::0;::::2;16795:21:1::0;;;16832:18;;;16825:30;16891:34;16871:18;;;16864:62;16943:18;;24341:56:0::2;16611:356:1::0;24341:56:0::2;36315:9:::0;24083:24:::3;::::0;::::3;24075:64;;;::::0;::::3;::::0;;12795:2:1;24075:64:0::3;::::0;::::3;12777:21:1::0;12834:2;12814:18;;;12807:30;12873:29;12853:18;;;12846:57;12920:18;;24075:64:0::3;12593:351:1::0;24075:64:0::3;36376:41:::4;36386:7;36395:10;36407:9;36376;:41::i;36783:495::-:0;37066:14;36937:7;24234:5;;24224:7;:15;24216:47;;;;;;;12096:2:1;24216:47:0;;;12078:21:1;12135:2;12115:18;;;12108:30;12174:21;12154:18;;;12147:49;12213:18;;24216:47:0;11894:343:1;24216:47:0;24708:18:::1;::::0;;;:9:::1;:18;::::0;;;;;;;24727:10:::1;24708:30:::0;;;;;;;;36965:7;;36974;;24697:41;::::1;;24675:111;;;::::0;::::1;::::0;;18986:2:1;24675:111:0::1;::::0;::::1;18968:21:1::0;19025:2;19005:18;;;18998:30;19064:22;19044:18;;;19037:50;19104:18;;24675:111:0::1;18784:344:1::0;24675:111:0::1;37005:7:::2;24359:1;24349:7;:11;24341:56;;;::::0;::::2;::::0;;16813:2:1;24341:56:0::2;::::0;::::2;16795:21:1::0;;;16832:18;;;16825:30;16891:34;16871:18;;;16864:62;16943:18;;24341:56:0::2;16611:356:1::0;24341:56:0::2;37038:8:::0;24083:24:::3;::::0;::::3;24075:64;;;::::0;::::3;::::0;;12795:2:1;24075:64:0::3;::::0;::::3;12777:21:1::0;12834:2;12814:18;;;12807:30;12873:29;12853:18;;;12846:57;12920:18;;24075:64:0::3;12593:351:1::0;24075:64:0::3;37107:37:::4;37117:7;37126;37135:8;37107:9;:37::i;:::-;37155:18;37176::::0;;;:9:::4;:18;::::0;;;;;;;37195:10:::4;37176:30:::0;;;;;;;;37098:46;;-1:-1:-1;37155:18:0;37176:40:::4;::::0;37209:7;;37176:40:::4;:::i;:::-;37227:18;::::0;;;:9:::4;:18;::::0;;;;;;;37246:10:::4;37227:30:::0;;;;;;;;:43;;;;-1:-1:-1;36783:495:0;;;-1:-1:-1;;;;;;;36783:495:0:o;19812:201::-;18792:13;:11;:13::i;:::-;19901:22:::1;::::0;::::1;19893:73;;;::::0;::::1;::::0;;19335:2:1;19893:73:0::1;::::0;::::1;19317:21:1::0;19374:2;19354:18;;;19347:30;19413:34;19393:18;;;19386:62;19484:8;19464:18;;;19457:36;19510:19;;19893:73:0::1;19133:402:1::0;19893:73:0::1;19977:28;19996:8;19977:18;:28::i;:::-;19812:201:::0;:::o;19071:132::-;18952:7;18979:6;19135:23;18979:6;4287:10;19135:23;19127:68;;;;;;;19742:2:1;19127:68:0;;;19724:21:1;;;19761:18;;;19754:30;19820:34;19800:18;;;19793:62;19872:18;;19127:68:0;19540:356:1;29575:230:0;29667:14;29766:17;;;:8;:17;;;;;:31;;;;29721:29;;;;;:76;;29766:31;29721:76;:::i;27119:1197::-;27246:17;27276:18;27297:24;27313:7;27297:15;:24::i;:::-;27276:45;;27353:1;27340:10;:14;27332:40;;;;;;;20103:2:1;27332:40:0;;;20085:21:1;20142:2;20122:18;;;20115:30;20181:15;20161:18;;;20154:43;20214:18;;27332:40:0;19901:337:1;27332:40:0;27405:10;27391;:24;;27383:62;;;;;;;20445:2:1;27383:62:0;;;20427:21:1;20484:2;20464:18;;;20457:30;20523:27;20503:18;;;20496:55;20568:18;;27383:62:0;20243:349:1;27383:62:0;27485:10;27463:19;27485:10;27476:6;27463:19;:::i;:::-;:32;27456:40;;;;:::i;:::-;27507:17;27527;;;:8;:17;;;;;;27596:10;27573:19;:10;27586:6;27573:19;:::i;:::-;27572:34;;;;:::i;:::-;27555:51;;27617:28;27680:6;27670;27649:4;:18;;;:27;;;;:::i;:::-;27648:38;;;;:::i;:::-;27617:69;;27697:26;27756:6;27746;27727:4;:16;;;:25;;;;:::i;:::-;27726:36;;;;:::i;:::-;27697:65;;27793:18;27773:4;:16;;;:38;;;;;;;:::i;:::-;;;;;;;;27844:20;27822:4;:18;;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;;27912:10:0;;;;27937:14;;27912:10;27966:14;;;27995:15;;;;27887:226;;27912:10;;;27937:14;27966;28025:18;28058:20;28093:9;27887:10;:226::i;:::-;27875:238;-1:-1:-1;28129:179:0;;;28263:10;28129:179;28153:7;27875:238;28199:24;28153:7;28199:15;:24::i;:::-;28129:179;;;21017:25:1;;;21073:2;21058:18;;21051:34;;;;21101:18;;;21094:34;21159:2;21144:18;;21137:34;;;21004:3;20989:19;28129:179:0;;;;;;;27265:1051;;;;;27119:1197;;;;;:::o;31293:267::-;31389:7;;;31440:92;31464:6;:13;31460:1;:17;31440:92;;;31511:6;31518:1;31511:9;;;;;;;;:::i;:::-;;;;;;;31505:3;:15;;;;:::i;:::-;31499:21;-1:-1:-1;31479:3:0;;;;:::i;:::-;;;;31440:92;;;-1:-1:-1;31549:3:0;31293:267;-1:-1:-1;;31293:267:0:o;17059:540::-;16290:46;;;;;:23;11815:15:1;;;16290:46:0;;;11797:34:1;16330:4:0;11847:18:1;;;11840:43;17191:6:0;;17199:8;;17209:7;;;;16290:23;;;;;11709:18:1;;16290:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;16268:119;;;;;;;21384:2:1;16268:119:0;;;21366:21:1;21423:2;21403:18;;;21396:30;21462:14;21442:18;;;21435:42;21494:18;;16268:119:0;21182:336:1;16268:119:0;17247:1:::1;17237:7;:11;17229:20;;;::::0;::::1;;17260:18;17281:35;17294:6;17310:4;17281:12;:35::i;:::-;17327:60;::::0;;;;:26:::1;21804:15:1::0;;;17327:60:0::1;::::0;::::1;21786:34:1::0;17372:4:0::1;21836:18:1::0;;;21829:43;21888:18;;;21881:34;;;17260:56:0;;-1:-1:-1;17327:26:0;;::::1;::::0;::::1;::::0;21698:18:1;;17327:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;17403:37:0::1;::::0;;22410:25:1;;;22454:42;22532:15;;;22527:2;22512:18;;22505:43;22584:15;;22564:18;;;22557:43;17403:37:0;;::::1;::::0;;;;22398:2:1;17403:37:0;;::::1;17499:35;17512:6;17528:4;17499:12;:35::i;:::-;17474:20;17487:7:::0;17474:10;:20:::1;:::i;:::-;17473:61;17451:140;;;::::0;::::1;::::0;;22813:2:1;17451:140:0::1;::::0;::::1;22795:21:1::0;22852:2;22832:18;;;22825:30;22891:31;22871:18;;;22864:59;22940:18;;17451:140:0::1;22611:353:1::0;17451:140:0::1;17218:381;17059:540:::0;;;;;;:::o;35346:175::-;35419:22;35434:6;35419:14;:22::i;:::-;:51;;;;;35445:25;35459:10;35445:13;:25::i;:::-;35415:99;;;35487:15;35494:7;35487:6;:15::i;:::-;35346:175;;:::o;28349:1218::-;28858:14;28841:6;27011:26;27030:6;27011:18;:26::i;:::-;27003:61;;;;;;;23171:2:1;27003:61:0;;;23153:21:1;23210:2;23190:18;;;23183:30;23249:24;23229:18;;;23222:52;23291:18;;27003:61:0;22969:346:1;27003:61:0;28921:11:::1;28907:10;:25;;28885:111;;;::::0;::::1;::::0;;23522:2:1;28885:111:0::1;::::0;::::1;23504:21:1::0;23561:2;23541:18;;;23534:30;23600:34;23580:18;;;23573:62;23671:6;23651:18;;;23644:34;23695:19;;28885:111:0::1;23320:400:1::0;28885:111:0::1;29054:189;;;;;;;;29073:10;29054:189;;;;29098:10;29054:189;;;;29123:11;29054:189;;;;29149:12;29054:189;;;;29176:14;29054:189;;;;29205:6;29054:189;;;;;;29226:6;29054:189;;;;::::0;29036:8:::1;:15;29045:5;;29036:15;;;;;;;;;;;:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29254:7;:15;29262:6;29254:15;;;;;;;;;;;;;;;29275:5;;29254:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29499:6;29297:219;;29346:6;29297:219;;;29326:5;;29367:10;29392;29417:11;29443:12;29470:14;29297:219;;;;;;;;;;24012:25:1::0;;;24068:2;24053:18;;24046:34;;;;24111:2;24096:18;;24089:34;;;;24154:2;24139:18;;24132:34;24197:3;24182:19;;24175:35;24241:3;24226:19;;24219:35;23999:3;23984:19;;23725:535;29297:219:0::1;;;;;;;;29536:5;::::0;;;-1:-1:-1;29536:5:0;;29552::::1;:7;29536:5:::0;29552:7:::1;:::i;:::-;;;;;;28349:1218:::0;;;;;;;;;;:::o;31625:261::-;31732:4;;31754:102;31778:4;:11;31774:1;:15;31754:102;;;31826:5;31815:16;;:4;31820:1;31815:7;;;;;;;;:::i;:::-;;;;;;;:16;;;31811:33;;31840:4;31833:11;;;;;31811:33;31791:3;;;;:::i;:::-;;;;31754:102;;;-1:-1:-1;31873:5:0;;31625:261;-1:-1:-1;;;31625:261:0:o;29925:419::-;30040:25;30102:2;30087:4;:11;:17;30083:34;;-1:-1:-1;30113:4:0;30106:11;;30083:34;30150:2;30136:4;:11;:16;30128:52;;;;;;;24467:2:1;30128:52:0;;;24449:21:1;24506:2;24486:18;;;24479:30;24545:25;24525:18;;;24518:53;24588:18;;30128:52:0;24265:347:1;30128:52:0;30216:2;30202:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30202:17:0;;30191:28;;30235:9;30230:81;30254:2;30250:1;:6;30230:81;;;30292:4;30297:1;30292:7;;;;;;;;:::i;:::-;;;;;;;30278:8;30287:1;30278:11;;;;;;;;:::i;:::-;;;;;;;;;;:21;30258:3;;;;:::i;:::-;;;;30230:81;;20173:191;20247:16;20266:6;;;20283:17;;;;;;;;;;20316:40;;20266:6;;;;;;;20316:40;;20247:16;20316:40;20236:128;20173:191;:::o;16415:449::-;16543:18;16564:35;16577:6;16593:4;16564:12;:35::i;:::-;16615:38;;;22410:25:1;;;22454:42;22532:15;;;22527:2;22512:18;;22505:43;22584:15;;22564:18;;;22557:43;16615:38:0;;16543:56;;-1:-1:-1;16615:38:0;;;;;;22398:2:1;16615:38:0;;;16664:41;;;;;:22;13493:55:1;;;16664:41:0;;;13475:74:1;13565:18;;;13558:34;;;16664:22:0;;;;;13448:18:1;;16664:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16789:10;16777:7;16739:35;16752:6;16768:4;16739:12;:35::i;:::-;:45;;;;:::i;:::-;16738:61;16716:140;;;;;;;22813:2:1;16716:140:0;;;22795:21:1;22852:2;22832:18;;;22825:30;22891:31;22871:18;;;22864:59;22940:18;;16716:140:0;22611:353:1;16716:140:0;16532:332;16415:449;;;:::o;16872:179::-;17010:33;;;;;:23;937:55:1;;;17010:33:0;;;919:74:1;16978:7:0;;17010:23;;;;;;892:18:1;;17010:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17003:40;16872:179;-1:-1:-1;;;16872:179:0:o;196:196:1:-;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:186::-;456:6;509:2;497:9;488:7;484:23;480:32;477:52;;;525:1;522;515:12;477:52;548:29;567:9;548:29;:::i;588:180::-;647:6;700:2;688:9;679:7;675:23;671:32;668:52;;;716:1;713;706:12;668:52;-1:-1:-1;739:23:1;;588:180;-1:-1:-1;588:180:1:o;1004:254::-;1072:6;1080;1133:2;1121:9;1112:7;1108:23;1104:32;1101:52;;;1149:1;1146;1139:12;1101:52;1185:9;1172:23;1162:33;;1214:38;1248:2;1237:9;1233:18;1214:38;:::i;:::-;1204:48;;1004:254;;;;;:::o;1455:367::-;1518:8;1528:6;1582:3;1575:4;1567:6;1563:17;1559:27;1549:55;;1600:1;1597;1590:12;1549:55;-1:-1:-1;1623:20:1;;1666:18;1655:30;;1652:50;;;1698:1;1695;1688:12;1652:50;1735:4;1727:6;1723:17;1711:29;;1795:3;1788:4;1778:6;1775:1;1771:14;1763:6;1759:27;1755:38;1752:47;1749:67;;;1812:1;1809;1802:12;1749:67;1455:367;;;;;:::o;1827:1762::-;2066:6;2074;2082;2090;2098;2106;2114;2122;2130;2138;2146:7;2200:3;2188:9;2179:7;2175:23;2171:33;2168:53;;;2217:1;2214;2207:12;2168:53;2240:29;2259:9;2240:29;:::i;:::-;2230:39;;2288:18;2355:2;2349;2338:9;2334:18;2321:32;2318:40;2315:60;;;2371:1;2368;2361:12;2315:60;2410:96;2498:7;2491:2;2480:9;2476:18;2463:32;2452:9;2448:48;2410:96;:::i;:::-;2525:8;;-1:-1:-1;2552:8:1;-1:-1:-1;2603:2:1;2588:18;;2575:32;2572:40;-1:-1:-1;2569:60:1;;;2625:1;2622;2615:12;2569:60;2664:96;2752:7;2745:2;2734:9;2730:18;2717:32;2706:9;2702:48;2664:96;:::i;:::-;2779:8;;-1:-1:-1;2806:8:1;-1:-1:-1;2857:2:1;2842:18;;2829:32;2826:40;-1:-1:-1;2823:60:1;;;2879:1;2876;2869:12;2823:60;2918:96;3006:7;2999:2;2988:9;2984:18;2971:32;2960:9;2956:48;2918:96;:::i;:::-;3033:8;;-1:-1:-1;3060:8:1;-1:-1:-1;3111:3:1;3096:19;;3083:33;3080:41;-1:-1:-1;3077:61:1;;;3134:1;3131;3124:12;3077:61;3173:97;3262:7;3254:3;3243:9;3239:19;3226:33;3215:9;3211:49;3173:97;:::i;:::-;3289:8;;-1:-1:-1;3316:8:1;-1:-1:-1;3367:3:1;3352:19;;3339:33;3336:41;-1:-1:-1;3333:61:1;;;3390:1;3387;3380:12;3333:61;;3430:97;3519:7;3511:3;3500:9;3496:19;3483:33;3472:9;3468:49;3430:97;:::i;:::-;3546:8;3536:18;;3574:9;3563:20;;;;1827:1762;;;;;;;;;;;;;;:::o;3594:184::-;3646:77;3643:1;3636:88;3743:4;3740:1;3733:15;3767:4;3764:1;3757:15;3783:334;3854:2;3848:9;3910:2;3900:13;;3915:66;3896:86;3884:99;;4013:18;3998:34;;4034:22;;;3995:62;3992:88;;;4060:18;;:::i;:::-;4096:2;4089:22;3783:334;;-1:-1:-1;3783:334:1:o;4122:183::-;4182:4;4215:18;4207:6;4204:30;4201:56;;;4237:18;;:::i;:::-;-1:-1:-1;4282:1:1;4278:14;4294:4;4274:25;;4122:183::o;4310:971::-;4403:6;4411;4464:2;4452:9;4443:7;4439:23;4435:32;4432:52;;;4480:1;4477;4470:12;4432:52;4503:29;4522:9;4503:29;:::i;:::-;4493:39;;4551:2;4604;4593:9;4589:18;4576:32;4631:18;4623:6;4620:30;4617:50;;;4663:1;4660;4653:12;4617:50;4686:22;;4739:4;4731:13;;4727:27;-1:-1:-1;4717:55:1;;4768:1;4765;4758:12;4717:55;4804:2;4791:16;4827:60;4843:43;4883:2;4843:43;:::i;:::-;4827:60;:::i;:::-;4921:15;;;5003:1;4999:10;;;;4991:19;;4987:28;;;4952:12;;;;5027:19;;;5024:39;;;5059:1;5056;5049:12;5024:39;5083:11;;;;5103:148;5119:6;5114:3;5111:15;5103:148;;;5185:23;5204:3;5185:23;:::i;:::-;5173:36;;5136:12;;;;5229;;;;5103:148;;;5270:5;5260:15;;;;;;;4310:971;;;;;:::o;5286:1054::-;5343:3;5381:5;5375:12;5408:6;5403:3;5396:19;5434:4;5463:2;5458:3;5454:12;5447:19;;5500:2;5493:5;5489:14;5521:1;5531:784;5545:6;5542:1;5539:13;5531:784;;;5604:13;;5642:9;;5630:22;;5692:11;;;5686:18;5672:12;;;5665:40;5728:4;5772:11;;;5766:18;5752:12;;;5745:40;5808:4;5852:11;;;5846:18;5832:12;;;5825:40;5888:4;5932:11;;;5926:18;5912:12;;;5905:40;5968:4;6011:11;;;6005:18;6046:42;6122:21;;;6108:12;;;6101:43;;;;6167:4;6215:11;;;6209:18;6205:27;6191:12;;;6184:49;6262:4;6253:14;;;;6290:15;;;;5567:1;5560:9;5531:784;;;-1:-1:-1;6331:3:1;;5286:1054;-1:-1:-1;;;;;5286:1054:1:o;6345:435::-;6398:3;6436:5;6430:12;6463:6;6458:3;6451:19;6489:4;6518:2;6513:3;6509:12;6502:19;;6555:2;6548:5;6544:14;6576:1;6586:169;6600:6;6597:1;6594:13;6586:169;;;6661:13;;6649:26;;6695:12;;;;6730:15;;;;6622:1;6615:9;6586:169;;6785:513;7086:2;7075:9;7068:21;7049:4;7112:60;7168:2;7157:9;7153:18;7145:6;7112:60;:::i;:::-;7220:9;7212:6;7208:22;7203:2;7192:9;7188:18;7181:50;7248:44;7285:6;7277;7248:44;:::i;7303:891::-;7387:6;7418:2;7461;7449:9;7440:7;7436:23;7432:32;7429:52;;;7477:1;7474;7467:12;7429:52;7517:9;7504:23;7550:18;7542:6;7539:30;7536:50;;;7582:1;7579;7572:12;7536:50;7605:22;;7658:4;7650:13;;7646:27;-1:-1:-1;7636:55:1;;7687:1;7684;7677:12;7636:55;7723:2;7710:16;7746:60;7762:43;7802:2;7762:43;:::i;7746:60::-;7840:15;;;7922:1;7918:10;;;;7910:19;;7906:28;;;7871:12;;;;7946:19;;;7943:39;;;7978:1;7975;7968:12;7943:39;8002:11;;;;8022:142;8038:6;8033:3;8030:15;8022:142;;;8104:17;;8092:30;;8055:12;;;;8142;;;;8022:142;;;8183:5;7303:891;-1:-1:-1;;;;;;;7303:891:1:o;8199:309::-;8422:2;8411:9;8404:21;8385:4;8442:60;8498:2;8487:9;8483:18;8475:6;8442:60;:::i;8513:261::-;8692:2;8681:9;8674:21;8655:4;8712:56;8764:2;8753:9;8749:18;8741:6;8712:56;:::i;8779:322::-;8856:6;8864;8872;8925:2;8913:9;8904:7;8900:23;8896:32;8893:52;;;8941:1;8938;8931:12;8893:52;8977:9;8964:23;8954:33;;9034:2;9023:9;9019:18;9006:32;8996:42;;9057:38;9091:2;9080:9;9076:18;9057:38;:::i;:::-;9047:48;;8779:322;;;;;:::o;9106:535::-;9210:6;9218;9226;9234;9242;9250;9303:3;9291:9;9282:7;9278:23;9274:33;9271:53;;;9320:1;9317;9310:12;9271:53;9343:29;9362:9;9343:29;:::i;:::-;9333:39;;9419:2;9408:9;9404:18;9391:32;9381:42;;9470:2;9459:9;9455:18;9442:32;9432:42;;9521:2;9510:9;9506:18;9493:32;9483:42;;9572:3;9561:9;9557:19;9544:33;9534:43;;9596:39;9630:3;9619:9;9615:19;9596:39;:::i;:::-;9586:49;;9106:535;;;;;;;;:::o;9646:260::-;9714:6;9722;9775:2;9763:9;9754:7;9750:23;9746:32;9743:52;;;9791:1;9788;9781:12;9743:52;9814:29;9833:9;9814:29;:::i;:::-;9804:39;;9862:38;9896:2;9885:9;9881:18;9862:38;:::i;9911:254::-;9979:6;9987;10040:2;10028:9;10019:7;10015:23;10011:32;10008:52;;;10056:1;10053;10046:12;10008:52;10079:29;10098:9;10079:29;:::i;:::-;10069:39;10155:2;10140:18;;;;10127:32;;-1:-1:-1;;;9911:254:1:o;13603:184::-;13673:6;13726:2;13714:9;13705:7;13701:23;13697:32;13694:52;;;13742:1;13739;13732:12;13694:52;-1:-1:-1;13765:16:1;;13603:184;-1:-1:-1;13603:184:1:o;15195:::-;15247:77;15244:1;15237:88;15344:4;15341:1;15334:15;15368:4;15365:1;15358:15;15384:168;15457:9;;;15488;;15505:15;;;15499:22;;15485:37;15475:71;;15526:18;;:::i;15557:184::-;15609:77;15606:1;15599:88;15706:4;15703:1;15696:15;15730:4;15727:1;15720:15;15746:195;15785:3;15816:66;15809:5;15806:77;15803:103;;15886:18;;:::i;:::-;-1:-1:-1;15933:1:1;15922:13;;15746:195::o;15946:128::-;16013:9;;;16034:11;;;16031:37;;;16048:18;;:::i;16332:274::-;16372:1;16398;16388:189;;16433:77;16430:1;16423:88;16534:4;16531:1;16524:15;16562:4;16559:1;16552:15;16388:189;-1:-1:-1;16591:9:1;;16332:274::o;17319:125::-;17384:9;;;17405:10;;;17402:36;;;17418:18;;:::i;20597:184::-;20649:77;20646:1;20639:88;20746:4;20743:1;20736:15;20770:4;20767:1;20760:15;21926:277;21993:6;22046:2;22034:9;22025:7;22021:23;22017:32;22014:52;;;22062:1;22059;22052:12;22014:52;22094:9;22088:16;22147:5;22140:13;22133:21;22126:5;22123:32;22113:60;;22169:1;22166;22159:12
Swarm Source
ipfs://bdcc7da990c7aaa04bba809e8e04013ff7016a5e76cf8e89dfc90884b5eb4a2b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.