Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 111 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Update Metadata | 23882644 | 90 days ago | IN | 0 ETH | 0.00000275 | ||||
| Create Token | 23875534 | 91 days ago | IN | 0 ETH | 0.0043105 | ||||
| Update Metadata | 23791786 | 103 days ago | IN | 0 ETH | 0.00003162 | ||||
| Update Metadata | 23791786 | 103 days ago | IN | 0 ETH | 0.00003608 | ||||
| Update Metadata | 23785252 | 104 days ago | IN | 0 ETH | 0.00001252 | ||||
| Update Metadata | 23784792 | 104 days ago | IN | 0 ETH | 0.00001103 | ||||
| Update Metadata | 23784790 | 104 days ago | IN | 0 ETH | 0.00001515 | ||||
| Create Token | 23784655 | 104 days ago | IN | 0 ETH | 0.00126827 | ||||
| Create Token | 23784646 | 104 days ago | IN | 0 ETH | 0.00122315 | ||||
| Buy Tokens | 23784191 | 104 days ago | IN | 0.00000021 ETH | 0.00020218 | ||||
| Create Token | 23784189 | 104 days ago | IN | 0 ETH | 0.00338117 | ||||
| Update Metadata | 23713971 | 114 days ago | IN | 0 ETH | 0.00000344 | ||||
| Withdraw | 23706870 | 115 days ago | IN | 0 ETH | 0.0000099 | ||||
| Buy Tokens | 23706869 | 115 days ago | IN | 41 wei | 0.00001565 | ||||
| Buy Tokens | 23706866 | 115 days ago | IN | 1.27162339 ETH | 0.00001911 | ||||
| Buy Tokens | 23706859 | 115 days ago | IN | 0.3838 ETH | 0.00001886 | ||||
| Buy Tokens | 23706855 | 115 days ago | IN | 0.28279999 ETH | 0.00002075 | ||||
| Buy Tokens | 23706837 | 115 days ago | IN | 0.01781235 ETH | 0.00001516 | ||||
| Buy Tokens | 23706832 | 115 days ago | IN | 0.0202 ETH | 0.00001631 | ||||
| Buy Tokens | 23706821 | 115 days ago | IN | 0.11109999 ETH | 0.00001829 | ||||
| Buy Tokens | 23706816 | 115 days ago | IN | 0.08584999 ETH | 0.00001843 | ||||
| Buy Tokens | 23706812 | 115 days ago | IN | 0.03130999 ETH | 0.00001993 | ||||
| Buy Tokens | 23706809 | 115 days ago | IN | 0.03131 ETH | 0.00001923 | ||||
| Buy Tokens | 23706805 | 115 days ago | IN | 0.04444 ETH | 0.00001857 | ||||
| Buy Tokens | 23706799 | 115 days ago | IN | 0.10907999 ETH | 0.00001797 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 23875534 | 91 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23784655 | 104 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23784646 | 104 days ago | Contract Creation | 0 ETH | |||
| Transfer | 23784191 | 104 days ago | 0 ETH | ||||
| 0x60806040 | 23784189 | 104 days ago | Contract Creation | 0 ETH | |||
| Transfer | 23706870 | 115 days ago | 5.11448561 ETH | ||||
| Transfer | 23706870 | 115 days ago | 0.13459172 ETH | ||||
| Transfer | 23706870 | 115 days ago | 0.13459172 ETH | ||||
| Transfer | 23706866 | 115 days ago | 0.01259033 ETH | ||||
| Transfer | 23706859 | 115 days ago | 0.0038 ETH | ||||
| Transfer | 23706855 | 115 days ago | 0.00279999 ETH | ||||
| Transfer | 23706837 | 115 days ago | 0.00017635 ETH | ||||
| Transfer | 23706832 | 115 days ago | 0.0002 ETH | ||||
| Transfer | 23706821 | 115 days ago | 0.00109999 ETH | ||||
| Transfer | 23706816 | 115 days ago | 0.00084999 ETH | ||||
| Transfer | 23706812 | 115 days ago | 0.00030999 ETH | ||||
| Transfer | 23706809 | 115 days ago | 0.00031 ETH | ||||
| Transfer | 23706805 | 115 days ago | 0.00044 ETH | ||||
| Transfer | 23706799 | 115 days ago | 0.00107999 ETH | ||||
| Transfer | 23706796 | 115 days ago | 0.00056999 ETH | ||||
| Transfer | 23706790 | 115 days ago | 0.0007 ETH | ||||
| Transfer | 23706786 | 115 days ago | 0.0008 ETH | ||||
| Transfer | 23706782 | 115 days ago | 0.00107999 ETH | ||||
| Transfer | 23706778 | 115 days ago | 0.0008 ETH | ||||
| Transfer | 23706765 | 115 days ago | 0.00079999 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Factory
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-08-29
*/
/**
* @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;
}
}
/**
* @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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_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);
}
}
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);
function updateMetadata(string memory name_, string memory symbol_)
external;
/**
* @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);
}
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts@4.8.2/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
pragma solidity 0.8.26;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
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;
address _factory;
/**
* @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_,
address factory_
) {
_name = name_;
_symbol = symbol_;
_factory = factory_;
}
/**
* @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 updateMetadata(string memory name_, string memory symbol_)
public
virtual
{
require(msg.sender == _factory, "only factory can call this function");
_name = name_;
_symbol = symbol_;
}
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;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_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;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_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;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_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 {}
}
//SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
// contract Token is ERC20, Ownable {
// constructor(
// string memory _name,
// string memory _symbol,
// uint256 _totalSupply,
// address _factory
// ) ERC20(_name, _symbol,_factory) {
// _mint(msg.sender, _totalSupply);
// }
// }
interface IUniswapV2Factory {
function getPair(address tokenA, address tokenB)
external
view
returns (address);
}
contract GDMToken is ERC20, Ownable {
address factory;
constructor(
string memory _name,
string memory _symbol,
uint256 _totalSupply,
address _factory
) ERC20(_name, _symbol, _factory) {
_mint(msg.sender, _totalSupply);
factory = _factory;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal override {
address uniswapFactory = Factory(payable(factory)).v2Factory();
address weth = Factory(payable(factory)).WETH();
address pair =
IUniswapV2Factory(uniswapFactory).getPair(
address(this),
weth
);
if (sender == pair || recipient == pair) {
address feeRecipient = Factory(payable(factory))
.tokenFeeRecipient();
uint256 feeBasisPoints = Factory(payable(factory)).feeBasisPoints();
uint256 fee = (amount * feeBasisPoints) / 10_000;
uint256 remaining = amount - fee;
super._transfer(sender, feeRecipient, fee);
super._transfer(sender, recipient, remaining);
} else {
super._transfer(sender, recipient, amount);
}
}
}
contract Factory is Ownable {
error InvalidMaxSupplyPercentage();
error TokenDoesNotExist();
error ZeroTokenAmount();
error BondingCurveCompleted();
error ExceedsAllowedTokenPurchase();
error InsufficientETH();
error BondingCurveNotCompleted();
error FeeTooHigh();
address[] public tokenAddress;
uint256 tokenCount;
uint256 public initialVirtualEthReserves = 1900000000000000000; //W.R.T SOLANA
uint256 public initialRealTokenReserves = 793100000 * 10**18;
uint256 public feeBasisPoints = 100; // 1%
uint256 public creatorFees= 250;
address public feeRecipient;
address public tokenFeeRecipient;
address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public v2Factory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
struct BondingCurve {
uint256 virtualTokenReserves;
uint256 virtualEthReserves;
uint256 realTokenReserves;
uint256 realEthReserves;
uint256 _totalSupply;
uint8 maxSupplyPercentage;
bool isCompleted;
}
mapping(address => BondingCurve) public bondingCurve;
mapping(address => address) public tokenCreator;
mapping(address => bool) public isToken;
receive() external payable {}
constructor(address _feeRecipient, address _tokenFeeRecipient) {
feeRecipient = _feeRecipient;
tokenFeeRecipient = _tokenFeeRecipient;
}
event TokenCreated(address indexed _creator, address indexed _tokenAddress);
event TokensPurchased(
address indexed _buyer,
address indexed _tokenAddress,
uint256 indexed _amout
);
event TokensSold(
address indexed _seller,
address indexed _tokenAddress,
uint256 indexed _amout
);
event Withdraw(
address indexed _tokenAddress,
uint256 indexed _ethAmount,
uint256 indexed _amout,
uint256 _creatorFee,
uint256 _adminFee
);
function createToken(
string memory _name,
string memory _symbol,
uint8 _maxSupplyPercentage
) external {
if (_maxSupplyPercentage == 0 || _maxSupplyPercentage > 100) {
revert InvalidMaxSupplyPercentage();
}
GDMToken token = new GDMToken(
_name,
_symbol,
1000000000 ether,
address(this)
);
BondingCurve storage _bondingCurve = bondingCurve[address(token)];
_bondingCurve._totalSupply = 1000000000 ether;
_bondingCurve.maxSupplyPercentage = _maxSupplyPercentage;
_bondingCurve.virtualTokenReserves = 1073000191 * 10**18;
_bondingCurve.realTokenReserves = initialRealTokenReserves;
_bondingCurve.virtualEthReserves = initialVirtualEthReserves;
isToken[address(token)] = true;
tokenCreator[address(token)] = msg.sender;
tokenAddress.push(address(token));
tokenCount++;
emit TokenCreated(msg.sender, address(token));
}
function updateMetadata(
string memory _name,
string memory _symbol,
address _token
) external onlyOwner {
IERC20(_token).updateMetadata(_name, _symbol);
}
function buyTokens(address _token, uint256 _amount) external payable {
if (!isToken[_token]) revert TokenDoesNotExist();
if (_amount == 0) revert ZeroTokenAmount();
if (bondingCurve[_token].isCompleted) revert BondingCurveCompleted();
uint256 allowedToBuy = (initialRealTokenReserves *
bondingCurve[_token].maxSupplyPercentage) / 100;
if (IERC20(_token).balanceOf(msg.sender) + _amount > allowedToBuy)
revert ExceedsAllowedTokenPurchase();
uint256 ethToBuy = buyQuote(_token, _amount);
uint256 fee = (ethToBuy * feeBasisPoints) / 10_000;
if (msg.value < ethToBuy + fee) revert InsufficientETH();
bondingCurve[_token].virtualTokenReserves -= _amount;
bondingCurve[_token].realTokenReserves -= _amount;
bondingCurve[_token].virtualEthReserves += ethToBuy;
bondingCurve[_token].realEthReserves += ethToBuy;
if (bondingCurve[_token].realTokenReserves == 0) {
bondingCurve[_token].isCompleted = true;
}
payable(feeRecipient).transfer(fee);
IERC20(_token).transfer(msg.sender, _amount);
emit TokensPurchased(msg.sender, _token, _amount);
}
function sellTokens(address _token, uint256 _amount) external {
if (!isToken[_token]) revert TokenDoesNotExist();
if (_amount == 0) revert ZeroTokenAmount();
if (bondingCurve[_token].isCompleted) revert BondingCurveCompleted();
uint256 ethToReceive = sellQuote(_token, _amount);
uint256 fee = (ethToReceive * feeBasisPoints) / 10_000;
IERC20(_token).transferFrom(msg.sender, address(this), _amount);
bondingCurve[_token].virtualTokenReserves += _amount;
bondingCurve[_token].realTokenReserves += _amount;
bondingCurve[_token].virtualEthReserves -= ethToReceive;
bondingCurve[_token].realEthReserves -= ethToReceive;
payable(feeRecipient).transfer(fee);
payable(msg.sender).transfer(ethToReceive - fee);
emit TokensSold(msg.sender, _token, _amount);
}
function withdraw(address _token) external onlyOwner {
if (!isToken[_token]) revert TokenDoesNotExist();
if (!bondingCurve[_token].isCompleted)
revert BondingCurveNotCompleted();
uint256 fee = (bondingCurve[_token].realEthReserves* creatorFees) / 10000;
uint256 ethToTransfer = bondingCurve[_token].realEthReserves-(fee*2);
uint256 tokensToTransfer = IERC20(_token).balanceOf(address(this));
bondingCurve[_token].virtualTokenReserves = 0;
bondingCurve[_token].virtualEthReserves = 0;
bondingCurve[_token].realEthReserves = 0;
payable(tokenCreator[_token]).transfer(fee);
payable(feeRecipient).transfer(fee);
payable(msg.sender).transfer(ethToTransfer);
IERC20(_token).transfer(msg.sender, tokensToTransfer);
emit Withdraw(_token, ethToTransfer, tokensToTransfer,fee,fee);
}
function buyQuote(address _token, uint256 _amount)
public
view
returns (uint256)
{
if (!isToken[_token]) revert TokenDoesNotExist();
uint256 virtualTokenReserves = bondingCurve[_token]
.virtualTokenReserves;
uint256 virtualEthReserves = bondingCurve[_token].virtualEthReserves;
uint256 k = virtualEthReserves * virtualTokenReserves;
uint256 ethOutput = (k / (virtualTokenReserves - _amount)) -
virtualEthReserves;
return ethOutput;
}
function buyQuoteWithFee(address _token, uint256 _amount)
public
view
returns (uint256)
{
if (!isToken[_token]) revert TokenDoesNotExist();
uint256 virtualTokenReserves = bondingCurve[_token]
.virtualTokenReserves;
uint256 virtualEthReserves = bondingCurve[_token].virtualEthReserves;
uint256 k = virtualEthReserves * virtualTokenReserves;
uint256 ethOutput = (k / (virtualTokenReserves - _amount)) -
virtualEthReserves;
uint256 fee = (ethOutput * feeBasisPoints) / 10_000;
return ethOutput + fee;
}
function sellQuote(address _token, uint256 _amount)
public
view
returns (uint256)
{
if (!isToken[_token]) revert TokenDoesNotExist();
uint256 virtualTokenReserves = bondingCurve[_token]
.virtualTokenReserves;
uint256 virtualEthReserves = bondingCurve[_token].virtualEthReserves;
uint256 k = virtualEthReserves * virtualTokenReserves;
uint256 ethOutput = virtualEthReserves -
1 -
(k / (virtualTokenReserves + _amount));
return ethOutput;
}
function sellQuoteWithFee(address _token, uint256 _amount)
public
view
returns (uint256)
{
if (!isToken[_token]) revert TokenDoesNotExist();
uint256 virtualTokenReserves = bondingCurve[_token]
.virtualTokenReserves;
uint256 virtualEthReserves = bondingCurve[_token].virtualEthReserves;
uint256 k = virtualEthReserves * virtualTokenReserves;
uint256 ethOutput = virtualEthReserves -
1 -
(k / (virtualTokenReserves + _amount));
uint256 fee = (ethOutput * feeBasisPoints) / 10_000;
return ethOutput + fee;
}
function calculateBuyFee(address _token, uint256 _amount)
external
view
returns (uint256)
{
if (!isToken[_token]) revert TokenDoesNotExist();
uint256 ethToBuy = buyQuote(_token, _amount);
uint256 fee = (ethToBuy * feeBasisPoints) / 10_000;
return fee;
}
function changeFeeRecipient(address _feeRecipient, address _tokenFeeRecipient) external onlyOwner {
feeRecipient = _feeRecipient;
tokenFeeRecipient = _tokenFeeRecipient;
}
function changeFeeBasisPoints(uint256 _feeBasisPoints) external onlyOwner {
if (_feeBasisPoints > 500) revert FeeTooHigh();
feeBasisPoints = _feeBasisPoints;
}
function changeCreatorFees(uint256 _creatorFees) external onlyOwner {
if (_creatorFees > 5000) revert FeeTooHigh();
creatorFees = _creatorFees;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"address","name":"_tokenFeeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BondingCurveCompleted","type":"error"},{"inputs":[],"name":"BondingCurveNotCompleted","type":"error"},{"inputs":[],"name":"ExceedsAllowedTokenPurchase","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InsufficientETH","type":"error"},{"inputs":[],"name":"InvalidMaxSupplyPercentage","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"inputs":[],"name":"ZeroTokenAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amout","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amout","type":"uint256"}],"name":"TokensSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_amout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_adminFee","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondingCurve","outputs":[{"internalType":"uint256","name":"virtualTokenReserves","type":"uint256"},{"internalType":"uint256","name":"virtualEthReserves","type":"uint256"},{"internalType":"uint256","name":"realTokenReserves","type":"uint256"},{"internalType":"uint256","name":"realEthReserves","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint8","name":"maxSupplyPercentage","type":"uint8"},{"internalType":"bool","name":"isCompleted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyQuoteWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creatorFees","type":"uint256"}],"name":"changeCreatorFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBasisPoints","type":"uint256"}],"name":"changeFeeBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"address","name":"_tokenFeeRecipient","type":"address"}],"name":"changeFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_maxSupplyPercentage","type":"uint8"}],"name":"createToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialRealTokenReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialVirtualEthReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sellQuoteWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sellTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_token","type":"address"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"v2Factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052671a5e27eef13e00006003556b029009752660ad62af800000600455606460055560fa60065573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100dd575f80fd5b50604051615e0f380380615e0f83398181016040528101906100ff91906102c8565b61011b6101106101a260201b60201c565b6101a960201b60201c565b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610306565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102978261026e565b9050919050565b6102a78161028d565b81146102b1575f80fd5b50565b5f815190506102c28161029e565b92915050565b5f80604083850312156102de576102dd61026a565b5b5f6102eb858286016102b4565b92505060206102fc858286016102b4565b9150509250929050565b615afc806103135f395ff3fe6080604052600436106101ba575f3560e01c80637465a004116100eb578063b4b57c3911610089578063d0c58e4811610063578063d0c58e4814610619578063dd0c265b1461065b578063e8a0aed314610683578063f2fde38b146106ab576101c1565b8063b4b57c391461059d578063b8606eef146105c7578063c464fe65146105f1576101c1565b806391eb09ce116100c557806391eb09ce146104e55780639e6b26ba1461050f578063aa05acec1461054b578063ad5c464814610573576101c1565b80637465a004146104695780638770d6a3146104915780638da5cb5b146104bb576101c1565b8063282fa9601161015857806351cff8d91161013257806351cff8d9146103c557806360aeb2ab146103ed5780636694ba6114610429578063715018a614610453576101c1565b8063282fa96014610323578063456954531461035f578063469048401461039b576101c1565b80631654aa14116101945780631654aa141461024557806319f373611461028157806323774af2146102bd57806326dccb37146102f9576101c1565b8063057e359a146101c55780630752881a1461020157806307b63c291461021d576101c1565b366101c157005b5f80fd5b3480156101d0575f80fd5b506101eb60048036038101906101e69190612800565b6106d3565b6040516101f8919061284d565b60405180910390f35b61021b60048036038101906102169190612800565b610852565b005b348015610228575f80fd5b50610243600480360381019061023e91906129a2565b610e63565b005b348015610250575f80fd5b5061026b60048036038101906102669190612800565b610f4c565b604051610278919061284d565b60405180910390f35b34801561028c575f80fd5b506102a760048036038101906102a29190612a2a565b611095565b6040516102b49190612a6f565b60405180910390f35b3480156102c8575f80fd5b506102e360048036038101906102de9190612a2a565b6110b2565b6040516102f09190612a97565b60405180910390f35b348015610304575f80fd5b5061030d6110e2565b60405161031a919061284d565b60405180910390f35b34801561032e575f80fd5b5061034960048036038101906103449190612800565b6110e8565b604051610356919061284d565b60405180910390f35b34801561036a575f80fd5b5061038560048036038101906103809190612800565b61119f565b604051610392919061284d565b60405180910390f35b3480156103a6575f80fd5b506103af6112f4565b6040516103bc9190612a97565b60405180910390f35b3480156103d0575f80fd5b506103eb60048036038101906103e69190612a2a565b611319565b005b3480156103f8575f80fd5b50610413600480360381019061040e9190612800565b6118b8565b604051610420919061284d565b60405180910390f35b348015610434575f80fd5b5061043d611a2b565b60405161044a919061284d565b60405180910390f35b34801561045e575f80fd5b50610467611a31565b005b348015610474575f80fd5b5061048f600480360381019061048a9190612ab0565b611ab8565b005b34801561049c575f80fd5b506104a5611b7a565b6040516104b29190612a97565b60405180910390f35b3480156104c6575f80fd5b506104cf611b9f565b6040516104dc9190612a97565b60405180910390f35b3480156104f0575f80fd5b506104f9611bc6565b604051610506919061284d565b60405180910390f35b34801561051a575f80fd5b5061053560048036038101906105309190612ab0565b611bcc565b6040516105429190612a97565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190612ab0565b611c07565b005b34801561057e575f80fd5b50610587611cc9565b6040516105949190612a97565b60405180910390f35b3480156105a8575f80fd5b506105b1611cee565b6040516105be9190612a97565b60405180910390f35b3480156105d2575f80fd5b506105db611d13565b6040516105e8919061284d565b60405180910390f35b3480156105fc575f80fd5b5061061760048036038101906106129190612800565b611d19565b005b348015610624575f80fd5b5061063f600480360381019061063a9190612a2a565b61216c565b6040516106529796959493929190612af6565b60405180910390f35b348015610666575f80fd5b50610681600480360381019061067c9190612b63565b6121c3565b005b34801561068e575f80fd5b506106a960048036038101906106a49190612bcb565b6122c3565b005b3480156106b6575f80fd5b506106d160048036038101906106cc9190612a2a565b612597565b005b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610754576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826107e89190612c80565b90505f85846107f79190612cc1565b826108029190612d21565b60018461080f9190612d51565b6108199190612d51565b90505f6127106005548361082d9190612c80565b6108379190612d21565b905080826108459190612cc1565b9550505050505092915050565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166108d2576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361090b576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff1615610990576040517f049183b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6064600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015f9054906101000a900460ff1660ff166004546109f09190612c80565b6109fa9190612d21565b905080828473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a379190612a97565b602060405180830381865afa158015610a52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a769190612d98565b610a809190612cc1565b1115610ab8576040517fef7ba6ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ac38484610f4c565b90505f61271060055483610ad79190612c80565b610ae19190612d21565b90508082610aef9190612cc1565b341015610b28576040517f6a12f10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254610b769190612d51565b9250508190555083600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f828254610bcc9190612d51565b9250508190555081600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254610c229190612cc1565b9250508190555081600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f828254610c789190612cc1565b925050819055505f600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015403610d20576001600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160016101000a81548160ff0219169083151502179055505b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610d84573d5f803e3d5ffd5b508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610dc0929190612dc3565b6020604051808303815f875af1158015610ddc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e009190612e14565b50838573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff9b4eb3e43eebbf559e9b96ceff1c786a7edab2938c7f5f80678197c2e0edba560405160405180910390a45050505050565b610e6b61268d565b73ffffffffffffffffffffffffffffffffffffffff16610e89611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690612e99565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166356ce0e6c84846040518363ffffffff1660e01b8152600401610f1a929190612f07565b5f604051808303815f87803b158015610f31575f80fd5b505af1158015610f43573d5f803e3d5ffd5b50505050505050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610fcd576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826110619190612c80565b90505f8286856110719190612d51565b8361107c9190612d21565b6110869190612d51565b90508094505050505092915050565b600d602052805f5260405f205f915054906101000a900460ff1681565b600c602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611169576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6111748484610f4c565b90505f612710600554836111889190612c80565b6111929190612d21565b9050809250505092915050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611220576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826112b49190612c80565b90505f85846112c39190612cc1565b826112ce9190612d21565b6001846112db9190612d51565b6112e59190612d51565b90508094505050505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61132161268d565b73ffffffffffffffffffffffffffffffffffffffff1661133f611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612e99565b60405180910390fd5b600d5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611415576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff16611499576040517fba4e145400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612710600654600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301546114eb9190612c80565b6114f59190612d21565b90505f6002826115059190612c80565b600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301546115509190612d51565b90505f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161158c9190612a97565b602060405180830381865afa1580156115a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cb9190612d98565b90505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030181905550600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561173a573d5f803e3d5ffd5b5060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561179f573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156117e3573d5f803e3d5ffd5b508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161181f929190612dc3565b6020604051808303815f875af115801561183b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185f9190612e14565b5080828573ffffffffffffffffffffffffffffffffffffffff167fe08737ac48a1dab4b1a46c7dc9398bd5bfc6d7ad6fabb7cd8caa254de14def3586876040516118aa929190612f3c565b60405180910390a450505050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611939576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826119cd9190612c80565b90505f8286856119dd9190612d51565b836119e89190612d21565b6119f29190612d51565b90505f61271060055483611a069190612c80565b611a109190612d21565b90508082611a1e9190612cc1565b9550505050505092915050565b60065481565b611a3961268d565b73ffffffffffffffffffffffffffffffffffffffff16611a57611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa490612e99565b60405180910390fd5b611ab65f612694565b565b611ac061268d565b73ffffffffffffffffffffffffffffffffffffffff16611ade611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90612e99565b60405180910390fd5b6101f4811115611b70576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060058190555050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b60018181548110611bdb575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c0f61268d565b73ffffffffffffffffffffffffffffffffffffffff16611c2d611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90612e99565b60405180910390fd5b611388811115611cbf576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060068190555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611d99576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103611dd2576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff1615611e57576040517f049183b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611e62838361119f565b90505f61271060055483611e769190612c80565b611e809190612d21565b90508373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611ebf93929190612f63565b6020604051808303815f875af1158015611edb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eff9190612e14565b5082600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254611f4e9190612cc1565b9250508190555082600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f828254611fa49190612cc1565b9250508190555081600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254611ffa9190612d51565b9250508190555081600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f8282546120509190612d51565b9250508190555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156120bb573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc82846120e29190612d51565b90811502906040515f60405180830381858888f1935050505015801561210a573d5f803e3d5ffd5b50828473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f481809cba951bfbd752234d0504d4719277804f87f6e0da1b5b486c80d808fe460405160405180910390a450505050565b600b602052805f5260405f205f91509050805f015490806001015490806002015490806003015490806004015490806005015f9054906101000a900460ff16908060050160019054906101000a900460ff16905087565b6121cb61268d565b73ffffffffffffffffffffffffffffffffffffffff166121e9611b9f565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690612e99565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f8160ff1614806122d7575060648160ff16115b1561230e576040517f3149226b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83836b033b2e3c9fd0803ce80000003060405161232b90612755565b6123389493929190612fda565b604051809103905ff080158015612351573d5f803e3d5ffd5b5090505f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506b033b2e3c9fd0803ce8000000816004018190555082816005015f6101000a81548160ff021916908360ff1602179055506b037790a0e8714009b49c0000815f0181905550600454816002018190555060035481600101819055506001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555033600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f8154809291906125319061302b565b91905055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813960405160405180910390a35050505050565b61259f61268d565b73ffffffffffffffffffffffffffffffffffffffff166125bd611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a90612e99565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612678906130e2565b60405180910390fd5b61268a81612694565b50565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129c68061310183390190565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61279c82612773565b9050919050565b6127ac81612792565b81146127b6575f80fd5b50565b5f813590506127c7816127a3565b92915050565b5f819050919050565b6127df816127cd565b81146127e9575f80fd5b50565b5f813590506127fa816127d6565b92915050565b5f80604083850312156128165761281561276b565b5b5f612823858286016127b9565b9250506020612834858286016127ec565b9150509250929050565b612847816127cd565b82525050565b5f6020820190506128605f83018461283e565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128b48261286e565b810181811067ffffffffffffffff821117156128d3576128d261287e565b5b80604052505050565b5f6128e5612762565b90506128f182826128ab565b919050565b5f67ffffffffffffffff8211156129105761290f61287e565b5b6129198261286e565b9050602081019050919050565b828183375f83830152505050565b5f612946612941846128f6565b6128dc565b9050828152602081018484840111156129625761296161286a565b5b61296d848285612926565b509392505050565b5f82601f83011261298957612988612866565b5b8135612999848260208601612934565b91505092915050565b5f805f606084860312156129b9576129b861276b565b5b5f84013567ffffffffffffffff8111156129d6576129d561276f565b5b6129e286828701612975565b935050602084013567ffffffffffffffff811115612a0357612a0261276f565b5b612a0f86828701612975565b9250506040612a20868287016127b9565b9150509250925092565b5f60208284031215612a3f57612a3e61276b565b5b5f612a4c848285016127b9565b91505092915050565b5f8115159050919050565b612a6981612a55565b82525050565b5f602082019050612a825f830184612a60565b92915050565b612a9181612792565b82525050565b5f602082019050612aaa5f830184612a88565b92915050565b5f60208284031215612ac557612ac461276b565b5b5f612ad2848285016127ec565b91505092915050565b5f60ff82169050919050565b612af081612adb565b82525050565b5f60e082019050612b095f83018a61283e565b612b16602083018961283e565b612b23604083018861283e565b612b30606083018761283e565b612b3d608083018661283e565b612b4a60a0830185612ae7565b612b5760c0830184612a60565b98975050505050505050565b5f8060408385031215612b7957612b7861276b565b5b5f612b86858286016127b9565b9250506020612b97858286016127b9565b9150509250929050565b612baa81612adb565b8114612bb4575f80fd5b50565b5f81359050612bc581612ba1565b92915050565b5f805f60608486031215612be257612be161276b565b5b5f84013567ffffffffffffffff811115612bff57612bfe61276f565b5b612c0b86828701612975565b935050602084013567ffffffffffffffff811115612c2c57612c2b61276f565b5b612c3886828701612975565b9250506040612c4986828701612bb7565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c8a826127cd565b9150612c95836127cd565b9250828202612ca3816127cd565b91508282048414831517612cba57612cb9612c53565b5b5092915050565b5f612ccb826127cd565b9150612cd6836127cd565b9250828201905080821115612cee57612ced612c53565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612d2b826127cd565b9150612d36836127cd565b925082612d4657612d45612cf4565b5b828204905092915050565b5f612d5b826127cd565b9150612d66836127cd565b9250828203905081811115612d7e57612d7d612c53565b5b92915050565b5f81519050612d92816127d6565b92915050565b5f60208284031215612dad57612dac61276b565b5b5f612dba84828501612d84565b91505092915050565b5f604082019050612dd65f830185612a88565b612de3602083018461283e565b9392505050565b612df381612a55565b8114612dfd575f80fd5b50565b5f81519050612e0e81612dea565b92915050565b5f60208284031215612e2957612e2861276b565b5b5f612e3684828501612e00565b91505092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612e83602083612e3f565b9150612e8e82612e4f565b602082019050919050565b5f6020820190508181035f830152612eb081612e77565b9050919050565b5f81519050919050565b8281835e5f83830152505050565b5f612ed982612eb7565b612ee38185612e3f565b9350612ef3818560208601612ec1565b612efc8161286e565b840191505092915050565b5f6040820190508181035f830152612f1f8185612ecf565b90508181036020830152612f338184612ecf565b90509392505050565b5f604082019050612f4f5f83018561283e565b612f5c602083018461283e565b9392505050565b5f606082019050612f765f830186612a88565b612f836020830185612a88565b612f90604083018461283e565b949350505050565b5f819050919050565b5f819050919050565b5f612fc4612fbf612fba84612f98565b612fa1565b6127cd565b9050919050565b612fd481612faa565b82525050565b5f6080820190508181035f830152612ff28187612ecf565b905081810360208301526130068186612ecf565b90506130156040830185612fcb565b6130226060830184612a88565b95945050505050565b5f613035826127cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361306757613066612c53565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6130cc602683612e3f565b91506130d782613072565b604082019050919050565b5f6020820190508181035f8301526130f9816130c0565b905091905056fe608060405234801561000f575f80fd5b506040516129c63803806129c683398181016040528101906100319190610514565b838382826003908161004391906107b4565b50816004908161005391906107b4565b508060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506100b36100a861010c60201b60201c565b61011360201b60201c565b6100c333836101d660201b60201c565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050610983565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023b906108dd565b60405180910390fd5b6102555f838361033060201b60201c565b8060025f8282546102669190610928565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610313919061096a565b60405180910390a361032c5f838361033560201b60201c565b5050565b505050565b505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61039982610353565b810181811067ffffffffffffffff821117156103b8576103b7610363565b5b80604052505050565b5f6103ca61033a565b90506103d68282610390565b919050565b5f67ffffffffffffffff8211156103f5576103f4610363565b5b6103fe82610353565b9050602081019050919050565b8281835e5f83830152505050565b5f61042b610426846103db565b6103c1565b9050828152602081018484840111156104475761044661034f565b5b61045284828561040b565b509392505050565b5f82601f83011261046e5761046d61034b565b5b815161047e848260208601610419565b91505092915050565b5f819050919050565b61049981610487565b81146104a3575f80fd5b50565b5f815190506104b481610490565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104e3826104ba565b9050919050565b6104f3816104d9565b81146104fd575f80fd5b50565b5f8151905061050e816104ea565b92915050565b5f805f806080858703121561052c5761052b610343565b5b5f85015167ffffffffffffffff81111561054957610548610347565b5b6105558782880161045a565b945050602085015167ffffffffffffffff81111561057657610575610347565b5b6105828782880161045a565b9350506040610593878288016104a6565b92505060606105a487828801610500565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105fe57607f821691505b602082108103610611576106106105ba565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610638565b61067d8683610638565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6106b86106b36106ae84610487565b610695565b610487565b9050919050565b5f819050919050565b6106d18361069e565b6106e56106dd826106bf565b848454610644565b825550505050565b5f90565b6106f96106ed565b6107048184846106c8565b505050565b5b818110156107275761071c5f826106f1565b60018101905061070a565b5050565b601f82111561076c5761073d81610617565b61074684610629565b81016020851015610755578190505b61076961076185610629565b830182610709565b50505b505050565b5f82821c905092915050565b5f61078c5f1984600802610771565b1980831691505092915050565b5f6107a4838361077d565b9150826002028217905092915050565b6107bd826105b0565b67ffffffffffffffff8111156107d6576107d5610363565b5b6107e082546105e7565b6107eb82828561072b565b5f60209050601f83116001811461081c575f841561080a578287015190505b6108148582610799565b86555061087b565b601f19841661082a86610617565b5f5b828110156108515784890151825560018201915060208501945060208101905061082c565b8683101561086e578489015161086a601f89168261077d565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6108c7601f83610883565b91506108d282610893565b602082019050919050565b5f6020820190508181035f8301526108f4816108bb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61093282610487565b915061093d83610487565b9250828201905080821115610955576109546108fb565b5b92915050565b61096481610487565b82525050565b5f60208201905061097d5f83018461095b565b92915050565b612036806109905f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806370a0823111610095578063a457c2d711610064578063a457c2d714610273578063a9059cbb146102a3578063dd62ed3e146102d3578063f2fde38b14610303576100f3565b806370a08231146101fd578063715018a61461022d5780638da5cb5b1461023757806395d89b4114610255576100f3565b806323b872dd116100d157806323b872dd14610163578063313ce5671461019357806339509351146101b157806356ce0e6c146101e1576100f3565b806306fdde03146100f7578063095ea7b31461011557806318160ddd14610145575b5f80fd5b6100ff61031f565b60405161010c9190611213565b60405180910390f35b61012f600480360381019061012a91906112d1565b6103af565b60405161013c9190611329565b60405180910390f35b61014d6103d1565b60405161015a9190611351565b60405180910390f35b61017d6004803603810190610178919061136a565b6103da565b60405161018a9190611329565b60405180910390f35b61019b610408565b6040516101a891906113d5565b60405180910390f35b6101cb60048036038101906101c691906112d1565b610410565b6040516101d89190611329565b60405180910390f35b6101fb60048036038101906101f6919061151a565b610446565b005b61021760048036038101906102129190611590565b6104f9565b6040516102249190611351565b60405180910390f35b61023561053e565b005b61023f6105c5565b60405161024c91906115ca565b60405180910390f35b61025d6105ed565b60405161026a9190611213565b60405180910390f35b61028d600480360381019061028891906112d1565b61067d565b60405161029a9190611329565b60405180910390f35b6102bd60048036038101906102b891906112d1565b6106f2565b6040516102ca9190611329565b60405180910390f35b6102ed60048036038101906102e891906115e3565b610714565b6040516102fa9190611351565b60405180910390f35b61031d60048036038101906103189190611590565b610796565b005b60606003805461032e9061164e565b80601f016020809104026020016040519081016040528092919081815260200182805461035a9061164e565b80156103a55780601f1061037c576101008083540402835291602001916103a5565b820191905f5260205f20905b81548152906001019060200180831161038857829003601f168201915b5050505050905090565b5f806103b961088c565b90506103c6818585610893565b600191505092915050565b5f600254905090565b5f806103e461088c565b90506103f1858285610a56565b6103fc858585610ae1565b60019150509392505050565b5f6012905090565b5f8061041a61088c565b905061043b81858561042c8589610714565b61043691906116ab565b610893565b600191505092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cc9061174e565b60405180910390fd5b81600390816104e49190611909565b5080600490816104f49190611909565b505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61054661088c565b73ffffffffffffffffffffffffffffffffffffffff166105646105c5565b73ffffffffffffffffffffffffffffffffffffffff16146105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b190611a22565b60405180910390fd5b6105c35f610e6a565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105fc9061164e565b80601f01602080910402602001604051908101604052809291908181526020018280546106289061164e565b80156106735780601f1061064a57610100808354040283529160200191610673565b820191905f5260205f20905b81548152906001019060200180831161065657829003601f168201915b5050505050905090565b5f8061068761088c565b90505f6106948286610714565b9050838110156106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090611ab0565b60405180910390fd5b6106e68286868403610893565b60019250505092915050565b5f806106fc61088c565b9050610709818585610ae1565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61079e61088c565b73ffffffffffffffffffffffffffffffffffffffff166107bc6105c5565b73ffffffffffffffffffffffffffffffffffffffff1614610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990611a22565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790611b3e565b60405180910390fd5b61088981610e6a565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890611bcc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690611c5a565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610a499190611351565b60405180910390a3505050565b5f610a618484610714565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610adb5781811015610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490611cc2565b60405180910390fd5b610ada8484848403610893565b5b50505050565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4b57c396040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b709190611cf4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c019190611cf4565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663e6a4390530846040518363ffffffff1660e01b8152600401610c3f929190611d1f565b602060405180830381865afa158015610c5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611cf4565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480610ce557508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610e56575f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638770d6a36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d799190611cf4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8606eef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a9190611d5a565b90505f6127108288610e1c9190611d85565b610e269190611df3565b90505f8188610e359190611e23565b9050610e428a8584610f2d565b610e4d8a8a83610f2d565b50505050610e62565b610e61868686610f2d565b5b505050505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290611ec6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090611f54565b60405180910390fd5b611014838383611199565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90611fe2565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111809190611351565b60405180910390a361119384848461119e565b50505050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6111e5826111a3565b6111ef81856111ad565b93506111ff8185602086016111bd565b611208816111cb565b840191505092915050565b5f6020820190508181035f83015261122b81846111db565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61126d82611244565b9050919050565b61127d81611263565b8114611287575f80fd5b50565b5f8135905061129881611274565b92915050565b5f819050919050565b6112b08161129e565b81146112ba575f80fd5b50565b5f813590506112cb816112a7565b92915050565b5f80604083850312156112e7576112e661123c565b5b5f6112f48582860161128a565b9250506020611305858286016112bd565b9150509250929050565b5f8115159050919050565b6113238161130f565b82525050565b5f60208201905061133c5f83018461131a565b92915050565b61134b8161129e565b82525050565b5f6020820190506113645f830184611342565b92915050565b5f805f606084860312156113815761138061123c565b5b5f61138e8682870161128a565b935050602061139f8682870161128a565b92505060406113b0868287016112bd565b9150509250925092565b5f60ff82169050919050565b6113cf816113ba565b82525050565b5f6020820190506113e85f8301846113c6565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61142c826111cb565b810181811067ffffffffffffffff8211171561144b5761144a6113f6565b5b80604052505050565b5f61145d611233565b90506114698282611423565b919050565b5f67ffffffffffffffff821115611488576114876113f6565b5b611491826111cb565b9050602081019050919050565b828183375f83830152505050565b5f6114be6114b98461146e565b611454565b9050828152602081018484840111156114da576114d96113f2565b5b6114e584828561149e565b509392505050565b5f82601f830112611501576115006113ee565b5b81356115118482602086016114ac565b91505092915050565b5f80604083850312156115305761152f61123c565b5b5f83013567ffffffffffffffff81111561154d5761154c611240565b5b611559858286016114ed565b925050602083013567ffffffffffffffff81111561157a57611579611240565b5b611586858286016114ed565b9150509250929050565b5f602082840312156115a5576115a461123c565b5b5f6115b28482850161128a565b91505092915050565b6115c481611263565b82525050565b5f6020820190506115dd5f8301846115bb565b92915050565b5f80604083850312156115f9576115f861123c565b5b5f6116068582860161128a565b92505060206116178582860161128a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061166557607f821691505b60208210810361167857611677611621565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6116b58261129e565b91506116c08361129e565b92508282019050808211156116d8576116d761167e565b5b92915050565b7f6f6e6c7920666163746f72792063616e2063616c6c20746869732066756e63745f8201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b5f6117386023836111ad565b9150611743826116de565b604082019050919050565b5f6020820190508181035f8301526117658161172c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026117c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261178d565b6117d2868361178d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61180d6118086118038461129e565b6117ea565b61129e565b9050919050565b5f819050919050565b611826836117f3565b61183a61183282611814565b848454611799565b825550505050565b5f90565b61184e611842565b61185981848461181d565b505050565b5b8181101561187c576118715f82611846565b60018101905061185f565b5050565b601f8211156118c1576118928161176c565b61189b8461177e565b810160208510156118aa578190505b6118be6118b68561177e565b83018261185e565b50505b505050565b5f82821c905092915050565b5f6118e15f19846008026118c6565b1980831691505092915050565b5f6118f983836118d2565b9150826002028217905092915050565b611912826111a3565b67ffffffffffffffff81111561192b5761192a6113f6565b5b611935825461164e565b611940828285611880565b5f60209050601f831160018114611971575f841561195f578287015190505b61196985826118ee565b8655506119d0565b601f19841661197f8661176c565b5f5b828110156119a657848901518255600182019150602085019450602081019050611981565b868310156119c357848901516119bf601f8916826118d2565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611a0c6020836111ad565b9150611a17826119d8565b602082019050919050565b5f6020820190508181035f830152611a3981611a00565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f611a9a6025836111ad565b9150611aa582611a40565b604082019050919050565b5f6020820190508181035f830152611ac781611a8e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611b286026836111ad565b9150611b3382611ace565b604082019050919050565b5f6020820190508181035f830152611b5581611b1c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611bb66024836111ad565b9150611bc182611b5c565b604082019050919050565b5f6020820190508181035f830152611be381611baa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611c446022836111ad565b9150611c4f82611bea565b604082019050919050565b5f6020820190508181035f830152611c7181611c38565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611cac601d836111ad565b9150611cb782611c78565b602082019050919050565b5f6020820190508181035f830152611cd981611ca0565b9050919050565b5f81519050611cee81611274565b92915050565b5f60208284031215611d0957611d0861123c565b5b5f611d1684828501611ce0565b91505092915050565b5f604082019050611d325f8301856115bb565b611d3f60208301846115bb565b9392505050565b5f81519050611d54816112a7565b92915050565b5f60208284031215611d6f57611d6e61123c565b5b5f611d7c84828501611d46565b91505092915050565b5f611d8f8261129e565b9150611d9a8361129e565b9250828202611da88161129e565b91508282048414831517611dbf57611dbe61167e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611dfd8261129e565b9150611e088361129e565b925082611e1857611e17611dc6565b5b828204905092915050565b5f611e2d8261129e565b9150611e388361129e565b9250828203905081811115611e5057611e4f61167e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611eb06025836111ad565b9150611ebb82611e56565b604082019050919050565b5f6020820190508181035f830152611edd81611ea4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611f3e6023836111ad565b9150611f4982611ee4565b604082019050919050565b5f6020820190508181035f830152611f6b81611f32565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611fcc6026836111ad565b9150611fd782611f72565b604082019050919050565b5f6020820190508181035f830152611ff981611fc0565b905091905056fea2646970667358221220e6037d80c839c8ee70745d74a5eb61f70b2c323c937c3a0e99cd4c033c26e66264736f6c634300081a0033a264697066735822122093ef636bfaaaa679efb0f569576488e868077f5278996690e693efa227e0516d64736f6c634300081a00330000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd0000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd
Deployed Bytecode
0x6080604052600436106101ba575f3560e01c80637465a004116100eb578063b4b57c3911610089578063d0c58e4811610063578063d0c58e4814610619578063dd0c265b1461065b578063e8a0aed314610683578063f2fde38b146106ab576101c1565b8063b4b57c391461059d578063b8606eef146105c7578063c464fe65146105f1576101c1565b806391eb09ce116100c557806391eb09ce146104e55780639e6b26ba1461050f578063aa05acec1461054b578063ad5c464814610573576101c1565b80637465a004146104695780638770d6a3146104915780638da5cb5b146104bb576101c1565b8063282fa9601161015857806351cff8d91161013257806351cff8d9146103c557806360aeb2ab146103ed5780636694ba6114610429578063715018a614610453576101c1565b8063282fa96014610323578063456954531461035f578063469048401461039b576101c1565b80631654aa14116101945780631654aa141461024557806319f373611461028157806323774af2146102bd57806326dccb37146102f9576101c1565b8063057e359a146101c55780630752881a1461020157806307b63c291461021d576101c1565b366101c157005b5f80fd5b3480156101d0575f80fd5b506101eb60048036038101906101e69190612800565b6106d3565b6040516101f8919061284d565b60405180910390f35b61021b60048036038101906102169190612800565b610852565b005b348015610228575f80fd5b50610243600480360381019061023e91906129a2565b610e63565b005b348015610250575f80fd5b5061026b60048036038101906102669190612800565b610f4c565b604051610278919061284d565b60405180910390f35b34801561028c575f80fd5b506102a760048036038101906102a29190612a2a565b611095565b6040516102b49190612a6f565b60405180910390f35b3480156102c8575f80fd5b506102e360048036038101906102de9190612a2a565b6110b2565b6040516102f09190612a97565b60405180910390f35b348015610304575f80fd5b5061030d6110e2565b60405161031a919061284d565b60405180910390f35b34801561032e575f80fd5b5061034960048036038101906103449190612800565b6110e8565b604051610356919061284d565b60405180910390f35b34801561036a575f80fd5b5061038560048036038101906103809190612800565b61119f565b604051610392919061284d565b60405180910390f35b3480156103a6575f80fd5b506103af6112f4565b6040516103bc9190612a97565b60405180910390f35b3480156103d0575f80fd5b506103eb60048036038101906103e69190612a2a565b611319565b005b3480156103f8575f80fd5b50610413600480360381019061040e9190612800565b6118b8565b604051610420919061284d565b60405180910390f35b348015610434575f80fd5b5061043d611a2b565b60405161044a919061284d565b60405180910390f35b34801561045e575f80fd5b50610467611a31565b005b348015610474575f80fd5b5061048f600480360381019061048a9190612ab0565b611ab8565b005b34801561049c575f80fd5b506104a5611b7a565b6040516104b29190612a97565b60405180910390f35b3480156104c6575f80fd5b506104cf611b9f565b6040516104dc9190612a97565b60405180910390f35b3480156104f0575f80fd5b506104f9611bc6565b604051610506919061284d565b60405180910390f35b34801561051a575f80fd5b5061053560048036038101906105309190612ab0565b611bcc565b6040516105429190612a97565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190612ab0565b611c07565b005b34801561057e575f80fd5b50610587611cc9565b6040516105949190612a97565b60405180910390f35b3480156105a8575f80fd5b506105b1611cee565b6040516105be9190612a97565b60405180910390f35b3480156105d2575f80fd5b506105db611d13565b6040516105e8919061284d565b60405180910390f35b3480156105fc575f80fd5b5061061760048036038101906106129190612800565b611d19565b005b348015610624575f80fd5b5061063f600480360381019061063a9190612a2a565b61216c565b6040516106529796959493929190612af6565b60405180910390f35b348015610666575f80fd5b50610681600480360381019061067c9190612b63565b6121c3565b005b34801561068e575f80fd5b506106a960048036038101906106a49190612bcb565b6122c3565b005b3480156106b6575f80fd5b506106d160048036038101906106cc9190612a2a565b612597565b005b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610754576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826107e89190612c80565b90505f85846107f79190612cc1565b826108029190612d21565b60018461080f9190612d51565b6108199190612d51565b90505f6127106005548361082d9190612c80565b6108379190612d21565b905080826108459190612cc1565b9550505050505092915050565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166108d2576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361090b576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff1615610990576040517f049183b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6064600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015f9054906101000a900460ff1660ff166004546109f09190612c80565b6109fa9190612d21565b905080828473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a379190612a97565b602060405180830381865afa158015610a52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a769190612d98565b610a809190612cc1565b1115610ab8576040517fef7ba6ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ac38484610f4c565b90505f61271060055483610ad79190612c80565b610ae19190612d21565b90508082610aef9190612cc1565b341015610b28576040517f6a12f10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254610b769190612d51565b9250508190555083600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f828254610bcc9190612d51565b9250508190555081600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254610c229190612cc1565b9250508190555081600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f828254610c789190612cc1565b925050819055505f600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015403610d20576001600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160016101000a81548160ff0219169083151502179055505b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610d84573d5f803e3d5ffd5b508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610dc0929190612dc3565b6020604051808303815f875af1158015610ddc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e009190612e14565b50838573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff9b4eb3e43eebbf559e9b96ceff1c786a7edab2938c7f5f80678197c2e0edba560405160405180910390a45050505050565b610e6b61268d565b73ffffffffffffffffffffffffffffffffffffffff16610e89611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690612e99565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166356ce0e6c84846040518363ffffffff1660e01b8152600401610f1a929190612f07565b5f604051808303815f87803b158015610f31575f80fd5b505af1158015610f43573d5f803e3d5ffd5b50505050505050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610fcd576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826110619190612c80565b90505f8286856110719190612d51565b8361107c9190612d21565b6110869190612d51565b90508094505050505092915050565b600d602052805f5260405f205f915054906101000a900460ff1681565b600c602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611169576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6111748484610f4c565b90505f612710600554836111889190612c80565b6111929190612d21565b9050809250505092915050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611220576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826112b49190612c80565b90505f85846112c39190612cc1565b826112ce9190612d21565b6001846112db9190612d51565b6112e59190612d51565b90508094505050505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61132161268d565b73ffffffffffffffffffffffffffffffffffffffff1661133f611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90612e99565b60405180910390fd5b600d5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611415576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff16611499576040517fba4e145400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612710600654600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301546114eb9190612c80565b6114f59190612d21565b90505f6002826115059190612c80565b600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301546115509190612d51565b90505f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161158c9190612a97565b602060405180830381865afa1580156115a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cb9190612d98565b90505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030181905550600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561173a573d5f803e3d5ffd5b5060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f1935050505015801561179f573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156117e3573d5f803e3d5ffd5b508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161181f929190612dc3565b6020604051808303815f875af115801561183b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185f9190612e14565b5080828573ffffffffffffffffffffffffffffffffffffffff167fe08737ac48a1dab4b1a46c7dc9398bd5bfc6d7ad6fabb7cd8caa254de14def3586876040516118aa929190612f3c565b60405180910390a450505050565b5f600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611939576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f82826119cd9190612c80565b90505f8286856119dd9190612d51565b836119e89190612d21565b6119f29190612d51565b90505f61271060055483611a069190612c80565b611a109190612d21565b90508082611a1e9190612cc1565b9550505050505092915050565b60065481565b611a3961268d565b73ffffffffffffffffffffffffffffffffffffffff16611a57611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa490612e99565b60405180910390fd5b611ab65f612694565b565b611ac061268d565b73ffffffffffffffffffffffffffffffffffffffff16611ade611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90612e99565b60405180910390fd5b6101f4811115611b70576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060058190555050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b60018181548110611bdb575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c0f61268d565b73ffffffffffffffffffffffffffffffffffffffff16611c2d611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90612e99565b60405180910390fd5b611388811115611cbf576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060068190555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611d99576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103611dd2576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050160019054906101000a900460ff1615611e57576040517f049183b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611e62838361119f565b90505f61271060055483611e769190612c80565b611e809190612d21565b90508373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611ebf93929190612f63565b6020604051808303815f875af1158015611edb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eff9190612e14565b5082600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254611f4e9190612cc1565b9250508190555082600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f828254611fa49190612cc1565b9250508190555081600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254611ffa9190612d51565b9250508190555081600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f8282546120509190612d51565b9250508190555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156120bb573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc82846120e29190612d51565b90811502906040515f60405180830381858888f1935050505015801561210a573d5f803e3d5ffd5b50828473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f481809cba951bfbd752234d0504d4719277804f87f6e0da1b5b486c80d808fe460405160405180910390a450505050565b600b602052805f5260405f205f91509050805f015490806001015490806002015490806003015490806004015490806005015f9054906101000a900460ff16908060050160019054906101000a900460ff16905087565b6121cb61268d565b73ffffffffffffffffffffffffffffffffffffffff166121e9611b9f565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690612e99565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f8160ff1614806122d7575060648160ff16115b1561230e576040517f3149226b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83836b033b2e3c9fd0803ce80000003060405161232b90612755565b6123389493929190612fda565b604051809103905ff080158015612351573d5f803e3d5ffd5b5090505f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506b033b2e3c9fd0803ce8000000816004018190555082816005015f6101000a81548160ff021916908360ff1602179055506b037790a0e8714009b49c0000815f0181905550600454816002018190555060035481600101819055506001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555033600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060025f8154809291906125319061302b565b91905055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813960405160405180910390a35050505050565b61259f61268d565b73ffffffffffffffffffffffffffffffffffffffff166125bd611b9f565b73ffffffffffffffffffffffffffffffffffffffff1614612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a90612e99565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612678906130e2565b60405180910390fd5b61268a81612694565b50565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129c68061310183390190565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61279c82612773565b9050919050565b6127ac81612792565b81146127b6575f80fd5b50565b5f813590506127c7816127a3565b92915050565b5f819050919050565b6127df816127cd565b81146127e9575f80fd5b50565b5f813590506127fa816127d6565b92915050565b5f80604083850312156128165761281561276b565b5b5f612823858286016127b9565b9250506020612834858286016127ec565b9150509250929050565b612847816127cd565b82525050565b5f6020820190506128605f83018461283e565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128b48261286e565b810181811067ffffffffffffffff821117156128d3576128d261287e565b5b80604052505050565b5f6128e5612762565b90506128f182826128ab565b919050565b5f67ffffffffffffffff8211156129105761290f61287e565b5b6129198261286e565b9050602081019050919050565b828183375f83830152505050565b5f612946612941846128f6565b6128dc565b9050828152602081018484840111156129625761296161286a565b5b61296d848285612926565b509392505050565b5f82601f83011261298957612988612866565b5b8135612999848260208601612934565b91505092915050565b5f805f606084860312156129b9576129b861276b565b5b5f84013567ffffffffffffffff8111156129d6576129d561276f565b5b6129e286828701612975565b935050602084013567ffffffffffffffff811115612a0357612a0261276f565b5b612a0f86828701612975565b9250506040612a20868287016127b9565b9150509250925092565b5f60208284031215612a3f57612a3e61276b565b5b5f612a4c848285016127b9565b91505092915050565b5f8115159050919050565b612a6981612a55565b82525050565b5f602082019050612a825f830184612a60565b92915050565b612a9181612792565b82525050565b5f602082019050612aaa5f830184612a88565b92915050565b5f60208284031215612ac557612ac461276b565b5b5f612ad2848285016127ec565b91505092915050565b5f60ff82169050919050565b612af081612adb565b82525050565b5f60e082019050612b095f83018a61283e565b612b16602083018961283e565b612b23604083018861283e565b612b30606083018761283e565b612b3d608083018661283e565b612b4a60a0830185612ae7565b612b5760c0830184612a60565b98975050505050505050565b5f8060408385031215612b7957612b7861276b565b5b5f612b86858286016127b9565b9250506020612b97858286016127b9565b9150509250929050565b612baa81612adb565b8114612bb4575f80fd5b50565b5f81359050612bc581612ba1565b92915050565b5f805f60608486031215612be257612be161276b565b5b5f84013567ffffffffffffffff811115612bff57612bfe61276f565b5b612c0b86828701612975565b935050602084013567ffffffffffffffff811115612c2c57612c2b61276f565b5b612c3886828701612975565b9250506040612c4986828701612bb7565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c8a826127cd565b9150612c95836127cd565b9250828202612ca3816127cd565b91508282048414831517612cba57612cb9612c53565b5b5092915050565b5f612ccb826127cd565b9150612cd6836127cd565b9250828201905080821115612cee57612ced612c53565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612d2b826127cd565b9150612d36836127cd565b925082612d4657612d45612cf4565b5b828204905092915050565b5f612d5b826127cd565b9150612d66836127cd565b9250828203905081811115612d7e57612d7d612c53565b5b92915050565b5f81519050612d92816127d6565b92915050565b5f60208284031215612dad57612dac61276b565b5b5f612dba84828501612d84565b91505092915050565b5f604082019050612dd65f830185612a88565b612de3602083018461283e565b9392505050565b612df381612a55565b8114612dfd575f80fd5b50565b5f81519050612e0e81612dea565b92915050565b5f60208284031215612e2957612e2861276b565b5b5f612e3684828501612e00565b91505092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612e83602083612e3f565b9150612e8e82612e4f565b602082019050919050565b5f6020820190508181035f830152612eb081612e77565b9050919050565b5f81519050919050565b8281835e5f83830152505050565b5f612ed982612eb7565b612ee38185612e3f565b9350612ef3818560208601612ec1565b612efc8161286e565b840191505092915050565b5f6040820190508181035f830152612f1f8185612ecf565b90508181036020830152612f338184612ecf565b90509392505050565b5f604082019050612f4f5f83018561283e565b612f5c602083018461283e565b9392505050565b5f606082019050612f765f830186612a88565b612f836020830185612a88565b612f90604083018461283e565b949350505050565b5f819050919050565b5f819050919050565b5f612fc4612fbf612fba84612f98565b612fa1565b6127cd565b9050919050565b612fd481612faa565b82525050565b5f6080820190508181035f830152612ff28187612ecf565b905081810360208301526130068186612ecf565b90506130156040830185612fcb565b6130226060830184612a88565b95945050505050565b5f613035826127cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361306757613066612c53565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6130cc602683612e3f565b91506130d782613072565b604082019050919050565b5f6020820190508181035f8301526130f9816130c0565b905091905056fe608060405234801561000f575f80fd5b506040516129c63803806129c683398181016040528101906100319190610514565b838382826003908161004391906107b4565b50816004908161005391906107b4565b508060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506100b36100a861010c60201b60201c565b61011360201b60201c565b6100c333836101d660201b60201c565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050610983565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023b906108dd565b60405180910390fd5b6102555f838361033060201b60201c565b8060025f8282546102669190610928565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610313919061096a565b60405180910390a361032c5f838361033560201b60201c565b5050565b505050565b505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61039982610353565b810181811067ffffffffffffffff821117156103b8576103b7610363565b5b80604052505050565b5f6103ca61033a565b90506103d68282610390565b919050565b5f67ffffffffffffffff8211156103f5576103f4610363565b5b6103fe82610353565b9050602081019050919050565b8281835e5f83830152505050565b5f61042b610426846103db565b6103c1565b9050828152602081018484840111156104475761044661034f565b5b61045284828561040b565b509392505050565b5f82601f83011261046e5761046d61034b565b5b815161047e848260208601610419565b91505092915050565b5f819050919050565b61049981610487565b81146104a3575f80fd5b50565b5f815190506104b481610490565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104e3826104ba565b9050919050565b6104f3816104d9565b81146104fd575f80fd5b50565b5f8151905061050e816104ea565b92915050565b5f805f806080858703121561052c5761052b610343565b5b5f85015167ffffffffffffffff81111561054957610548610347565b5b6105558782880161045a565b945050602085015167ffffffffffffffff81111561057657610575610347565b5b6105828782880161045a565b9350506040610593878288016104a6565b92505060606105a487828801610500565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105fe57607f821691505b602082108103610611576106106105ba565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610638565b61067d8683610638565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6106b86106b36106ae84610487565b610695565b610487565b9050919050565b5f819050919050565b6106d18361069e565b6106e56106dd826106bf565b848454610644565b825550505050565b5f90565b6106f96106ed565b6107048184846106c8565b505050565b5b818110156107275761071c5f826106f1565b60018101905061070a565b5050565b601f82111561076c5761073d81610617565b61074684610629565b81016020851015610755578190505b61076961076185610629565b830182610709565b50505b505050565b5f82821c905092915050565b5f61078c5f1984600802610771565b1980831691505092915050565b5f6107a4838361077d565b9150826002028217905092915050565b6107bd826105b0565b67ffffffffffffffff8111156107d6576107d5610363565b5b6107e082546105e7565b6107eb82828561072b565b5f60209050601f83116001811461081c575f841561080a578287015190505b6108148582610799565b86555061087b565b601f19841661082a86610617565b5f5b828110156108515784890151825560018201915060208501945060208101905061082c565b8683101561086e578489015161086a601f89168261077d565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6108c7601f83610883565b91506108d282610893565b602082019050919050565b5f6020820190508181035f8301526108f4816108bb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61093282610487565b915061093d83610487565b9250828201905080821115610955576109546108fb565b5b92915050565b61096481610487565b82525050565b5f60208201905061097d5f83018461095b565b92915050565b612036806109905f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806370a0823111610095578063a457c2d711610064578063a457c2d714610273578063a9059cbb146102a3578063dd62ed3e146102d3578063f2fde38b14610303576100f3565b806370a08231146101fd578063715018a61461022d5780638da5cb5b1461023757806395d89b4114610255576100f3565b806323b872dd116100d157806323b872dd14610163578063313ce5671461019357806339509351146101b157806356ce0e6c146101e1576100f3565b806306fdde03146100f7578063095ea7b31461011557806318160ddd14610145575b5f80fd5b6100ff61031f565b60405161010c9190611213565b60405180910390f35b61012f600480360381019061012a91906112d1565b6103af565b60405161013c9190611329565b60405180910390f35b61014d6103d1565b60405161015a9190611351565b60405180910390f35b61017d6004803603810190610178919061136a565b6103da565b60405161018a9190611329565b60405180910390f35b61019b610408565b6040516101a891906113d5565b60405180910390f35b6101cb60048036038101906101c691906112d1565b610410565b6040516101d89190611329565b60405180910390f35b6101fb60048036038101906101f6919061151a565b610446565b005b61021760048036038101906102129190611590565b6104f9565b6040516102249190611351565b60405180910390f35b61023561053e565b005b61023f6105c5565b60405161024c91906115ca565b60405180910390f35b61025d6105ed565b60405161026a9190611213565b60405180910390f35b61028d600480360381019061028891906112d1565b61067d565b60405161029a9190611329565b60405180910390f35b6102bd60048036038101906102b891906112d1565b6106f2565b6040516102ca9190611329565b60405180910390f35b6102ed60048036038101906102e891906115e3565b610714565b6040516102fa9190611351565b60405180910390f35b61031d60048036038101906103189190611590565b610796565b005b60606003805461032e9061164e565b80601f016020809104026020016040519081016040528092919081815260200182805461035a9061164e565b80156103a55780601f1061037c576101008083540402835291602001916103a5565b820191905f5260205f20905b81548152906001019060200180831161038857829003601f168201915b5050505050905090565b5f806103b961088c565b90506103c6818585610893565b600191505092915050565b5f600254905090565b5f806103e461088c565b90506103f1858285610a56565b6103fc858585610ae1565b60019150509392505050565b5f6012905090565b5f8061041a61088c565b905061043b81858561042c8589610714565b61043691906116ab565b610893565b600191505092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cc9061174e565b60405180910390fd5b81600390816104e49190611909565b5080600490816104f49190611909565b505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61054661088c565b73ffffffffffffffffffffffffffffffffffffffff166105646105c5565b73ffffffffffffffffffffffffffffffffffffffff16146105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b190611a22565b60405180910390fd5b6105c35f610e6a565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105fc9061164e565b80601f01602080910402602001604051908101604052809291908181526020018280546106289061164e565b80156106735780601f1061064a57610100808354040283529160200191610673565b820191905f5260205f20905b81548152906001019060200180831161065657829003601f168201915b5050505050905090565b5f8061068761088c565b90505f6106948286610714565b9050838110156106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090611ab0565b60405180910390fd5b6106e68286868403610893565b60019250505092915050565b5f806106fc61088c565b9050610709818585610ae1565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61079e61088c565b73ffffffffffffffffffffffffffffffffffffffff166107bc6105c5565b73ffffffffffffffffffffffffffffffffffffffff1614610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990611a22565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790611b3e565b60405180910390fd5b61088981610e6a565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890611bcc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690611c5a565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610a499190611351565b60405180910390a3505050565b5f610a618484610714565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610adb5781811015610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490611cc2565b60405180910390fd5b610ada8484848403610893565b5b50505050565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4b57c396040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b709190611cf4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c019190611cf4565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663e6a4390530846040518363ffffffff1660e01b8152600401610c3f929190611d1f565b602060405180830381865afa158015610c5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7e9190611cf4565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480610ce557508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610e56575f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638770d6a36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d799190611cf4565b90505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8606eef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a9190611d5a565b90505f6127108288610e1c9190611d85565b610e269190611df3565b90505f8188610e359190611e23565b9050610e428a8584610f2d565b610e4d8a8a83610f2d565b50505050610e62565b610e61868686610f2d565b5b505050505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290611ec6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090611f54565b60405180910390fd5b611014838383611199565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90611fe2565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111809190611351565b60405180910390a361119384848461119e565b50505050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6111e5826111a3565b6111ef81856111ad565b93506111ff8185602086016111bd565b611208816111cb565b840191505092915050565b5f6020820190508181035f83015261122b81846111db565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61126d82611244565b9050919050565b61127d81611263565b8114611287575f80fd5b50565b5f8135905061129881611274565b92915050565b5f819050919050565b6112b08161129e565b81146112ba575f80fd5b50565b5f813590506112cb816112a7565b92915050565b5f80604083850312156112e7576112e661123c565b5b5f6112f48582860161128a565b9250506020611305858286016112bd565b9150509250929050565b5f8115159050919050565b6113238161130f565b82525050565b5f60208201905061133c5f83018461131a565b92915050565b61134b8161129e565b82525050565b5f6020820190506113645f830184611342565b92915050565b5f805f606084860312156113815761138061123c565b5b5f61138e8682870161128a565b935050602061139f8682870161128a565b92505060406113b0868287016112bd565b9150509250925092565b5f60ff82169050919050565b6113cf816113ba565b82525050565b5f6020820190506113e85f8301846113c6565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61142c826111cb565b810181811067ffffffffffffffff8211171561144b5761144a6113f6565b5b80604052505050565b5f61145d611233565b90506114698282611423565b919050565b5f67ffffffffffffffff821115611488576114876113f6565b5b611491826111cb565b9050602081019050919050565b828183375f83830152505050565b5f6114be6114b98461146e565b611454565b9050828152602081018484840111156114da576114d96113f2565b5b6114e584828561149e565b509392505050565b5f82601f830112611501576115006113ee565b5b81356115118482602086016114ac565b91505092915050565b5f80604083850312156115305761152f61123c565b5b5f83013567ffffffffffffffff81111561154d5761154c611240565b5b611559858286016114ed565b925050602083013567ffffffffffffffff81111561157a57611579611240565b5b611586858286016114ed565b9150509250929050565b5f602082840312156115a5576115a461123c565b5b5f6115b28482850161128a565b91505092915050565b6115c481611263565b82525050565b5f6020820190506115dd5f8301846115bb565b92915050565b5f80604083850312156115f9576115f861123c565b5b5f6116068582860161128a565b92505060206116178582860161128a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061166557607f821691505b60208210810361167857611677611621565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6116b58261129e565b91506116c08361129e565b92508282019050808211156116d8576116d761167e565b5b92915050565b7f6f6e6c7920666163746f72792063616e2063616c6c20746869732066756e63745f8201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b5f6117386023836111ad565b9150611743826116de565b604082019050919050565b5f6020820190508181035f8301526117658161172c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026117c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261178d565b6117d2868361178d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61180d6118086118038461129e565b6117ea565b61129e565b9050919050565b5f819050919050565b611826836117f3565b61183a61183282611814565b848454611799565b825550505050565b5f90565b61184e611842565b61185981848461181d565b505050565b5b8181101561187c576118715f82611846565b60018101905061185f565b5050565b601f8211156118c1576118928161176c565b61189b8461177e565b810160208510156118aa578190505b6118be6118b68561177e565b83018261185e565b50505b505050565b5f82821c905092915050565b5f6118e15f19846008026118c6565b1980831691505092915050565b5f6118f983836118d2565b9150826002028217905092915050565b611912826111a3565b67ffffffffffffffff81111561192b5761192a6113f6565b5b611935825461164e565b611940828285611880565b5f60209050601f831160018114611971575f841561195f578287015190505b61196985826118ee565b8655506119d0565b601f19841661197f8661176c565b5f5b828110156119a657848901518255600182019150602085019450602081019050611981565b868310156119c357848901516119bf601f8916826118d2565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611a0c6020836111ad565b9150611a17826119d8565b602082019050919050565b5f6020820190508181035f830152611a3981611a00565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f611a9a6025836111ad565b9150611aa582611a40565b604082019050919050565b5f6020820190508181035f830152611ac781611a8e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611b286026836111ad565b9150611b3382611ace565b604082019050919050565b5f6020820190508181035f830152611b5581611b1c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611bb66024836111ad565b9150611bc182611b5c565b604082019050919050565b5f6020820190508181035f830152611be381611baa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611c446022836111ad565b9150611c4f82611bea565b604082019050919050565b5f6020820190508181035f830152611c7181611c38565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611cac601d836111ad565b9150611cb782611c78565b602082019050919050565b5f6020820190508181035f830152611cd981611ca0565b9050919050565b5f81519050611cee81611274565b92915050565b5f60208284031215611d0957611d0861123c565b5b5f611d1684828501611ce0565b91505092915050565b5f604082019050611d325f8301856115bb565b611d3f60208301846115bb565b9392505050565b5f81519050611d54816112a7565b92915050565b5f60208284031215611d6f57611d6e61123c565b5b5f611d7c84828501611d46565b91505092915050565b5f611d8f8261129e565b9150611d9a8361129e565b9250828202611da88161129e565b91508282048414831517611dbf57611dbe61167e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611dfd8261129e565b9150611e088361129e565b925082611e1857611e17611dc6565b5b828204905092915050565b5f611e2d8261129e565b9150611e388361129e565b9250828203905081811115611e5057611e4f61167e565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611eb06025836111ad565b9150611ebb82611e56565b604082019050919050565b5f6020820190508181035f830152611edd81611ea4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611f3e6023836111ad565b9150611f4982611ee4565b604082019050919050565b5f6020820190508181035f830152611f6b81611f32565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611fcc6026836111ad565b9150611fd782611f72565b604082019050919050565b5f6020820190508181035f830152611ff981611fc0565b905091905056fea2646970667358221220e6037d80c839c8ee70745d74a5eb61f70b2c323c937c3a0e99cd4c033c26e66264736f6c634300081a0033a264697066735822122093ef636bfaaaa679efb0f569576488e868077f5278996690e693efa227e0516d64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd0000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd
-----Decoded View---------------
Arg [0] : _feeRecipient (address): 0x3cdA591b30E304EecEc4909Cb852A243a73F59bD
Arg [1] : _tokenFeeRecipient (address): 0x3cdA591b30E304EecEc4909Cb852A243a73F59bD
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd
Arg [1] : 0000000000000000000000003cda591b30e304eecec4909cb852a243a73f59bd
Deployed Bytecode Sourcemap
22397:9686:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30529:647;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25700:1236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25491:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28754:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23618:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23564:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22854:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31184:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29951:570;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23009:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27826:920;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29314:629;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22971:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:103;;;;;;;;;;;;;:::i;:::-;;31720:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23043:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1698:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22770:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22707:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31908:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23082:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23153:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22923:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:874;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23505:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;31520:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24432:1051;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2607:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30529:647;30636:7;30666;:15;30674:6;30666:15;;;;;;;;;;;;;;;;;;;;;;;;;30661:48;;30690:19;;;;;;;;;;;;;;30661:48;30720:28;30751:12;:20;30764:6;30751:20;;;;;;;;;;;;;;;:55;;;30720:86;;30817:26;30846:12;:20;30859:6;30846:20;;;;;;;;;;;;;;;:39;;;30817:68;;30896:9;30929:20;30908:18;:41;;;;:::i;:::-;30896:53;;30962:17;31062:7;31039:20;:30;;;;:::i;:::-;31034:1;:36;;;;:::i;:::-;31016:1;30982:18;:35;;;;:::i;:::-;:89;;;;:::i;:::-;30962:109;;31084:11;31129:6;31111:14;;31099:9;:26;;;;:::i;:::-;31098:37;;;;:::i;:::-;31084:51;;31165:3;31153:9;:15;;;;:::i;:::-;31146:22;;;;;;;30529:647;;;;:::o;25700:1236::-;25785:7;:15;25793:6;25785:15;;;;;;;;;;;;;;;;;;;;;;;;;25780:48;;25809:19;;;;;;;;;;;;;;25780:48;25854:1;25843:7;:12;25839:42;;25864:17;;;;;;;;;;;;;;25839:42;25896:12;:20;25909:6;25896:20;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25892:68;;;25937:23;;;;;;;;;;;;;;25892:68;25973:20;26081:3;26037:12;:20;26050:6;26037:20;;;;;;;;;;;;;;;:40;;;;;;;;;;;;25997:80;;:24;;:80;;;;:::i;:::-;25996:88;;;;:::i;:::-;25973:111;;26150:12;26140:7;26108:6;26101:24;;;26126:10;26101:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;:::-;:61;26097:116;;;26184:29;;;;;;;;;;;;;;26097:116;26224:16;26243:25;26252:6;26260:7;26243:8;:25::i;:::-;26224:44;;26279:11;26323:6;26305:14;;26294:8;:25;;;;:::i;:::-;26293:36;;;;:::i;:::-;26279:50;;26367:3;26356:8;:14;;;;:::i;:::-;26344:9;:26;26340:56;;;26379:17;;;;;;;;;;;;;;26340:56;26454:7;26409:12;:20;26422:6;26409:20;;;;;;;;;;;;;;;:41;;;:52;;;;;;;:::i;:::-;;;;;;;;26514:7;26472:12;:20;26485:6;26472:20;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;;;;;26575:8;26532:12;:20;26545:6;26532:20;;;;;;;;;;;;;;;:39;;;:51;;;;;;;:::i;:::-;;;;;;;;26634:8;26594:12;:20;26607:6;26594:20;;;;;;;;;;;;;;;:36;;;:48;;;;;;;:::i;:::-;;;;;;;;26699:1;26657:12;:20;26670:6;26657:20;;;;;;;;;;;;;;;:38;;;:43;26653:115;;26752:4;26717:12;:20;26730:6;26717:20;;;;;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;26653:115;26786:12;;;;;;;;;;;26778:30;;:35;26809:3;26778:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26831:6;26824:23;;;26848:10;26860:7;26824:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26920:7;26912:6;26884:44;;26900:10;26884:44;;;;;;;;;;;;25769:1167;;;25700:1236;;:::o;25491:201::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25646:6:::1;25639:29;;;25669:5;25676:7;25639:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25491:201:::0;;;:::o;28754:552::-;28853:7;28883;:15;28891:6;28883:15;;;;;;;;;;;;;;;;;;;;;;;;;28878:48;;28907:19;;;;;;;;;;;;;;28878:48;28937:28;28968:12;:20;28981:6;28968:20;;;;;;;;;;;;;;;:55;;;28937:86;;29034:26;29063:12;:20;29076:6;29063:20;;;;;;;;;;;;;;;:39;;;29034:68;;29113:9;29146:20;29125:18;:41;;;;:::i;:::-;29113:53;;29179:17;29253:18;29228:7;29205:20;:30;;;;:::i;:::-;29200:1;:36;;;;:::i;:::-;29199:72;;;;:::i;:::-;29179:92;;29289:9;29282:16;;;;;;28754:552;;;;:::o;23618:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;23564:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;22854:60::-;;;;:::o;31184:328::-;31292:7;31322;:15;31330:6;31322:15;;;;;;;;;;;;;;;;;;;;;;;;;31317:48;;31346:19;;;;;;;;;;;;;;31317:48;31378:16;31397:25;31406:6;31414:7;31397:8;:25::i;:::-;31378:44;;31433:11;31477:6;31459:14;;31448:8;:25;;;;:::i;:::-;31447:36;;;;:::i;:::-;31433:50;;31501:3;31494:10;;;;31184:328;;;;:::o;29951:570::-;30051:7;30081;:15;30089:6;30081:15;;;;;;;;;;;;;;;;;;;;;;;;;30076:48;;30105:19;;;;;;;;;;;;;;30076:48;30135:28;30166:12;:20;30179:6;30166:20;;;;;;;;;;;;;;;:55;;;30135:86;;30232:26;30261:12;:20;30274:6;30261:20;;;;;;;;;;;;;;;:39;;;30232:68;;30311:9;30344:20;30323:18;:41;;;;:::i;:::-;30311:53;;30377:17;30477:7;30454:20;:30;;;;:::i;:::-;30449:1;:36;;;;:::i;:::-;30431:1;30397:18;:35;;;;:::i;:::-;:89;;;;:::i;:::-;30377:109;;30504:9;30497:16;;;;;;29951:570;;;;:::o;23009:27::-;;;;;;;;;;;;;:::o;27826:920::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27895:7:::1;:15;27903:6;27895:15;;;;;;;;;;;;;;;;;;;;;;;;;27890:48;;27919:19;;;;;;;;;;;;;;27890:48;27954:12;:20;27967:6;27954:20;;;;;;;;;;;;;;;:32;;;;;;;;;;;;27949:85;;28008:26;;;;;;;;;;;;;;27949:85;28047:11;28115:5;28100:11;;28062:12;:20;28075:6;28062:20;;;;;;;;;;;;;;;:36;;;:49;;;;:::i;:::-;28061:59;;;;:::i;:::-;28047:73;;28131:21;28197:1;28193:3;:5;;;;:::i;:::-;28155:12;:20;28168:6;28155:20;;;;;;;;;;;;;;;:36;;;:44;;;;:::i;:::-;28131:68;;28210:24;28244:6;28237:24;;;28270:4;28237:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28210:66;;28331:1;28287:12;:20;28300:6;28287:20;;;;;;;;;;;;;;;:41;;:45;;;;28385:1;28343:12;:20;28356:6;28343:20;;;;;;;;;;;;;;;:39;;:43;;;;28436:1;28397:12;:20;28410:6;28397:20;;;;;;;;;;;;;;;:36;;:40;;;;28466:12;:20;28479:6;28466:20;;;;;;;;;;;;;;;;;;;;;;;;;28458:38;;:43;28497:3;28458:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28520:12;;;;;;;;;;;28512:30;;:35;28543:3;28512:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28566:10;28558:28;;:43;28587:13;28558:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28619:6;28612:23;;;28636:10;28648:16;28612:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28713:16;28698:13;28690:6;28681:57;;;28730:3;28734;28681:57;;;;;;;:::i;:::-;;;;;;;;27879:867;;;27826:920:::0;:::o;29314:629::-;29420:7;29450;:15;29458:6;29450:15;;;;;;;;;;;;;;;;;;;;;;;;;29445:48;;29474:19;;;;;;;;;;;;;;29445:48;29504:28;29535:12;:20;29548:6;29535:20;;;;;;;;;;;;;;;:55;;;29504:86;;29601:26;29630:12;:20;29643:6;29630:20;;;;;;;;;;;;;;;:39;;;29601:68;;29680:9;29713:20;29692:18;:41;;;;:::i;:::-;29680:53;;29746:17;29820:18;29795:7;29772:20;:30;;;;:::i;:::-;29767:1;:36;;;;:::i;:::-;29766:72;;;;:::i;:::-;29746:92;;29851:11;29896:6;29878:14;;29866:9;:26;;;;:::i;:::-;29865:37;;;;:::i;:::-;29851:51;;29932:3;29920:9;:15;;;;:::i;:::-;29913:22;;;;;;;29314:629;;;;:::o;22971:31::-;;;;:::o;2349:103::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:30:::1;2441:1;2414:18;:30::i;:::-;2349:103::o:0;31720:182::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31827:3:::1;31809:15;:21;31805:46;;;31839:12;;;;;;;;;;;;;;31805:46;31879:15;31862:14;:32;;;;31720:182:::0;:::o;23043:32::-;;;;;;;;;;;;;:::o;1698:87::-;1744:7;1771:6;;;;;;;;;;;1764:13;;1698:87;:::o;22770:62::-;;;;:::o;22707:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31908:172::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32006:4:::1;31991:12;:19;31987:44;;;32019:12;;;;;;;;;;;;;;31987:44;32060:12;32046:11;:26;;;;31908:172:::0;:::o;23082:64::-;;;;;;;;;;;;;:::o;23153:69::-;;;;;;;;;;;;;:::o;22923:35::-;;;;:::o;26944:874::-;27022:7;:15;27030:6;27022:15;;;;;;;;;;;;;;;;;;;;;;;;;27017:48;;27046:19;;;;;;;;;;;;;;27017:48;27091:1;27080:7;:12;27076:42;;27101:17;;;;;;;;;;;;;;27076:42;27133:12;:20;27146:6;27133:20;;;;;;;;;;;;;;;:32;;;;;;;;;;;;27129:68;;;27174:23;;;;;;;;;;;;;;27129:68;27208:20;27231:26;27241:6;27249:7;27231:9;:26::i;:::-;27208:49;;27268:11;27316:6;27298:14;;27283:12;:29;;;;:::i;:::-;27282:40;;;;:::i;:::-;27268:54;;27340:6;27333:27;;;27361:10;27381:4;27388:7;27333:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27452:7;27407:12;:20;27420:6;27407:20;;;;;;;;;;;;;;;:41;;;:52;;;;;;;:::i;:::-;;;;;;;;27512:7;27470:12;:20;27483:6;27470:20;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;;;;;27573:12;27530;:20;27543:6;27530:20;;;;;;;;;;;;;;;:39;;;:55;;;;;;;:::i;:::-;;;;;;;;27636:12;27596;:20;27609:6;27596:20;;;;;;;;;;;;;;;:36;;;:52;;;;;;;:::i;:::-;;;;;;;;27669:12;;;;;;;;;;;27661:30;;:35;27692:3;27661:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27715:10;27707:28;;:48;27751:3;27736:12;:18;;;;:::i;:::-;27707:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27802:7;27794:6;27771:39;;27782:10;27771:39;;;;;;;;;;;;27006:812;;26944:874;;:::o;23505:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31520:194::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31644:13:::1;31629:12;;:28;;;;;;;;;;;;;;;;;;31688:18;31668:17;;:38;;;;;;;;;;;;;;;;;;31520:194:::0;;:::o;24432:1051::-;24607:1;24583:20;:25;;;:55;;;;24635:3;24612:20;:26;;;24583:55;24579:123;;;24662:28;;;;;;;;;;;;;;24579:123;24712:14;24756:5;24776:7;24798:16;24837:4;24729:124;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;24712:141;;24864:34;24901:12;:28;24922:5;24901:28;;;;;;;;;;;;;;;24864:65;;24969:16;24940:13;:26;;:45;;;;25032:20;24996:13;:33;;;:56;;;;;;;;;;;;;;;;;;25100:19;25063:13;:34;;:56;;;;25164:24;;25130:13;:31;;:58;;;;25234:25;;25199:13;:32;;:60;;;;25296:4;25270:7;:23;25286:5;25270:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;25342:10;25311:12;:28;25332:5;25311:28;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;25363:12;25389:5;25363:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25407:10;;:12;;;;;;;;;:::i;:::-;;;;;;25468:5;25435:40;;25448:10;25435:40;;;;;;;;;;;;24568:915;;24432:1051;;;:::o;2607:238::-;1929:12;:10;:12::i;:::-;1918:23;;:7;:5;:7::i;:::-;:23;;;1910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2730:1:::1;2710:22;;:8;:22;;::::0;2688:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2809:28;2828:8;2809:18;:28::i;:::-;2607:238:::0;:::o;540:98::-;593:7;620:10;613:17;;540:98;:::o;3005:191::-;3079:16;3098:6;;;;;;;;;;;3079:25;;3124:8;3115:6;;:17;;;;;;;;;;;;;;;;;;3179:8;3148:40;;3169:8;3148:40;;;;;;;;;;;;3068:128;3005:191;:::o;-1:-1:-1:-;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:117::-;2138:1;2135;2128:12;2152:117;2261:1;2258;2251:12;2275:102;2316:6;2367:2;2363:7;2358:2;2351:5;2347:14;2343:28;2333:38;;2275:102;;;:::o;2383:180::-;2431:77;2428:1;2421:88;2528:4;2525:1;2518:15;2552:4;2549:1;2542:15;2569:281;2652:27;2674:4;2652:27;:::i;:::-;2644:6;2640:40;2782:6;2770:10;2767:22;2746:18;2734:10;2731:34;2728:62;2725:88;;;2793:18;;:::i;:::-;2725:88;2833:10;2829:2;2822:22;2612:238;2569:281;;:::o;2856:129::-;2890:6;2917:20;;:::i;:::-;2907:30;;2946:33;2974:4;2966:6;2946:33;:::i;:::-;2856:129;;;:::o;2991:308::-;3053:4;3143:18;3135:6;3132:30;3129:56;;;3165:18;;:::i;:::-;3129:56;3203:29;3225:6;3203:29;:::i;:::-;3195:37;;3287:4;3281;3277:15;3269:23;;2991:308;;;:::o;3305:148::-;3403:6;3398:3;3393;3380:30;3444:1;3435:6;3430:3;3426:16;3419:27;3305:148;;;:::o;3459:425::-;3537:5;3562:66;3578:49;3620:6;3578:49;:::i;:::-;3562:66;:::i;:::-;3553:75;;3651:6;3644:5;3637:21;3689:4;3682:5;3678:16;3727:3;3718:6;3713:3;3709:16;3706:25;3703:112;;;3734:79;;:::i;:::-;3703:112;3824:54;3871:6;3866:3;3861;3824:54;:::i;:::-;3543:341;3459:425;;;;;:::o;3904:340::-;3960:5;4009:3;4002:4;3994:6;3990:17;3986:27;3976:122;;4017:79;;:::i;:::-;3976:122;4134:6;4121:20;4159:79;4234:3;4226:6;4219:4;4211:6;4207:17;4159:79;:::i;:::-;4150:88;;3966:278;3904:340;;;;:::o;4250:979::-;4347:6;4355;4363;4412:2;4400:9;4391:7;4387:23;4383:32;4380:119;;;4418:79;;:::i;:::-;4380:119;4566:1;4555:9;4551:17;4538:31;4596:18;4588:6;4585:30;4582:117;;;4618:79;;:::i;:::-;4582:117;4723:63;4778:7;4769:6;4758:9;4754:22;4723:63;:::i;:::-;4713:73;;4509:287;4863:2;4852:9;4848:18;4835:32;4894:18;4886:6;4883:30;4880:117;;;4916:79;;:::i;:::-;4880:117;5021:63;5076:7;5067:6;5056:9;5052:22;5021:63;:::i;:::-;5011:73;;4806:288;5133:2;5159:53;5204:7;5195:6;5184:9;5180:22;5159:53;:::i;:::-;5149:63;;5104:118;4250:979;;;;;:::o;5235:329::-;5294:6;5343:2;5331:9;5322:7;5318:23;5314:32;5311:119;;;5349:79;;:::i;:::-;5311:119;5469:1;5494:53;5539:7;5530:6;5519:9;5515:22;5494:53;:::i;:::-;5484:63;;5440:117;5235:329;;;;:::o;5570:90::-;5604:7;5647:5;5640:13;5633:21;5622:32;;5570:90;;;:::o;5666:109::-;5747:21;5762:5;5747:21;:::i;:::-;5742:3;5735:34;5666:109;;:::o;5781:210::-;5868:4;5906:2;5895:9;5891:18;5883:26;;5919:65;5981:1;5970:9;5966:17;5957:6;5919:65;:::i;:::-;5781:210;;;;:::o;5997:118::-;6084:24;6102:5;6084:24;:::i;:::-;6079:3;6072:37;5997:118;;:::o;6121:222::-;6214:4;6252:2;6241:9;6237:18;6229:26;;6265:71;6333:1;6322:9;6318:17;6309:6;6265:71;:::i;:::-;6121:222;;;;:::o;6349:329::-;6408:6;6457:2;6445:9;6436:7;6432:23;6428:32;6425:119;;;6463:79;;:::i;:::-;6425:119;6583:1;6608:53;6653:7;6644:6;6633:9;6629:22;6608:53;:::i;:::-;6598:63;;6554:117;6349:329;;;;:::o;6684:86::-;6719:7;6759:4;6752:5;6748:16;6737:27;;6684:86;;;:::o;6776:112::-;6859:22;6875:5;6859:22;:::i;:::-;6854:3;6847:35;6776:112;;:::o;6894:866::-;7145:4;7183:3;7172:9;7168:19;7160:27;;7197:71;7265:1;7254:9;7250:17;7241:6;7197:71;:::i;:::-;7278:72;7346:2;7335:9;7331:18;7322:6;7278:72;:::i;:::-;7360;7428:2;7417:9;7413:18;7404:6;7360:72;:::i;:::-;7442;7510:2;7499:9;7495:18;7486:6;7442:72;:::i;:::-;7524:73;7592:3;7581:9;7577:19;7568:6;7524:73;:::i;:::-;7607:69;7671:3;7660:9;7656:19;7647:6;7607:69;:::i;:::-;7686:67;7748:3;7737:9;7733:19;7724:6;7686:67;:::i;:::-;6894:866;;;;;;;;;;:::o;7766:474::-;7834:6;7842;7891:2;7879:9;7870:7;7866:23;7862:32;7859:119;;;7897:79;;:::i;:::-;7859:119;8017:1;8042:53;8087:7;8078:6;8067:9;8063:22;8042:53;:::i;:::-;8032:63;;7988:117;8144:2;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8115:118;7766:474;;;;;:::o;8246:118::-;8317:22;8333:5;8317:22;:::i;:::-;8310:5;8307:33;8297:61;;8354:1;8351;8344:12;8297:61;8246:118;:::o;8370:135::-;8414:5;8452:6;8439:20;8430:29;;8468:31;8493:5;8468:31;:::i;:::-;8370:135;;;;:::o;8511:975::-;8606:6;8614;8622;8671:2;8659:9;8650:7;8646:23;8642:32;8639:119;;;8677:79;;:::i;:::-;8639:119;8825:1;8814:9;8810:17;8797:31;8855:18;8847:6;8844:30;8841:117;;;8877:79;;:::i;:::-;8841:117;8982:63;9037:7;9028:6;9017:9;9013:22;8982:63;:::i;:::-;8972:73;;8768:287;9122:2;9111:9;9107:18;9094:32;9153:18;9145:6;9142:30;9139:117;;;9175:79;;:::i;:::-;9139:117;9280:63;9335:7;9326:6;9315:9;9311:22;9280:63;:::i;:::-;9270:73;;9065:288;9392:2;9418:51;9461:7;9452:6;9441:9;9437:22;9418:51;:::i;:::-;9408:61;;9363:116;8511:975;;;;;:::o;9492:180::-;9540:77;9537:1;9530:88;9637:4;9634:1;9627:15;9661:4;9658:1;9651:15;9678:410;9718:7;9741:20;9759:1;9741:20;:::i;:::-;9736:25;;9775:20;9793:1;9775:20;:::i;:::-;9770:25;;9830:1;9827;9823:9;9852:30;9870:11;9852:30;:::i;:::-;9841:41;;10031:1;10022:7;10018:15;10015:1;10012:22;9992:1;9985:9;9965:83;9942:139;;10061:18;;:::i;:::-;9942:139;9726:362;9678:410;;;;:::o;10094:191::-;10134:3;10153:20;10171:1;10153:20;:::i;:::-;10148:25;;10187:20;10205:1;10187:20;:::i;:::-;10182:25;;10230:1;10227;10223:9;10216:16;;10251:3;10248:1;10245:10;10242:36;;;10258:18;;:::i;:::-;10242:36;10094:191;;;;:::o;10291:180::-;10339:77;10336:1;10329:88;10436:4;10433:1;10426:15;10460:4;10457:1;10450:15;10477:185;10517:1;10534:20;10552:1;10534:20;:::i;:::-;10529:25;;10568:20;10586:1;10568:20;:::i;:::-;10563:25;;10607:1;10597:35;;10612:18;;:::i;:::-;10597:35;10654:1;10651;10647:9;10642:14;;10477:185;;;;:::o;10668:194::-;10708:4;10728:20;10746:1;10728:20;:::i;:::-;10723:25;;10762:20;10780:1;10762:20;:::i;:::-;10757:25;;10806:1;10803;10799:9;10791:17;;10830:1;10824:4;10821:11;10818:37;;;10835:18;;:::i;:::-;10818:37;10668:194;;;;:::o;10868:143::-;10925:5;10956:6;10950:13;10941:22;;10972:33;10999:5;10972:33;:::i;:::-;10868:143;;;;:::o;11017:351::-;11087:6;11136:2;11124:9;11115:7;11111:23;11107:32;11104:119;;;11142:79;;:::i;:::-;11104:119;11262:1;11287:64;11343:7;11334:6;11323:9;11319:22;11287:64;:::i;:::-;11277:74;;11233:128;11017:351;;;;:::o;11374:332::-;11495:4;11533:2;11522:9;11518:18;11510:26;;11546:71;11614:1;11603:9;11599:17;11590:6;11546:71;:::i;:::-;11627:72;11695:2;11684:9;11680:18;11671:6;11627:72;:::i;:::-;11374:332;;;;;:::o;11712:116::-;11782:21;11797:5;11782:21;:::i;:::-;11775:5;11772:32;11762:60;;11818:1;11815;11808:12;11762:60;11712:116;:::o;11834:137::-;11888:5;11919:6;11913:13;11904:22;;11935:30;11959:5;11935:30;:::i;:::-;11834:137;;;;:::o;11977:345::-;12044:6;12093:2;12081:9;12072:7;12068:23;12064:32;12061:119;;;12099:79;;:::i;:::-;12061:119;12219:1;12244:61;12297:7;12288:6;12277:9;12273:22;12244:61;:::i;:::-;12234:71;;12190:125;11977:345;;;;:::o;12328:169::-;12412:11;12446:6;12441:3;12434:19;12486:4;12481:3;12477:14;12462:29;;12328:169;;;;:::o;12503:182::-;12643:34;12639:1;12631:6;12627:14;12620:58;12503:182;:::o;12691:366::-;12833:3;12854:67;12918:2;12913:3;12854:67;:::i;:::-;12847:74;;12930:93;13019:3;12930:93;:::i;:::-;13048:2;13043:3;13039:12;13032:19;;12691:366;;;:::o;13063:419::-;13229:4;13267:2;13256:9;13252:18;13244:26;;13316:9;13310:4;13306:20;13302:1;13291:9;13287:17;13280:47;13344:131;13470:4;13344:131;:::i;:::-;13336:139;;13063:419;;;:::o;13488:99::-;13540:6;13574:5;13568:12;13558:22;;13488:99;;;:::o;13593:139::-;13682:6;13677:3;13672;13666:23;13723:1;13714:6;13709:3;13705:16;13698:27;13593:139;;;:::o;13738:377::-;13826:3;13854:39;13887:5;13854:39;:::i;:::-;13909:71;13973:6;13968:3;13909:71;:::i;:::-;13902:78;;13989:65;14047:6;14042:3;14035:4;14028:5;14024:16;13989:65;:::i;:::-;14079:29;14101:6;14079:29;:::i;:::-;14074:3;14070:39;14063:46;;13830:285;13738:377;;;;:::o;14121:514::-;14282:4;14320:2;14309:9;14305:18;14297:26;;14369:9;14363:4;14359:20;14355:1;14344:9;14340:17;14333:47;14397:78;14470:4;14461:6;14397:78;:::i;:::-;14389:86;;14522:9;14516:4;14512:20;14507:2;14496:9;14492:18;14485:48;14550:78;14623:4;14614:6;14550:78;:::i;:::-;14542:86;;14121:514;;;;;:::o;14641:332::-;14762:4;14800:2;14789:9;14785:18;14777:26;;14813:71;14881:1;14870:9;14866:17;14857:6;14813:71;:::i;:::-;14894:72;14962:2;14951:9;14947:18;14938:6;14894:72;:::i;:::-;14641:332;;;;;:::o;14979:442::-;15128:4;15166:2;15155:9;15151:18;15143:26;;15179:71;15247:1;15236:9;15232:17;15223:6;15179:71;:::i;:::-;15260:72;15328:2;15317:9;15313:18;15304:6;15260:72;:::i;:::-;15342;15410:2;15399:9;15395:18;15386:6;15342:72;:::i;:::-;14979:442;;;;;;:::o;15427:112::-;15499:7;15528:5;15517:16;;15427:112;;;:::o;15545:60::-;15573:3;15594:5;15587:12;;15545:60;;;:::o;15611:212::-;15696:9;15729:88;15747:69;15756:59;15809:5;15756:59;:::i;:::-;15747:69;:::i;:::-;15729:88;:::i;:::-;15716:101;;15611:212;;;:::o;15829:201::-;15951:72;16017:5;15951:72;:::i;:::-;15946:3;15939:85;15829:201;;:::o;16036:805::-;16288:4;16326:3;16315:9;16311:19;16303:27;;16376:9;16370:4;16366:20;16362:1;16351:9;16347:17;16340:47;16404:78;16477:4;16468:6;16404:78;:::i;:::-;16396:86;;16529:9;16523:4;16519:20;16514:2;16503:9;16499:18;16492:48;16557:78;16630:4;16621:6;16557:78;:::i;:::-;16549:86;;16645:107;16748:2;16737:9;16733:18;16724:6;16645:107;:::i;:::-;16762:72;16830:2;16819:9;16815:18;16806:6;16762:72;:::i;:::-;16036:805;;;;;;;:::o;16847:233::-;16886:3;16909:24;16927:5;16909:24;:::i;:::-;16900:33;;16955:66;16948:5;16945:77;16942:103;;17025:18;;:::i;:::-;16942:103;17072:1;17065:5;17061:13;17054:20;;16847:233;;;:::o;17086:225::-;17226:34;17222:1;17214:6;17210:14;17203:58;17295:8;17290:2;17282:6;17278:15;17271:33;17086:225;:::o;17317:366::-;17459:3;17480:67;17544:2;17539:3;17480:67;:::i;:::-;17473:74;;17556:93;17645:3;17556:93;:::i;:::-;17674:2;17669:3;17665:12;17658:19;;17317:366;;;:::o;17689:419::-;17855:4;17893:2;17882:9;17878:18;17870:26;;17942:9;17936:4;17932:20;17928:1;17917:9;17913:17;17906:47;17970:131;18096:4;17970:131;:::i;:::-;17962:139;;17689:419;;;:::o
Swarm Source
ipfs://93ef636bfaaaa679efb0f569576488e868077f5278996690e693efa227e0516d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$91.21
Net Worth in ETH
0.047747
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,910.1 | 0.0477 | $91.21 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.