Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Network
Overview
Max Total Supply
98,799.999997999999799151 YFN
Holders
189 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.4 YFNValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Token
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-07 */ // File: @openzeppelin/upgrades/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts-ethereum-package/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is Initializable, IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ function initialize(string memory name, string memory symbol, uint8 decimals) public initializer { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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. * * 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 returns (uint8) { return _decimals; } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @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 {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of 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 Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), 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}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); 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 returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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 returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, 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 * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(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 { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts-ethereum-package/contracts/access/roles/MinterRole.sol pragma solidity ^0.5.0; contract MinterRole is Initializable, Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; function initialize(address sender) public initializer { if (!isMinter(sender)) { _addMinter(sender); } } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Mintable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole}, * which have permission to mint (create) new tokens as they see fit. * * At construction, the deployer of the contract is the only minter. */ contract ERC20Mintable is Initializable, ERC20, MinterRole { function initialize(address sender) public initializer { MinterRole.initialize(sender); } /** * @dev See {ERC20-_mint}. * * Requirements: * * - the caller must have the {MinterRole}. */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount); return true; } uint256[50] private ______gap; } // File: contracts/ERC20Stakes.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that implements a basic ERC20 staking * with incentive distribution. */ contract ERC20Stakes is Initializable, ERC20 { using SafeMath for uint256; // TODO change to real uint256 private _holdPeriod; // = 2 minutes; uint256 private _dailyPercent; // = 1; // 1% uint256 private _basePeriod; // = 30 seconds uint256 private _dailyPeriod; // = // 1 day event StakeCreate(address indexed stakeholder, uint256 stake); event StakeHold(address indexed stakeholder); event StakeWithdraw(address indexed stakeholder, uint256 reward); struct Stake { uint256 amount; uint256 stakedAt; uint256 heldAt; } /** * @dev stakeholders list */ address[] private _stakeholders; /** * @dev the stakes for each stakeholder. */ mapping(address => Stake) private _stakes; modifier onlyStakeExists(address stakeholder) { require(_stakes[stakeholder].amount > 0, "Stake: no stake yet"); require(_stakes[stakeholder].heldAt == 0, "Stake: stake canceled"); require(_stakes[stakeholder].stakedAt < now, "Stake: stake just created"); _; } modifier onlyNoStakeYet(address stakeholder) { require(_stakes[stakeholder].amount == 0, "Stake: stake exists"); _; } modifier onlyStakeUnheld(address stakeholder) { require(_stakes[stakeholder].heldAt > _stakes[stakeholder].stakedAt, "Stake: stake not exists or not canceled"); require(_stakes[stakeholder].heldAt + _holdPeriod <= now, "Stake: stake on hold"); _; } function initialize(uint256 basePeriod, uint256 holdPeriod, uint256 annualPercent, uint256 annualPeriod) public initializer { _stakeParams(basePeriod, holdPeriod, annualPercent, annualPeriod); } function _stakeParams(uint256 basePeriod, uint256 holdPeriod, uint256 dailyPercent, uint256 dailyPeriod) internal { _holdPeriod = holdPeriod; _dailyPercent = dailyPercent; _basePeriod = basePeriod; _dailyPeriod = dailyPeriod.mul(100); } function stakeBasePeriod() external view returns (uint256) { return _basePeriod; } function stakeHoldPeriod() external view returns (uint256) { return _holdPeriod; } function stakeAnnualPercent() external view returns (uint256) { return _dailyPercent; } function stakeDailyPeriod() external view returns (uint256) { return _dailyPeriod / 100; } /** * @dev A method for a stakeholder to create a stake */ function createStake(uint256 stake) external { _createStake(_msgSender(), stake); } /** * @dev A method for a stakeholder to remove a stake */ function cancelStake() external { _holdStake(_msgSender()); } /** * @dev A method to allow a stakeholder to withdraw his rewards. */ function withdrawStake() external { _removeStake(_msgSender()); } /** * @dev internal method for a stakeholder to create a stake. * @param stakeholder Stakeholder address * @param stake The size of the stake to be created. */ function _createStake(address stakeholder, uint256 stake) internal onlyNoStakeYet(stakeholder) { _burn(stakeholder, stake); _stakes[stakeholder] = Stake({ amount : stake, stakedAt : now, heldAt : 0 }); _addStakeholder(stakeholder); emit StakeCreate(stakeholder, stake); } /** * @dev internal method for a stakeholder to hold a stake. * @param stakeholder Stakeholder address */ function _holdStake(address stakeholder) internal onlyStakeExists(stakeholder) { _stakes[stakeholder].heldAt = now; emit StakeHold(stakeholder); } /** * @dev internal method for a stakeholder to remove a stake. * @param stakeholder Stakeholder address */ function _removeStake(address stakeholder) internal onlyStakeUnheld(stakeholder) { uint256 reward = _reward(stakeholder, _stakes[stakeholder].heldAt); uint256 stake = _stakes[stakeholder].amount; delete _stakes[stakeholder]; _removeStakeholder(stakeholder); _mint(stakeholder, stake.add(reward)); emit StakeWithdraw(stakeholder, reward); } /** * @dev A method to retrieve the stake for a stakeholder. * @param stakeholder The stakeholder to retrieve the stake for. * @return uint256 The amount of wei staked. */ function stakeOf(address stakeholder) public view returns (uint256){ return _stakes[stakeholder].amount; } function stakeDetails(address stakeholder) public view returns (uint256, uint256){ return (_stakes[stakeholder].stakedAt, _stakes[stakeholder].heldAt); } function rewardOf(address stakeholder) public view returns(uint256) { if (_stakes[stakeholder].stakedAt == 0) return 0; return _reward(stakeholder, _stakes[stakeholder].heldAt == 0 ? now : _stakes[stakeholder].heldAt); } function _reward(address stakeholder, uint rewardedAt) internal view returns(uint256) { // total stake period in days uint256 period = ((rewardedAt - _stakes[stakeholder].stakedAt) / _basePeriod) * _basePeriod; // reward for period according to daily percent value return _stakes[stakeholder].amount.mul(period).mul(_dailyPercent) / _dailyPeriod; } /** * @dev A method to the aggregated stakes from all stakeholders. * @return uint256 The aggregated stakes from all stakeholders. */ function totalStakes() public view returns (uint256) { uint256 _totalStakes = 0; for (uint256 s = 0; s < _stakeholders.length; s++) { _totalStakes = _totalStakes.add(_stakes[_stakeholders[s]].amount); } return _totalStakes; } /** * @dev A method to check if an address is a stakeholder. * @param stakeholder The address to verify. * @return bool, uint256 Whether the address is a stakeholder, * and if so its position in the stakeholders array. */ function isStakeholder(address stakeholder) public view returns (bool, uint256) { for (uint256 s = 0; s < _stakeholders.length; s++) { if (stakeholder == _stakeholders[s]) return (true, s); } return (false, 0); } /** * @dev A method to add a stakeholder. * @param stakeholder The stakeholder to add. */ function _addStakeholder(address stakeholder) internal { (bool _isStakeholder,) = isStakeholder(stakeholder); if (!_isStakeholder) _stakeholders.push(stakeholder); } /** * @dev A method to remove a stakeholder. * @param stakeholder The stakeholder to remove. */ function _removeStakeholder(address stakeholder) internal { (bool _isStakeholder, uint256 s) = isStakeholder(stakeholder); if (_isStakeholder) { _stakeholders[s] = _stakeholders[_stakeholders.length - 1]; _stakeholders.pop(); } } uint256[50] private ______gap; } // File: contracts/Token.sol pragma solidity ^0.5.0; //import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Burnable.sol"; contract Token is Initializable, Ownable, ERC20Stakes, ERC20Detailed, ERC20Mintable { function initialize(string memory name, string memory symbol, uint8 decimals, uint256 initialSupply, address initialHolder, uint256 stakeBasePeriod, uint256 stakeHoldPeriod, uint256 stakeDailyPercent, uint256 stakeDailyPeriod) public initializer { Ownable.initialize(initialHolder); ERC20Detailed.initialize(name, symbol, decimals); // Mint the initial supply _mint(initialHolder, initialSupply); // * 10 ** uint256(decimals) // Initialize the minter roles, and renounce them ERC20Mintable.initialize(initialHolder); // uint256 constant _holdPeriod = 2 minutes; // uint256 constant _dailyPercent = 1; // 1% // uint256 constant _basePeriod = 30 seconds; // uint256 constant _dailyPeriod = 1 day; ERC20Stakes.initialize(stakeBasePeriod, stakeHoldPeriod, stakeDailyPercent, stakeDailyPeriod); } /** * @dev non payable default function * * prevents to receive eth by direct transfer to contract */ function() external {} /** * @dev allow minter to burn tokens from any account */ function burn(address account, uint256 amount) public onlyMinter returns (bool) { _burn(account, amount); return true; } function stakeParams(uint256 basePeriod, uint256 holdPeriod, uint256 dailyPercent, uint256 dailyPeriod) external onlyOwner { _stakeParams(basePeriod, holdPeriod, dailyPercent, dailyPeriod); } uint256[50] private ______gap; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeholder","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"}],"name":"StakeCreate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeholder","type":"address"}],"name":"StakeHold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeholder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"StakeWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"cancelStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"stake","type":"uint256"}],"name":"createStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"basePeriod","type":"uint256"},{"internalType":"uint256","name":"holdPeriod","type":"uint256"},{"internalType":"uint256","name":"annualPercent","type":"uint256"},{"internalType":"uint256","name":"annualPeriod","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"initialHolder","type":"address"},{"internalType":"uint256","name":"stakeBasePeriod","type":"uint256"},{"internalType":"uint256","name":"stakeHoldPeriod","type":"uint256"},{"internalType":"uint256","name":"stakeDailyPercent","type":"uint256"},{"internalType":"uint256","name":"stakeDailyPeriod","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakeholder","type":"address"}],"name":"isStakeholder","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakeholder","type":"address"}],"name":"rewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakeAnnualPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakeBasePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakeDailyPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakeholder","type":"address"}],"name":"stakeDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakeHoldPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakeholder","type":"address"}],"name":"stakeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"basePeriod","type":"uint256"},{"internalType":"uint256","name":"holdPeriod","type":"uint256"},{"internalType":"uint256","name":"dailyPercent","type":"uint256"},{"internalType":"uint256","name":"dailyPeriod","type":"uint256"}],"name":"stakeParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052613ee7806100136000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80638da5cb5b11610130578063b7b8e917116100b8578063ca9ce2911161007c578063ca9ce29114610d3e578063dd62ed3e14610d48578063ef037b9014610dc0578063f2fde38b14610e23578063fa2a9da914610e6757610227565b8063b7b8e91714610c68578063bed9d86114610cb4578063bf9befb114610cbe578063c4d66de814610cdc578063c540a7d114610d2057610227565b806398650275116100ff5780639865027514610ad05780639dc29fac14610ada578063a457c2d714610b40578063a9059cbb14610ba6578063aa271e1a14610c0c57610227565b80638da5cb5b1461099d5780638f32d59b146109e757806395d89b4114610a09578063983b2d5614610a8c57610227565b8063387cbdb7116101b3578063599d64e911610182578063599d64e91461071f57806360a2da441461073d5780636f34dc5b1461078957806370a082311461093b578063715018a61461099357610227565b8063387cbdb7146105dd57806339509351146105fb57806340c10f191461066157806342623360146106c757610227565b80631bf6ddae116101fa5780631bf6ddae1461048f5780631d62ebd9146104bd578063219244dd1461051557806323b872dd14610533578063313ce567146105b957610227565b806306fdde0314610229578063095ea7b3146102ac5780631624f6c61461031257806318160ddd14610471575b005b610231610ec6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610271578082015181840152602081019050610256565b50505050905090810190601f16801561029e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f8600480360360408110156102c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f68565b604051808215151515815260200191505060405180910390f35b61046f6004803603606081101561032857600080fd5b810190808035906020019064010000000081111561034557600080fd5b82018360208201111561035757600080fd5b8035906020019184600183028401116401000000008311171561037957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103dc57600080fd5b8201836020820111156103ee57600080fd5b8035906020019184600183028401116401000000008311171561041057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050610f86565b005b6104796110d1565b6040518082815260200191505060405180910390f35b6104bb600480360360208110156104a557600080fd5b81019080803590602001909291905050506110db565b005b6104ff600480360360208110156104d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110ef565b6040518082815260200191505060405180910390f35b61051d6111e9565b6040518082815260200191505060405180910390f35b61059f6004803603606081101561054957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111f3565b604051808215151515815260200191505060405180910390f35b6105c16112cc565b604051808260ff1660ff16815260200191505060405180910390f35b6105e56112e3565b6040518082815260200191505060405180910390f35b6106476004803603604081101561061157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ed565b604051808215151515815260200191505060405180910390f35b6106ad6004803603604081101561067757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a0565b604051808215151515815260200191505060405180910390f35b610709600480360360208110156106dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141b565b6040518082815260200191505060405180910390f35b610727611467565b6040518082815260200191505060405180910390f35b6107876004803603608081101561075357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611471565b005b61093960048036036101208110156107a057600080fd5b81019080803590602001906401000000008111156107bd57600080fd5b8201836020820111156107cf57600080fd5b803590602001918460018302840111640100000000831117156107f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561085457600080fd5b82018360208201111561086657600080fd5b8035906020019184600183028401116401000000008311171561088857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611580565b005b61097d6004803603602081101561095157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bb565b6040518082815260200191505060405180910390f35b61099b611704565b005b6109a561183f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109ef611869565b604051808215151515815260200191505060405180910390f35b610a116118c8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a51578082015181840152602081019050610a36565b50505050905090810190601f168015610a7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ace60048036036020811015610aa257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061196a565b005b610ad86119db565b005b610b2660048036036040811015610af057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119ed565b604051808215151515815260200191505060405180910390f35b610b8c60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a68565b604051808215151515815260200191505060405180910390f35b610bf260048036036040811015610bbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b35565b604051808215151515815260200191505060405180910390f35b610c4e60048036036020811015610c2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b53565b604051808215151515815260200191505060405180910390f35b610cb260048036036080811015610c7e57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611b71565b005b610cbc611bfd565b005b610cc6611c0f565b6040518082815260200191505060405180910390f35b610d1e60048036036020811015610cf257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ccc565b005b610d28611dd5565b6040518082815260200191505060405180910390f35b610d46611de9565b005b610daa60048036036040811015610d5e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dfb565b6040518082815260200191505060405180910390f35b610e0260048036036020811015610dd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e82565b60405180831515151581526020018281526020019250505060405180910390f35b610e6560048036036020811015610e3957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f2e565b005b610ea960048036036020811015610e7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb4565b604051808381526020018281526020019250505060405180910390f35b606060d38054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b6000610f7c610f75612046565b848461204e565b6001905092915050565b600060019054906101000a900460ff1680610fa55750610fa4612245565b5b80610fbc57506000809054906101000a900460ff16155b611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611061576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8360d39080519060200190611077929190613bba565b508260d4908051906020019061108e929190613bba565b508160d560006101000a81548160ff021916908360ff16021790555080156110cb5760008060016101000a81548160ff0219169083151502179055505b50505050565b6000606854905090565b6110ec6110e6612046565b8261225c565b50565b60008060a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561114457600090506111e4565b6111e182600060a060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154146111da5760a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546111dc565b425b6123f7565b90505b919050565b6000609b54905090565b60006112008484846124cd565b6112c18461120c612046565b6112bc85604051806060016040528060288152602001613dac60289139606760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611272612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b61204e565b600190509392505050565b600060d560009054906101000a900460ff16905090565b6000609d54905090565b60006113966112fa612046565b84611391856067600061130b612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b61204e565b6001905092915050565b60006113b26113ad612046565b611b53565b611407576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b61141183836128cf565b6001905092915050565b600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000609c54905090565b600060019054906101000a900460ff1680611490575061148f612245565b5b806114a757506000809054906101000a900460ff16155b6114fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561154c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61155885858585612a8c565b80156115795760008060016101000a81548160ff0219169083151502179055505b5050505050565b600060019054906101000a900460ff168061159f575061159e612245565b5b806115b657506000809054906101000a900460ff16155b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561165b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61166486612ac1565b61166f8a8a8a610f86565b61167986886128cf565b61168286611ccc565b61168e85858585611471565b80156116af5760008060016101000a81548160ff0219169083151502179055505b50505050505050505050565b6000606660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170c611869565b61177e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118ac612046565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060d48054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b61197a611975612046565b611b53565b6119cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b6119d881612c7f565b50565b6119eb6119e6612046565b612cda565b565b60006119ff6119fa612046565b611b53565b611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b611a5e8383612d35565b6001905092915050565b6000611b2b611a75612046565b84611b2685604051806060016040528060258152602001613e8e6025913960676000611a9f612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b61204e565b6001905092915050565b6000611b49611b42612046565b84846124cd565b6001905092915050565b6000611b6a82610108612eef90919063ffffffff16565b9050919050565b611b79611869565b611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611bf784848484612a8c565b50505050565b611c0d611c08612046565b612fcd565b565b6000806000905060008090505b609f80549050811015611cc457611cb560a06000609f8481548110611c3d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548361284790919063ffffffff16565b91508080600101915050611c1c565b508091505090565b600060019054906101000a900460ff1680611ceb5750611cea612245565b5b80611d0257506000809054906101000a900460ff16155b611d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611da7576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611db0826132d0565b8015611dd15760008060016101000a81548160ff0219169083151502179055505b5050565b60006064609e5481611de357fe5b04905090565b611df9611df4612046565b6133e7565b565b6000606760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008060008090505b609f80549050811015611f1d57609f8181548110611ea557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f10576001819250925050611f29565b8080600101915050611e8b565b50600080809050915091505b915091565b611f36611869565b611fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611fb18161369d565b50565b60008060a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015491509150915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e6a6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613cf26022913960400191505060405180910390fd5b80606760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000803090506000813b9050600081149250505090565b81600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414612315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5374616b653a207374616b65206578697374730000000000000000000000000081525060200191505060405180910390fd5b61231f8383612d35565b6040518060600160405280838152602001428152602001600081525060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506123a4836137e3565b8273ffffffffffffffffffffffffffffffffffffffff167f8915595eb58a6a6bf41eb9635929fc76b8e27c299f418d35d2727b8142cd5e90836040518082815260200191505060405180910390a2505050565b600080609d54609d5460a060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015485038161244c57fe5b04029050609e546124bc609c546124ae8460a060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461386190919063ffffffff16565b61386190919063ffffffff16565b816124c357fe5b0491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612553576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e456025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c606023913960400191505060405180910390fd5b61264581604051806060016040528060268152602001613d1460269139606660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126da81606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127f95780820151818401526020810190506127de565b50505050905090810190601f1680156128265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808284019050838110156128c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6129878160685461284790919063ffffffff16565b6068819055506129df81606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b82609b8190555081609c8190555083609d81905550612ab560648261386190919063ffffffff16565b609e8190555050505050565b600060019054906101000a900460ff1680612ae05750612adf612245565b5b80612af757506000809054906101000a900460ff16155b612b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612b9c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38015612c7b5760008060016101000a81548160ff0219169083151502179055505b5050565b612c94816101086138e790919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b612cef816101086139c290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e246021913960400191505060405180910390fd5b612e2781604051806060016040528060228152602001613c8360229139606660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e7f81606854613a7f90919063ffffffff16565b606881905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dd46022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8060a060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154116130aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613ca56027913960400191505060405180910390fd5b42609b5460a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154011115613166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5374616b653a207374616b65206f6e20686f6c6400000000000000000000000081525060200191505060405180910390fd5b60006131b48360a060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546123f7565b9050600060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055505061326084613ac9565b61327c84613277848461284790919063ffffffff16565b6128cf565b8373ffffffffffffffffffffffffffffffffffffffff167f1248d48e2de900a1010c7fce73506969ecec243600bfc08b641b158f26d857cd836040518082815260200191505060405180910390a250505050565b600060019054906101000a900460ff16806132ef57506132ee612245565b5b8061330657506000809054906101000a900460ff16155b61335b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156133ab576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6133b482611b53565b6133c2576133c182612c7f565b5b80156133e35760008060016101000a81548160ff0219169083151502179055505b5050565b80600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116134a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5374616b653a206e6f207374616b65207965740000000000000000000000000081525060200191505060405180910390fd5b600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015414613558576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5374616b653a207374616b652063616e63656c6564000000000000000000000081525060200191505060405180910390fd5b4260a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541061360f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374616b653a207374616b65206a75737420637265617465640000000000000081525060200191505060405180910390fd5b4260a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f42549297d4130b561bf55291c0aaedc0050cd4bc739be20b58090af3d85f4fd960405160405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613723576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ccc6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006137ee82611e82565b5090508061385d57609f8290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b5050565b60008083141561387457600090506138e1565b600082840290508284828161388557fe5b04146138dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d8b6021913960400191505060405180910390fd5b809150505b92915050565b6138f18282612eef565b15613964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6139cc8282612eef565b613a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d6a6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000613ac183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612787565b905092915050565b600080613ad583611e82565b915091508115613bb557609f6001609f805490500381548110613af457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f8281548110613b2c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550609f805480613b7f57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bfb57805160ff1916838001178555613c29565b82800160010185558215613c29579182015b82811115613c28578251825591602001919060010190613c0d565b5b509050613c369190613c3a565b5090565b613c5c91905b80821115613c58576000816000905550600101613c40565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63655374616b653a207374616b65206e6f7420657869737473206f72206e6f742063616e63656c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582033b2a67d02525462280889b36edc38bb43d04960e215f206b48ecf47637a36b064736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80638da5cb5b11610130578063b7b8e917116100b8578063ca9ce2911161007c578063ca9ce29114610d3e578063dd62ed3e14610d48578063ef037b9014610dc0578063f2fde38b14610e23578063fa2a9da914610e6757610227565b8063b7b8e91714610c68578063bed9d86114610cb4578063bf9befb114610cbe578063c4d66de814610cdc578063c540a7d114610d2057610227565b806398650275116100ff5780639865027514610ad05780639dc29fac14610ada578063a457c2d714610b40578063a9059cbb14610ba6578063aa271e1a14610c0c57610227565b80638da5cb5b1461099d5780638f32d59b146109e757806395d89b4114610a09578063983b2d5614610a8c57610227565b8063387cbdb7116101b3578063599d64e911610182578063599d64e91461071f57806360a2da441461073d5780636f34dc5b1461078957806370a082311461093b578063715018a61461099357610227565b8063387cbdb7146105dd57806339509351146105fb57806340c10f191461066157806342623360146106c757610227565b80631bf6ddae116101fa5780631bf6ddae1461048f5780631d62ebd9146104bd578063219244dd1461051557806323b872dd14610533578063313ce567146105b957610227565b806306fdde0314610229578063095ea7b3146102ac5780631624f6c61461031257806318160ddd14610471575b005b610231610ec6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610271578082015181840152602081019050610256565b50505050905090810190601f16801561029e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f8600480360360408110156102c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f68565b604051808215151515815260200191505060405180910390f35b61046f6004803603606081101561032857600080fd5b810190808035906020019064010000000081111561034557600080fd5b82018360208201111561035757600080fd5b8035906020019184600183028401116401000000008311171561037957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103dc57600080fd5b8201836020820111156103ee57600080fd5b8035906020019184600183028401116401000000008311171561041057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050610f86565b005b6104796110d1565b6040518082815260200191505060405180910390f35b6104bb600480360360208110156104a557600080fd5b81019080803590602001909291905050506110db565b005b6104ff600480360360208110156104d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110ef565b6040518082815260200191505060405180910390f35b61051d6111e9565b6040518082815260200191505060405180910390f35b61059f6004803603606081101561054957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111f3565b604051808215151515815260200191505060405180910390f35b6105c16112cc565b604051808260ff1660ff16815260200191505060405180910390f35b6105e56112e3565b6040518082815260200191505060405180910390f35b6106476004803603604081101561061157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ed565b604051808215151515815260200191505060405180910390f35b6106ad6004803603604081101561067757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a0565b604051808215151515815260200191505060405180910390f35b610709600480360360208110156106dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141b565b6040518082815260200191505060405180910390f35b610727611467565b6040518082815260200191505060405180910390f35b6107876004803603608081101561075357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611471565b005b61093960048036036101208110156107a057600080fd5b81019080803590602001906401000000008111156107bd57600080fd5b8201836020820111156107cf57600080fd5b803590602001918460018302840111640100000000831117156107f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561085457600080fd5b82018360208201111561086657600080fd5b8035906020019184600183028401116401000000008311171561088857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611580565b005b61097d6004803603602081101561095157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bb565b6040518082815260200191505060405180910390f35b61099b611704565b005b6109a561183f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109ef611869565b604051808215151515815260200191505060405180910390f35b610a116118c8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a51578082015181840152602081019050610a36565b50505050905090810190601f168015610a7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ace60048036036020811015610aa257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061196a565b005b610ad86119db565b005b610b2660048036036040811015610af057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119ed565b604051808215151515815260200191505060405180910390f35b610b8c60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a68565b604051808215151515815260200191505060405180910390f35b610bf260048036036040811015610bbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b35565b604051808215151515815260200191505060405180910390f35b610c4e60048036036020811015610c2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b53565b604051808215151515815260200191505060405180910390f35b610cb260048036036080811015610c7e57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611b71565b005b610cbc611bfd565b005b610cc6611c0f565b6040518082815260200191505060405180910390f35b610d1e60048036036020811015610cf257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ccc565b005b610d28611dd5565b6040518082815260200191505060405180910390f35b610d46611de9565b005b610daa60048036036040811015610d5e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dfb565b6040518082815260200191505060405180910390f35b610e0260048036036020811015610dd657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e82565b60405180831515151581526020018281526020019250505060405180910390f35b610e6560048036036020811015610e3957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f2e565b005b610ea960048036036020811015610e7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb4565b604051808381526020018281526020019250505060405180910390f35b606060d38054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b6000610f7c610f75612046565b848461204e565b6001905092915050565b600060019054906101000a900460ff1680610fa55750610fa4612245565b5b80610fbc57506000809054906101000a900460ff16155b611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611061576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8360d39080519060200190611077929190613bba565b508260d4908051906020019061108e929190613bba565b508160d560006101000a81548160ff021916908360ff16021790555080156110cb5760008060016101000a81548160ff0219169083151502179055505b50505050565b6000606854905090565b6110ec6110e6612046565b8261225c565b50565b60008060a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561114457600090506111e4565b6111e182600060a060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154146111da5760a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546111dc565b425b6123f7565b90505b919050565b6000609b54905090565b60006112008484846124cd565b6112c18461120c612046565b6112bc85604051806060016040528060288152602001613dac60289139606760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611272612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b61204e565b600190509392505050565b600060d560009054906101000a900460ff16905090565b6000609d54905090565b60006113966112fa612046565b84611391856067600061130b612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b61204e565b6001905092915050565b60006113b26113ad612046565b611b53565b611407576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b61141183836128cf565b6001905092915050565b600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000609c54905090565b600060019054906101000a900460ff1680611490575061148f612245565b5b806114a757506000809054906101000a900460ff16155b6114fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561154c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61155885858585612a8c565b80156115795760008060016101000a81548160ff0219169083151502179055505b5050505050565b600060019054906101000a900460ff168061159f575061159e612245565b5b806115b657506000809054906101000a900460ff16155b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561165b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61166486612ac1565b61166f8a8a8a610f86565b61167986886128cf565b61168286611ccc565b61168e85858585611471565b80156116af5760008060016101000a81548160ff0219169083151502179055505b50505050505050505050565b6000606660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170c611869565b61177e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118ac612046565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060d48054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b61197a611975612046565b611b53565b6119cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b6119d881612c7f565b50565b6119eb6119e6612046565b612cda565b565b60006119ff6119fa612046565b611b53565b611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d3a6030913960400191505060405180910390fd5b611a5e8383612d35565b6001905092915050565b6000611b2b611a75612046565b84611b2685604051806060016040528060258152602001613e8e6025913960676000611a9f612046565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b61204e565b6001905092915050565b6000611b49611b42612046565b84846124cd565b6001905092915050565b6000611b6a82610108612eef90919063ffffffff16565b9050919050565b611b79611869565b611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611bf784848484612a8c565b50505050565b611c0d611c08612046565b612fcd565b565b6000806000905060008090505b609f80549050811015611cc457611cb560a06000609f8481548110611c3d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548361284790919063ffffffff16565b91508080600101915050611c1c565b508091505090565b600060019054906101000a900460ff1680611ceb5750611cea612245565b5b80611d0257506000809054906101000a900460ff16155b611d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611da7576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611db0826132d0565b8015611dd15760008060016101000a81548160ff0219169083151502179055505b5050565b60006064609e5481611de357fe5b04905090565b611df9611df4612046565b6133e7565b565b6000606760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008060008090505b609f80549050811015611f1d57609f8181548110611ea557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f10576001819250925050611f29565b8080600101915050611e8b565b50600080809050915091505b915091565b611f36611869565b611fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611fb18161369d565b50565b60008060a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015491509150915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e6a6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613cf26022913960400191505060405180910390fd5b80606760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000803090506000813b9050600081149250505090565b81600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414612315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5374616b653a207374616b65206578697374730000000000000000000000000081525060200191505060405180910390fd5b61231f8383612d35565b6040518060600160405280838152602001428152602001600081525060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506123a4836137e3565b8273ffffffffffffffffffffffffffffffffffffffff167f8915595eb58a6a6bf41eb9635929fc76b8e27c299f418d35d2727b8142cd5e90836040518082815260200191505060405180910390a2505050565b600080609d54609d5460a060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015485038161244c57fe5b04029050609e546124bc609c546124ae8460a060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461386190919063ffffffff16565b61386190919063ffffffff16565b816124c357fe5b0491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612553576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e456025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c606023913960400191505060405180910390fd5b61264581604051806060016040528060268152602001613d1460269139606660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126da81606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127f95780820151818401526020810190506127de565b50505050905090810190601f1680156128265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808284019050838110156128c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6129878160685461284790919063ffffffff16565b6068819055506129df81606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284790919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b82609b8190555081609c8190555083609d81905550612ab560648261386190919063ffffffff16565b609e8190555050505050565b600060019054906101000a900460ff1680612ae05750612adf612245565b5b80612af757506000809054906101000a900460ff16155b612b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612b9c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38015612c7b5760008060016101000a81548160ff0219169083151502179055505b5050565b612c94816101086138e790919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b612cef816101086139c290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e246021913960400191505060405180910390fd5b612e2781604051806060016040528060228152602001613c8360229139606660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127879092919063ffffffff16565b606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e7f81606854613a7f90919063ffffffff16565b606881905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dd46022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8060a060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015460a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154116130aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613ca56027913960400191505060405180910390fd5b42609b5460a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154011115613166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5374616b653a207374616b65206f6e20686f6c6400000000000000000000000081525060200191505060405180910390fd5b60006131b48360a060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546123f7565b9050600060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060a060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055505061326084613ac9565b61327c84613277848461284790919063ffffffff16565b6128cf565b8373ffffffffffffffffffffffffffffffffffffffff167f1248d48e2de900a1010c7fce73506969ecec243600bfc08b641b158f26d857cd836040518082815260200191505060405180910390a250505050565b600060019054906101000a900460ff16806132ef57506132ee612245565b5b8061330657506000809054906101000a900460ff16155b61335b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613df6602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156133ab576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6133b482611b53565b6133c2576133c182612c7f565b5b80156133e35760008060016101000a81548160ff0219169083151502179055505b5050565b80600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116134a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5374616b653a206e6f207374616b65207965740000000000000000000000000081525060200191505060405180910390fd5b600060a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015414613558576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5374616b653a207374616b652063616e63656c6564000000000000000000000081525060200191505060405180910390fd5b4260a060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541061360f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374616b653a207374616b65206a75737420637265617465640000000000000081525060200191505060405180910390fd5b4260a060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f42549297d4130b561bf55291c0aaedc0050cd4bc739be20b58090af3d85f4fd960405160405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613723576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ccc6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006137ee82611e82565b5090508061385d57609f8290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b5050565b60008083141561387457600090506138e1565b600082840290508284828161388557fe5b04146138dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d8b6021913960400191505060405180910390fd5b809150505b92915050565b6138f18282612eef565b15613964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6139cc8282612eef565b613a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613d6a6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000613ac183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612787565b905092915050565b600080613ad583611e82565b915091508115613bb557609f6001609f805490500381548110613af457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f8281548110613b2c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550609f805480613b7f57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bfb57805160ff1916838001178555613c29565b82800160010185558215613c29579182015b82811115613c28578251825591602001919060010190613c0d565b5b509050613c369190613c3a565b5090565b613c5c91905b80821115613c58576000816000905550600101613c40565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63655374616b653a207374616b65206e6f7420657869737473206f72206e6f742063616e63656c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582033b2a67d02525462280889b36edc38bb43d04960e215f206b48ecf47637a36b064736f6c63430005110032
Deployed Bytecode Sourcemap
35397:1637:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35397:1637:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9646:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9646:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18757:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9390:186;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9390:186:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9390:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9390:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9390:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9390:186:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9390:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9390:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9390:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9390:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17778:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30510:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30510:97:0;;;;;;;;;;;;;;;;;:::i;:::-;;32858:243;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32858:243:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30117:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19381:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19381:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10498:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30015:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20094:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20094:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27567:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27567:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32555:120;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32555:120:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30219:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29512:208;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29512:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35490:908;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;35490:908:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;35490:908:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35490:908:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;35490:908:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;35490:908:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;35490:908:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35490:908:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;35490:908:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;35490:908:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17932:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17932:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5180:140;;;:::i;:::-;;4367:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4733:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9848:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9848:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26399:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26399:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;26499:79;;;:::i;:::-;;36637:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36637:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20807:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20807:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18255:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18255:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26282:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26282:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36788:205;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36788:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30860:79;;;:::i;:::-;;33663:279;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27319:103;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27319:103:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30326:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30691:75;;;:::i;:::-;;18476:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18476:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34207:257;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34207:257:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5475:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5475:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;32683:167;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32683:167:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;9646:83;9683:13;9716:5;9709:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9646:83;:::o;18757:152::-;18823:4;18840:39;18849:12;:10;:12::i;:::-;18863:7;18872:6;18840:8;:39::i;:::-;18897:4;18890:11;;18757:152;;;;:::o;9390:186::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;9506:4;9498:5;:12;;;;;;;;;;;;:::i;:::-;;9531:6;9521:7;:16;;;;;;;;;;;;:::i;:::-;;9560:8;9548:9;;:20;;;;;;;;;;;;;;;;;;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;9390:186;;;;:::o;17778:91::-;17822:7;17849:12;;17842:19;;17778:91;:::o;30510:97::-;30566:33;30579:12;:10;:12::i;:::-;30593:5;30566:12;:33::i;:::-;30510:97;:::o;32858:243::-;32917:7;32974:1;32941:7;:20;32949:11;32941:20;;;;;;;;;;;;;;;:29;;;:34;32937:48;;;32984:1;32977:8;;;;32937:48;33003:90;33011:11;33055:1;33024:7;:20;33032:11;33024:20;;;;;;;;;;;;;;;:27;;;:32;:68;;33065:7;:20;33073:11;33065:20;;;;;;;;;;;;;;;:27;;;33024:68;;;33059:3;33024:68;33003:7;:90::i;:::-;32996:97;;32858:243;;;;:::o;30117:96::-;30167:7;30194:11;;30187:18;;30117:96;:::o;19381:304::-;19470:4;19487:36;19497:6;19505:9;19516:6;19487:9;:36::i;:::-;19534:121;19543:6;19551:12;:10;:12::i;:::-;19565:89;19603:6;19565:89;;;;;;;;;;;;;;;;;:11;:19;19577:6;19565:19;;;;;;;;;;;;;;;:33;19585:12;:10;:12::i;:::-;19565:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;19534:8;:121::i;:::-;19673:4;19666:11;;19381:304;;;;;:::o;10498:83::-;10539:5;10564:9;;;;;;;;;;;10557:16;;10498:83;:::o;30015:96::-;30065:7;30092:11;;30085:18;;30015:96;:::o;20094:210::-;20174:4;20191:83;20200:12;:10;:12::i;:::-;20214:7;20223:50;20262:10;20223:11;:25;20235:12;:10;:12::i;:::-;20223:25;;;;;;;;;;;;;;;:34;20249:7;20223:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;20191:8;:83::i;:::-;20292:4;20285:11;;20094:210;;;;:::o;27567:143::-;27641:4;26179:22;26188:12;:10;:12::i;:::-;26179:8;:22::i;:::-;26171:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27658:22;27664:7;27673:6;27658:5;:22::i;:::-;27698:4;27691:11;;27567:143;;;;:::o;32555:120::-;32614:7;32640;:20;32648:11;32640:20;;;;;;;;;;;;;;;:27;;;32633:34;;32555:120;;;:::o;30219:101::-;30272:7;30299:13;;30292:20;;30219:101;:::o;29512:208::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;29647:65;29660:10;29672;29684:13;29699:12;29647;:65::i;:::-;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;29512:208;;;;;:::o;35490:908::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;35756:33;35775:13;35756:18;:33::i;:::-;35800:48;35825:4;35831:6;35839:8;35800:24;:48::i;:::-;35895:35;35901:13;35916;35895:5;:35::i;:::-;36031:39;36056:13;36031:24;:39::i;:::-;36295:93;36318:15;36335;36352:17;36371:16;36295:22;:93::i;:::-;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;35490:908;;;;;;;;;;:::o;17932:110::-;17989:7;18016:9;:18;18026:7;18016:18;;;;;;;;;;;;;;;;18009:25;;17932:110;;;:::o;5180:140::-;4579:9;:7;:9::i;:::-;4571:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5279:1;5242:40;;5263:6;;;;;;;;;;;5242:40;;;;;;;;;;;;5310:1;5293:6;;:19;;;;;;;;;;;;;;;;;;5180:140::o;4367:79::-;4405:7;4432:6;;;;;;;;;;;4425:13;;4367:79;:::o;4733:94::-;4773:4;4813:6;;;;;;;;;;;4797:22;;:12;:10;:12::i;:::-;:22;;;4790:29;;4733:94;:::o;9848:87::-;9887:13;9920:7;9913:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9848:87;:::o;26399:92::-;26179:22;26188:12;:10;:12::i;:::-;26179:8;:22::i;:::-;26171:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26464:19;26475:7;26464:10;:19::i;:::-;26399:92;:::o;26499:79::-;26543:27;26557:12;:10;:12::i;:::-;26543:13;:27::i;:::-;26499:79::o;36637:143::-;36711:4;26179:22;26188:12;:10;:12::i;:::-;26179:8;:22::i;:::-;26171:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36728:22;36734:7;36743:6;36728:5;:22::i;:::-;36768:4;36761:11;;36637:143;;;;:::o;20807:261::-;20892:4;20909:129;20918:12;:10;:12::i;:::-;20932:7;20941:96;20980:15;20941:96;;;;;;;;;;;;;;;;;:11;:25;20953:12;:10;:12::i;:::-;20941:25;;;;;;;;;;;;;;;:34;20967:7;20941:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20909:8;:129::i;:::-;21056:4;21049:11;;20807:261;;;;:::o;18255:158::-;18324:4;18341:42;18351:12;:10;:12::i;:::-;18365:9;18376:6;18341:9;:42::i;:::-;18401:4;18394:11;;18255:158;;;;:::o;26282:109::-;26338:4;26362:21;26375:7;26362:8;:12;;:21;;;;:::i;:::-;26355:28;;26282:109;;;:::o;36788:205::-;4579:9;:7;:9::i;:::-;4571:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36922:63;36935:10;36947;36959:12;36973:11;36922:12;:63::i;:::-;36788:205;;;;:::o;30860:79::-;30905:26;30918:12;:10;:12::i;:::-;30905;:26::i;:::-;30860:79::o;33663:279::-;33707:7;33727:20;33750:1;33727:24;;33767:9;33779:1;33767:13;;33762:143;33786:13;:20;;;;33782:1;:24;33762:143;;;33843:50;33860:7;:25;33868:13;33882:1;33868:16;;;;;;;;;;;;;;;;;;;;;;;;;33860:25;;;;;;;;;;;;;;;:32;;;33843:12;:16;;:50;;;;:::i;:::-;33828:65;;33808:3;;;;;;;33762:143;;;;33922:12;33915:19;;;33663:279;:::o;27319:103::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;27385:29;27407:6;27385:21;:29::i;:::-;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;27319:103;;:::o;30326:104::-;30377:7;30419:3;30404:12;;:18;;;;;;30397:25;;30326:104;:::o;30691:75::-;30734:24;30745:12;:10;:12::i;:::-;30734:10;:24::i;:::-;30691:75::o;18476:134::-;18548:7;18575:11;:18;18587:5;18575:18;;;;;;;;;;;;;;;:27;18594:7;18575:27;;;;;;;;;;;;;;;;18568:34;;18476:134;;;;:::o;34207:257::-;34272:4;34278:7;34303:9;34315:1;34303:13;;34298:131;34322:13;:20;;;;34318:1;:24;34298:131;;;34383:13;34397:1;34383:16;;;;;;;;;;;;;;;;;;;;;;;;;34368:31;;:11;:31;;;34364:53;;;34409:4;34415:1;34401:16;;;;;;;34364:53;34344:3;;;;;;;34298:131;;;;34447:5;34454:1;34439:17;;;;;;;34207:257;;;;:::o;5475:109::-;4579:9;:7;:9::i;:::-;4571:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5548:28;5567:8;5548:18;:28::i;:::-;5475:109;:::o;32683:167::-;32747:7;32756;32783;:20;32791:11;32783:20;;;;;;;;;;;;;;;:29;;;32814:7;:20;32822:11;32814:20;;;;;;;;;;;;;;;:27;;;32775:67;;;;32683:167;;;:::o;3046:98::-;3091:15;3126:10;3119:17;;3046:98;:::o;23738:338::-;23849:1;23832:19;;:5;:19;;;;23824:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23930:1;23911:21;;:7;:21;;;;23903:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24014:6;23984:11;:18;23996:5;23984:18;;;;;;;;;;;;;;;:27;24003:7;23984:27;;;;;;;;;;;;;;;:36;;;;24052:7;24036:32;;24045:5;24036:32;;;24061:6;24036:32;;;;;;;;;;;;;;;;;;23738:338;;;:::o;1519:508::-;1566:4;1913:12;1936:4;1913:28;;1948:10;1994:4;1982:17;1976:23;;2020:1;2014:2;:7;2007:14;;;;1519:508;:::o;31136:367::-;31218:11;29171:1;29140:7;:20;29148:11;29140:20;;;;;;;;;;;;;;;:27;;;:32;29132:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31242:25;31248:11;31261:5;31242;:25::i;:::-;31301:105;;;;;;;;31331:5;31301:105;;;;31362:3;31301:105;;;;31389:1;31301:105;;;31278:7;:20;31286:11;31278:20;;;;;;;;;;;;;;;:128;;;;;;;;;;;;;;;;;;;;;;;;;;;31417:28;31433:11;31417:15;:28::i;:::-;31473:11;31461:32;;;31487:5;31461:32;;;;;;;;;;;;;;;;;;31136:367;;;:::o;33109:389::-;33186:7;33245:14;33325:11;;33310;;33277:7;:20;33285:11;33277:20;;;;;;;;;;;;;;;:29;;;33264:10;:42;33263:58;;;;;;33262:74;33245:91;;33478:12;;33417:58;33461:13;;33417:39;33449:6;33417:7;:20;33425:11;33417:20;;;;;;;;;;;;;;;:27;;;:31;;:39;;;;:::i;:::-;:43;;:58;;;;:::i;:::-;:73;;;;;;33410:80;;;33109:389;;;;:::o;21558:471::-;21674:1;21656:20;;:6;:20;;;;21648:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21758:1;21737:23;;:9;:23;;;;21729:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21833;21855:6;21833:71;;;;;;;;;;;;;;;;;:9;:17;21843:6;21833:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;21813:9;:17;21823:6;21813:17;;;;;;;;;;;;;;;:91;;;;21938:32;21963:6;21938:9;:20;21948:9;21938:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;21915:9;:20;21925:9;21915:20;;;;;;;;;;;;;;;:55;;;;22003:9;21986:35;;21995:6;21986:35;;;22014:6;21986:35;;;;;;;;;;;;;;;;;;21558:471;;;:::o;12495:192::-;12581:7;12614:1;12609;:6;;12617:12;12601:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12601:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12641:9;12657:1;12653;:5;12641:17;;12678:1;12671:8;;;12495:192;;;;;:::o;11566:181::-;11624:7;11644:9;11660:1;11656;:5;11644:17;;11685:1;11680;:6;;11672:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11738:1;11731:8;;;11566:181;;;;:::o;22310:308::-;22405:1;22386:21;;:7;:21;;;;22378:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22471:24;22488:6;22471:12;;:16;;:24;;;;:::i;:::-;22456:12;:39;;;;22527:30;22550:6;22527:9;:18;22537:7;22527:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;22506:9;:18;22516:7;22506:18;;;;;;;;;;;;;;;:51;;;;22594:7;22573:37;;22590:1;22573:37;;;22603:6;22573:37;;;;;;;;;;;;;;;;;;22310:308;;:::o;29730:277::-;29869:10;29855:11;:24;;;;29906:12;29890:13;:28;;;;29943:10;29929:11;:24;;;;29979:20;29995:3;29979:11;:15;;:20;;;;:::i;:::-;29964:12;:35;;;;29730:277;;;;:::o;4141:145::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;4216:6;4207;;:15;;;;;;;;;;;;;;;;;;4271:6;;;;;;;;;;;4238:40;;4267:1;4238:40;;;;;;;;;;;;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;4141:145;;:::o;26586:122::-;26643:21;26656:7;26643:8;:12;;:21;;;;:::i;:::-;26692:7;26680:20;;;;;;;;;;;;26586:122;:::o;26716:130::-;26776:24;26792:7;26776:8;:15;;:24;;;;:::i;:::-;26830:7;26816:22;;;;;;;;;;;;26716:130;:::o;22950:348::-;23045:1;23026:21;;:7;:21;;;;23018:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23119:68;23142:6;23119:68;;;;;;;;;;;;;;;;;:9;:18;23129:7;23119:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;23098:9;:18;23108:7;23098:18;;;;;;;;;;;;;;;:89;;;;23213:24;23230:6;23213:12;;:16;;:24;;;;:::i;:::-;23198:12;:39;;;;23279:1;23253:37;;23262:7;23253:37;;;23283:6;23253:37;;;;;;;;;;;;;;;;;;22950:348;;:::o;25429:203::-;25501:4;25545:1;25526:21;;:7;:21;;;;25518:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25604:4;:11;;:20;25616:7;25604:20;;;;;;;;;;;;;;;;;;;;;;;;;25597:27;;25429:203;;;;:::o;31948:398::-;32016:11;29319:7;:20;29327:11;29319:20;;;;;;;;;;;;;;;:29;;;29289:7;:20;29297:11;29289:20;;;;;;;;;;;;;;;:27;;;:59;29281:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:3;29441:11;;29411:7;:20;29419:11;29411:20;;;;;;;;;;;;;;;:27;;;:41;:48;;29403:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32040:14;32057:49;32065:11;32078:7;:20;32086:11;32078:20;;;;;;;;;;;;;;;:27;;;32057:7;:49::i;:::-;32040:66;;32117:13;32133:7;:20;32141:11;32133:20;;;;;;;;;;;;;;;:27;;;32117:43;;32178:7;:20;32186:11;32178:20;;;;;;;;;;;;;;;;32171:27;;;;;;;;;;;;;;;;;;;;32209:31;32228:11;32209:18;:31::i;:::-;32251:37;32257:11;32270:17;32280:6;32270:5;:9;;:17;;;;:::i;:::-;32251:5;:37::i;:::-;32318:11;32304:34;;;32331:6;32304:34;;;;;;;;;;;;;;;;;;29495:1;;31948:398;;:::o;25989:141::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;26060:16;26069:6;26060:8;:16::i;:::-;26055:68;;26093:18;26104:6;26093:10;:18::i;:::-;26055:68;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;25989:141;;:::o;31640:169::-;31706:11;28862:1;28832:7;:20;28840:11;28832:20;;;;;;;;;;;;;;;:27;;;:31;28824:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28937:1;28906:7;:20;28914:11;28906:20;;;;;;;;;;;;;;;:27;;;:32;28898:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29015:3;28983:7;:20;28991:11;28983:20;;;;;;;;;;;;;;;:29;;;:35;28975:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31760:3;31730:7;:20;31738:11;31730:20;;;;;;;;;;;;;;;:27;;:33;;;;31789:11;31779:22;;;;;;;;;;;;31640:169;;:::o;5690:229::-;5784:1;5764:22;;:8;:22;;;;5756:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5874:8;5845:38;;5866:6;;;;;;;;;;;5845:38;;;;;;;;;;;;5903:8;5894:6;;:17;;;;;;;;;;;;;;;;;;5690:229;:::o;34585:188::-;34652:19;34676:26;34690:11;34676:13;:26::i;:::-;34651:51;;;34718:14;34713:52;;34734:13;34753:11;34734:31;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;34734:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34713:52;34585:188;;:::o;12938:471::-;12996:7;13246:1;13241;:6;13237:47;;;13271:1;13264:8;;;;13237:47;13296:9;13312:1;13308;:5;13296:17;;13341:1;13336;13332;:5;;;;;;:10;13324:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13400:1;13393:8;;;12938:471;;;;;:::o;24893:178::-;24971:18;24975:4;24981:7;24971:3;:18::i;:::-;24970:19;24962:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25059:4;25036;:11;;:20;25048:7;25036:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24893:178;;:::o;25151:183::-;25231:18;25235:4;25241:7;25231:3;:18::i;:::-;25223:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25321:5;25298:4;:11;;:20;25310:7;25298:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25151:183;;:::o;12022:136::-;12080:7;12107:43;12111:1;12114;12107:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;12100:50;;12022:136;;;;:::o;34900:287::-;34970:19;34991:9;35004:26;35018:11;35004:13;:26::i;:::-;34969:61;;;;35045:14;35041:139;;;35095:13;35132:1;35109:13;:20;;;;:24;35095:39;;;;;;;;;;;;;;;;;;;;;;;;;35076:13;35090:1;35076:16;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;35149:13;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35041:139;34900:287;;;:::o;35397:1637::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://33b2a67d02525462280889b36edc38bb43d04960e215f206b48ecf47637a36b0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.