Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000,000 TBC
Holders
26
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
39,990,000,000 TBCValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheBeeConservancy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-13 */ /** *Submitted for verification at Etherscan.io on 2021-08-12 */ // SPDX-License-Identifier: UNLICENSED // IERC20.sol pragma solidity ^0.6.2; /* 💝 SAVE THE BEES! 💝 TBC Token - The Bee Conservancy is a Charity Token that Rewards Holders for helping to save the Bees! Team TomorrowWontExist will be donating to the https://thebeeconservancy.org/ on an ongoing Basis 🔶 Officially Stealth Launched!!! 🌎 Website https://liveinthenowmovement.com/collections/bee/bee 💝 Help Save the Bees and Bee Rewarded with 8% ETH Reflections! Did you know that a ton of your favorite things wouldn't exist without Bees? 🤖 Telegram https://t.me/TBCToken ✅ Seasoned Contract for Trending! ✅ Rewards & Buy Backs! ✅ Huge Marketing Lined Up! ✅ 1ETH Initial locked Liquidity! ✅ REAL Charity with ongoing proof of Donations Sent - 1st Donation will be Sent August 23rd! 🚀🚀 DON’T MISS OUT ON THE NEXT 1000X 🚀🚀 🔥 Tokenomics - 15% Tax 💰 8% wETH Reflections (Dividends paid every Hour) 💫 4% Marketing & Charity ⭐️ 3% Buybacks - Auto LP 🗣 Community Driven Project and Economy 💯 Ownership Renounced 🔐 Liquidity Locked - Unruggable 🆔 Fully Doxed and Verified Dev Team (ScrawnyViking from TWE Token with Sustainble Housing Development) 💰 Don't miss out on our Weekly TWE Lottery Fair Launch @ https://tomorrowwontexist.com/twe-lottery-token 💰 🏘 Participate to help with building Safe Homes in the case of Natural Disasters @TWEToken */ pragma solidity ^0.6.2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // CONTEXT.sol pragma solidity ^0.6.2; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // uniswapV2Router pragma solidity ^0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // UNISWAP factory pragma solidity ^0.6.2; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // UNISWAP Pair pragma solidity ^0.6.2; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // IERC20Meta pragma solidity ^0.6.2; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // Ownable pragma solidity ^0.6.2; contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () public { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @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(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // SafeMath pragma solidity ^0.6.2; 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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // SafeMathInt pragma solidity ^0.6.2; /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } // SAFEMATHUINT pragma solidity ^0.6.2; /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } // IterableMapping pragma solidity ^0.6.2; library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } // ERC20 pragma solidity ^0.6.2; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.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 Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override 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 virtual override 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 virtual 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 virtual 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 virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _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 virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _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 internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // DividentInterface pragma solidity ^0.6.2; /// @title Dividend-Paying Token Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev An interface for a dividend-paying token contract. interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } // DividendPayingOptInterface pragma solidity ^0.6.2; /// @title Dividend-Paying Token Optional Interface /// @author Roger Wu (https://github.com/roger-wu) /// @dev OPTIONAL functions for a dividend-paying token contract. interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } pragma solidity ^0.6.2; /// @title Dividend-Paying Token /// @author Roger Wu (https://github.com/roger-wu) /// @dev A mintable ERC20 token that allows anyone to pay and distribute ether /// to token holders as dividends and allows token holders to withdraw their dividends. contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; address public immutable ETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // WETH // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) public ERC20(_name, _symbol) { } function distributeETHDividends(uint256 amount) public onlyOwner{ require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(msg.sender); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(ETH).transfer(user, _withdrawableDividend); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } contract TheBeeConservancy is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; TheBeeConservancyDividendTracker public dividendTracker; address public deadWallet = 0x000000000000000000000000000000000000dEaD; address public immutable ETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // WETH uint256 public swapTokensAtAmount = 2000000 * (10**18); uint256 public ETHRewardsFee = 8; uint256 public liquidityFee = 3; uint256 public marketingFee = 4; uint256 public totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee); address public _marketingWalletAddress = 0x5DD7313dE3786295688484b48D97Ed0D9F11bf73; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300000; // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 tokensSwapped, uint256 amount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); constructor() public ERC20("TheBeeConservancy | T.ME/TBCToken", "TBC") { dividendTracker = new TheBeeConservancyDividendTracker(); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // UNIv2 // Create a uniswap pair for this new token address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(owner()); dividendTracker.excludeFromDividends(deadWallet); dividendTracker.excludeFromDividends(address(_uniswapV2Router)); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(_marketingWalletAddress, true); excludeFromFees(address(this), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 1000000000000 * (10**18)); } receive() external payable { } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker), "TheBeeConservancy: The dividend tracker already has that address"); TheBeeConservancyDividendTracker newDividendTracker = TheBeeConservancyDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "TheBeeConservancy: The new dividend tracker must be owned by the TheBeeConservancy token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router), "TheBeeConservancy: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()) .createPair(address(this), uniswapV2Router.WETH()); uniswapV2Pair = _uniswapV2Pair; } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "TheBeeConservancy: Account is already the value of 'excluded'"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setMarketingWallet(address payable wallet) external onlyOwner{ _marketingWalletAddress = wallet; } function setETHRewardsFee(uint256 value) external onlyOwner{ ETHRewardsFee = value; totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee); } function setLiquiditFee(uint256 value) external onlyOwner{ liquidityFee = value; totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee); } function setMarketingFee(uint256 value) external onlyOwner{ marketingFee = value; totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair, "TheBeeConservancy: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "TheBeeConservancy: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue >= 200000 && newValue <= 500000, "TheBeeConservancy: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "TheBeeConservancy: Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function excludeFromDividends(address account) external onlyOwner{ dividendTracker.excludeFromDividends(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } function claim() external { dividendTracker.processAccount(msg.sender, false); } function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { super._transfer(from, to, 0); return; } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != owner() && to != owner() ) { swapping = true; uint256 marketingTokens = contractTokenBalance.mul(marketingFee).div(totalFees); swapAndSendToFee(marketingTokens); uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 sellTokens = balanceOf(address(this)); swapAndSendDividends(sellTokens); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if(takeFee) { uint256 fees = amount.mul(totalFees).div(100); if(automatedMarketMakerPairs[to]){ fees += amount.mul(1).div(100); } amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } function swapAndSendToFee(uint256 tokens) private { uint256 initialETHBalance = IERC20(ETH).balanceOf(address(this)); swapTokensForETH(tokens); uint256 newBalance = (IERC20(ETH).balanceOf(address(this))).sub(initialETHBalance); IERC20(ETH).transfer(_marketingWalletAddress, newBalance); } function swapAndLiquify(uint256 tokens) private { // split the contract balance into halves uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HALF swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](3); path[0] = address(this); path[1] = uniswapV2Router.WETH(); path[2] = ETH; _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0), block.timestamp ); } function swapAndSendDividends(uint256 tokens) private{ swapTokensForETH(tokens); uint256 dividends = IERC20(ETH).balanceOf(address(this)); bool success = IERC20(ETH).transfer(address(dividendTracker), dividends); if (success) { dividendTracker.distributeETHDividends(dividends); emit SendDividends(tokens, dividends); } } } contract TheBeeConservancyDividendTracker is Ownable, DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public immutable minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() public DividendPayingToken("TheBeeConservancy_Dividen_Tracker", "TheBeeConservancy_Dividend_Tracker") { claimWait = 3600; minimumTokenBalanceForDividends = 200000 * (10**18); //must hold 200000+ tokens } function _transfer(address, address, uint256) internal override { require(false, "TheBeeConservancy_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public override { require(false, "TheBeeConservancy_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main TheBeeConservancy contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "TheBeeConservancy_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "TheBeeConservancy_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TheBeeConservancyDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setETHRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526009805461dead6001600160a01b03199091161790557fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006080526a01a784379d99db42000000600a556008600b8190556003600c8190556004600d819055620000959290916200008191906200062c602090811b6200229717901c565b6200062c60201b620022971790919060201c565b600e55600f80546001600160a01b031916735dd7313de3786295688484b48d97ed0d9f11bf73179055620493e0601055348015620000d257600080fd5b50604051806060016040528060218152602001620067cc602191396040518060400160405280600381526020016254424360e81b81525081600390805190602001906200012192919062000a15565b5080516200013790600490602084019062000a15565b50505060006200014c6200068e60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620001a89062000a9a565b604051809103906000f080158015620001c5573d6000803e3d6000fd5b50600860006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024157600080fd5b505afa15801562000256573d6000803e3d6000fd5b505050506040513d60208110156200026d57600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b158015620002be57600080fd5b505afa158015620002d3573d6000803e3d6000fd5b505050506040513d6020811015620002ea57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200033d57600080fd5b505af115801562000352573d6000803e3d6000fd5b505050506040513d60208110156200036957600080fd5b5051600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620003aa81600162000692565b6008546040805163031e79db60e41b81526001600160a01b0390921660048301819052905190916331e79db091602480830192600092919082900301818387803b158015620003f857600080fd5b505af11580156200040d573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815230600482015290516001600160a01b0390921693506331e79db0925060248082019260009290919082900301818387803b1580156200045e57600080fd5b505af115801562000473573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db0905062000494620007c5565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015620004d457600080fd5b505af1158015620004e9573d6000803e3d6000fd5b50506008546009546040805163031e79db60e41b81526001600160a01b03928316600482015290519190921693506331e79db09250602480830192600092919082900301818387803b1580156200053f57600080fd5b505af115801562000554573d6000803e3d6000fd5b50506008546040805163031e79db60e41b81526001600160a01b03878116600483015291519190921693506331e79db09250602480830192600092919082900301818387803b158015620005a757600080fd5b505af1158015620005bc573d6000803e3d6000fd5b50505050620005dc620005d4620007c560201b60201c565b6001620007d4565b600f54620005f5906001600160a01b03166001620007d4565b62000602306001620007d4565b6200062462000610620007c5565b6c0c9f2c9cd04674edea4000000062000901565b505062000abf565b60008282018381101562000687576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b03821660009081526012602052604090205460ff1615158115151415620006f25760405162461bcd60e51b815260040180806020018281038252604b815260200180620067ed604b913960600191505060405180910390fd5b6001600160a01b0382166000908152601260205260409020805460ff1916821580159190911790915562000789576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b1580156200076f57600080fd5b505af115801562000784573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b620007de6200068e565b6005546001600160a01b0390811691161462000841576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff1615158115151415620008a15760405162461bcd60e51b815260040180806020018281038252603d81526020018062006838603d913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b6001600160a01b0382166200095d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200096b6000838362000a10565b62000987816002546200062c60201b620022971790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009ba918390620022976200062c821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a5857805160ff191683800117855562000a88565b8280016001018555821562000a88579182015b8281111562000a8857825182559160200191906001019062000a6b565b5062000a9692915062000aa8565b5090565b6123a9806200442383390190565b5b8082111562000a96576000815560010162000aa9565b60805160601c61392862000afb600039806115985280612c285280612cd25280612d9e5280612ea65280612f6f528061321a52506139286000f3fe6080604052600436106102cd5760003560e01c80638322fff211610175578063a8b9d240116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610ae8578063e98030c714610afd578063f27fd25414610b27578063f2fde38b14610b51576102d4565b8063c492f04614610a19578063dd62ed3e14610a98578063e2f4560514610ad3576102d4565b8063a8b9d24014610897578063a9059cbb146108ca578063ad56c13c14610903578063adefd90c14610981578063b62496f5146109ab578063c0246668146109de576102d4565b806395d89b411161012e57806395d89b41146107cf57806398118cb4146107e45780639a7a23d6146107f95780639c1b8af514610834578063a26579ad14610849578063a457c2d71461085e576102d4565b80638322fff21461071e57806385141a7714610733578063871c128d1461074857806388bdd9be146107725780638c0344db146107a55780638da5cb5b146107ba576102d4565b806345f579771161023457806364b0f653116101ed5780636b67c4df116101c75780636b67c4df14610697578063700bb191146106ac57806370a08231146106d6578063715018a614610709576102d4565b806364b0f6531461061c57806365b8dbc0146106315780636843cd8414610664576102d4565b806345f579771461053857806349bd5a5e146105625780634e71d92d146105775780634fbee1931461058c5780635d098b38146105bf578063625e764c146105f2576102d4565b80632c1f5216116102865780632c1f52161461046057806330bb4cff14610475578063313ce5671461048a57806331e79db0146104b557806339509351146104ea5780634144d9e414610523576102d4565b806306fdde03146102d9578063095ea7b31461036357806313114a9d146103b05780631694505e146103d757806318160ddd1461040857806323b872dd1461041d576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee610b84565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610328578181015183820152602001610310565b50505050905090810190601f1680156103555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036f57600080fd5b5061039c6004803603604081101561038657600080fd5b506001600160a01b038135169060200135610c1a565b604080519115158252519081900360200190f35b3480156103bc57600080fd5b506103c5610c38565b60408051918252519081900360200190f35b3480156103e357600080fd5b506103ec610c3e565b604080516001600160a01b039092168252519081900360200190f35b34801561041457600080fd5b506103c5610c4d565b34801561042957600080fd5b5061039c6004803603606081101561044057600080fd5b506001600160a01b03813581169160208101359091169060400135610c53565b34801561046c57600080fd5b506103ec610cda565b34801561048157600080fd5b506103c5610ce9565b34801561049657600080fd5b5061049f610d5f565b6040805160ff9092168252519081900360200190f35b3480156104c157600080fd5b506104e8600480360360208110156104d857600080fd5b50356001600160a01b0316610d64565b005b3480156104f657600080fd5b5061039c6004803603604081101561050d57600080fd5b506001600160a01b038135169060200135610e25565b34801561052f57600080fd5b506103ec610e73565b34801561054457600080fd5b506104e86004803603602081101561055b57600080fd5b5035610e82565b34801561056e57600080fd5b506103ec610f01565b34801561058357600080fd5b506104e8610f10565b34801561059857600080fd5b5061039c600480360360208110156105af57600080fd5b50356001600160a01b0316610f95565b3480156105cb57600080fd5b506104e8600480360360208110156105e257600080fd5b50356001600160a01b0316610fb3565b3480156105fe57600080fd5b506104e86004803603602081101561061557600080fd5b503561102d565b34801561062857600080fd5b506103c561109f565b34801561063d57600080fd5b506104e86004803603602081101561065457600080fd5b50356001600160a01b03166110e4565b34801561067057600080fd5b506103c56004803603602081101561068757600080fd5b50356001600160a01b0316611369565b3480156106a357600080fd5b506103c56113ec565b3480156106b857600080fd5b506104e8600480360360208110156106cf57600080fd5b50356113f2565b3480156106e257600080fd5b506103c5600480360360208110156106f957600080fd5b50356001600160a01b03166114d9565b34801561071557600080fd5b506104e86114f4565b34801561072a57600080fd5b506103ec611596565b34801561073f57600080fd5b506103ec6115ba565b34801561075457600080fd5b506104e86004803603602081101561076b57600080fd5b50356115c9565b34801561077e57600080fd5b506104e86004803603602081101561079557600080fd5b50356001600160a01b03166116e6565b3480156107b157600080fd5b506103c5611a3d565b3480156107c657600080fd5b506103ec611a43565b3480156107db57600080fd5b506102ee611a52565b3480156107f057600080fd5b506103c5611ab3565b34801561080557600080fd5b506104e86004803603604081101561081c57600080fd5b506001600160a01b0381351690602001351515611ab9565b34801561084057600080fd5b506103c5611b68565b34801561085557600080fd5b506103c5611b6e565b34801561086a57600080fd5b5061039c6004803603604081101561088157600080fd5b506001600160a01b038135169060200135611bb3565b3480156108a357600080fd5b506103c5600480360360208110156108ba57600080fd5b50356001600160a01b0316611c1b565b3480156108d657600080fd5b5061039c600480360360408110156108ed57600080fd5b506001600160a01b038135169060200135611c6c565b34801561090f57600080fd5b506109366004803603602081101561092657600080fd5b50356001600160a01b0316611c80565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561098d57600080fd5b506104e8600480360360208110156109a457600080fd5b5035611d60565b3480156109b757600080fd5b5061039c600480360360208110156109ce57600080fd5b50356001600160a01b0316611dd2565b3480156109ea57600080fd5b506104e860048036036040811015610a0157600080fd5b506001600160a01b0381351690602001351515611de7565b348015610a2557600080fd5b506104e860048036036040811015610a3c57600080fd5b810190602081018135640100000000811115610a5757600080fd5b820183602082011115610a6957600080fd5b80359060200191846020830284011164010000000083111715610a8b57600080fd5b9193509150351515611efd565b348015610aa457600080fd5b506103c560048036036040811015610abb57600080fd5b506001600160a01b038135811691602001351661201d565b348015610adf57600080fd5b506103c5612048565b348015610af457600080fd5b506103c561204e565b348015610b0957600080fd5b506104e860048036036020811015610b2057600080fd5b5035612093565b348015610b3357600080fd5b5061093660048036036020811015610b4a57600080fd5b5035612138565b348015610b5d57600080fd5b506104e860048036036020811015610b7457600080fd5b50356001600160a01b031661219e565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b5050505050905090565b6000610c2e610c276122f8565b84846122fc565b5060015b92915050565b600e5481565b6006546001600160a01b031681565b60025490565b6000610c608484846123e8565b610cd084610c6c6122f8565b610ccb85604051806060016040528060288152602001613744602891396001600160a01b038a16600090815260016020526040812090610caa6122f8565b6001600160a01b031681526020810191909152604001600020549190612869565b6122fc565b5060019392505050565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610d2e57600080fd5b505afa158015610d42573d6000803e3d6000fd5b505050506040513d6020811015610d5857600080fd5b5051905090565b601290565b610d6c6122f8565b6005546001600160a01b03908116911614610dbc576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546040805163031e79db60e41b81526001600160a01b038481166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015610e0a57600080fd5b505af1158015610e1e573d6000803e3d6000fd5b5050505050565b6000610c2e610e326122f8565b84610ccb8560016000610e436122f8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612297565b600f546001600160a01b031681565b610e8a6122f8565b6005546001600160a01b03908116911614610eda576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600b819055600d54600c54610efb9190610ef5908490612297565b90612297565b600e5550565b6007546001600160a01b031681565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b5050565b6001600160a01b031660009081526011602052604090205460ff1690565b610fbb6122f8565b6005546001600160a01b0390811691161461100b576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6110356122f8565b6005546001600160a01b03908116911614611085576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600d819055600c54600b54610efb918391610ef591612297565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610d2e57600080fd5b6110ec6122f8565b6005546001600160a01b0390811691161461113c576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156111895760405162461bcd60e51b81526004018080602001828103825260368152602001806138bd6036913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d602081101561124c57600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561131a57600080fd5b505af115801561132e573d6000803e3d6000fd5b505050506040513d602081101561134457600080fd5b5051600780546001600160a01b0319166001600160a01b039092169190911790555050565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b505192915050565b600d5481565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561144957600080fd5b505af115801561145d573d6000803e3d6000fd5b505050506040513d606081101561147357600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b6114fc6122f8565b6005546001600160a01b0390811691161461154c576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6009546001600160a01b031681565b6115d16122f8565b6005546001600160a01b03908116911614611621576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b62030d40811015801561163757506207a1208111155b6116725760405162461bcd60e51b815260040180806020018281038252604781526020018061378c6047913960600191505060405180910390fd5b6010548114156116b35760405162461bcd60e51b815260040180806020018281038252603f815260200180613859603f913960400191505060405180910390fd5b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b6116ee6122f8565b6005546001600160a01b0390811691161461173e576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546001600160a01b038281169116141561178b5760405162461bcd60e51b81526004018080602001828103825260408152602001806136986040913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d357600080fd5b505afa1580156117e7573d6000803e3d6000fd5b505050506040513d60208110156117fd57600080fd5b50516001600160a01b0316146118445760405162461bcd60e51b81526004018080602001828103825260618152602001806135b96061913960800191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561189357600080fd5b505af11580156118a7573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b1580156118f257600080fd5b505af1158015611906573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611921611a43565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561196057600080fd5b505af1158015611974573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b1580156119c657600080fd5b505af11580156119da573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b600b5481565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c105780601f10610be557610100808354040283529160200191610c10565b600c5481565b611ac16122f8565b6005546001600160a01b03908116911614611b11576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6007546001600160a01b0383811691161415611b5e5760405162461bcd60e51b81526004018080602001828103825260588152602001806136406058913960600191505060405180910390fd5b610f918282612900565b60105481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610d2e57600080fd5b6000610c2e611bc06122f8565b84610ccb856040518060600160405280602581526020016138986025913960016000611bea6122f8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612869565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b1580156113ba57600080fd5b6000610c2e611c796122f8565b84846123e8565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d610100811015611d1a57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b611d686122f8565b6005546001600160a01b03908116911614611db8576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600c819055600d54600b54610efb9190610ef59084612297565b60126020526000908152604090205460ff1681565b611def6122f8565b6005546001600160a01b03908116911614611e3f576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff1615158115151415611e9d5760405162461bcd60e51b815260040180806020018281038252603d81526020018061381c603d913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611f056122f8565b6005546001600160a01b03908116911614611f55576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b60005b82811015611faa578160116000868685818110611f7157fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611f58565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610d2e57600080fd5b61209b6122f8565b6005546001600160a01b039081169116146120eb576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b158015610e0a57600080fd5b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b158015611cef57600080fd5b6121a66122f8565b6005546001600160a01b039081169116146121f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6001600160a01b03811661223b5760405162461bcd60e51b81526004018080602001828103825260268152602001806135716026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000828201838110156122f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166123415760405162461bcd60e51b81526004018080602001828103825260248152602001806137f86024913960400191505060405180910390fd5b6001600160a01b0382166123865760405162461bcd60e51b81526004018080602001828103825260228152602001806135976022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661242d5760405162461bcd60e51b81526004018080602001828103825260258152602001806137d36025913960400191505060405180910390fd5b6001600160a01b0382166124725760405162461bcd60e51b815260040180806020018281038252602381526020018061354e6023913960400191505060405180910390fd5b806124885761248383836000612a2e565b612864565b6000612493306114d9565b600a54909150811080159081906124b45750600754600160a01b900460ff16155b80156124d957506001600160a01b03851660009081526012602052604090205460ff16155b80156124fe57506124e8611a43565b6001600160a01b0316856001600160a01b031614155b8015612523575061250d611a43565b6001600160a01b0316846001600160a01b031614155b156125b3576007805460ff60a01b1916600160a01b179055600e54600d5460009161255991612553908690612b89565b90612be2565b905061256481612c24565b6000612581600e54612553600c5487612b8990919063ffffffff16565b905061258c81612e13565b6000612597306114d9565b90506125a281612e99565b50506007805460ff60a01b19169055505b6007546001600160a01b03861660009081526011602052604090205460ff600160a01b90920482161591168061260157506001600160a01b03851660009081526011602052604090205460ff165b1561260a575060005b801561267b57600061262c6064612553600e5488612b8990919063ffffffff16565b6001600160a01b03871660009081526012602052604090205490915060ff1615612662576126606064612553876001612b89565b015b61266c8582613092565b9450612679873083612a2e565b505b612686868686612a2e565b6008546001600160a01b031663e30443bc876126a1816114d9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156126e757600080fd5b505af19250505080156126f8575060015b506008546001600160a01b031663e30443bc86612714816114d9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561275a57600080fd5b505af192505050801561276b575060015b50600754600160a01b900460ff1661286057601054600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b1580156127d157600080fd5b505af192505050801561280557506040513d60608110156127f157600080fd5b508051602082015160409092015190919060015b61280e5761285e565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505b505050565b600081848411156128f85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128bd5781810151838201526020016128a5565b50505050905090810190601f1680156128ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b03821660009081526012602052604090205460ff161515811515141561295e5760405162461bcd60e51b815260040180806020018281038252604b8152602001806136d8604b913960600191505060405180910390fd5b6001600160a01b0382166000908152601260205260409020805460ff191682158015919091179091556129f2576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b1580156129d957600080fd5b505af11580156129ed573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038316612a735760405162461bcd60e51b81526004018080602001828103825260258152602001806137d36025913960400191505060405180910390fd5b6001600160a01b038216612ab85760405162461bcd60e51b815260040180806020018281038252602381526020018061354e6023913960400191505060405180910390fd5b612ac3838383612864565b612b008160405180606001604052806026815260200161361a602691396001600160a01b0386166000908152602081905260409020549190612869565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612b2f9082612297565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082612b9857506000610c32565b82820282848281612ba557fe5b04146122f15760405162461bcd60e51b81526004018080602001828103825260218152602001806137236021913960400191505060405180910390fd5b60006122f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d4565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c9357600080fd5b505afa158015612ca7573d6000803e3d6000fd5b505050506040513d6020811015612cbd57600080fd5b50519050612cca82613139565b6000612d6f827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3d57600080fd5b505afa158015612d51573d6000803e3d6000fd5b505050506040513d6020811015612d6757600080fd5b505190613092565b600f546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519293507f00000000000000000000000000000000000000000000000000000000000000009091169163a9059cbb916044808201926020929091908290030181600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b6000612e20826002612be2565b90506000612e2e8383613092565b905047612e3a8361332f565b6000612e464783613092565b9050612e528382613495565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15050505050565b612ea281613139565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f1157600080fd5b505afa158015612f25573d6000803e3d6000fd5b505050506040513d6020811015612f3b57600080fd5b50516008546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519293506000927f00000000000000000000000000000000000000000000000000000000000000009092169163a9059cbb9160448082019260209290919082900301818787803b158015612fb957600080fd5b505af1158015612fcd573d6000803e3d6000fd5b505050506040513d6020811015612fe357600080fd5b50519050801561286457600854604080516351c2a0e360e01b81526004810185905290516001600160a01b03909216916351c2a0e39160248082019260009290919082900301818387803b15801561303a57600080fd5b505af115801561304e573d6000803e3d6000fd5b5050604080518681526020810186905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39450908190039091019150a1505050565b60006122f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612869565b600081836131235760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128bd5781810151838201526020016128a5565b50600083858161312f57fe5b0495945050505050565b60408051600380825260808201909252606091602082018380368337019050509050308160008151811061316957fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131bd57600080fd5b505afa1580156131d1573d6000803e3d6000fd5b505050506040513d60208110156131e757600080fd5b50518151829060019081106131f857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061324657fe5b6001600160a01b03928316602091820292909201015260065461326c91309116846122fc565b600654604051635c11d79560e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b0390971696635c11d795968a968a9594939092909160c40190602080880191028083838b5b838110156132f25781810151838201526020016132da565b505050509050019650505050505050600060405180830381600087803b15801561331b57600080fd5b505af1158015612860573d6000803e3d6000fd5b6040805160028082526060808301845292602083019080368337019050509050308160008151811061335d57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156133b157600080fd5b505afa1580156133c5573d6000803e3d6000fd5b505050506040513d60208110156133db57600080fd5b50518151829060019081106133ec57fe5b6001600160a01b03928316602091820292909201015260065461341291309116846122fc565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602087810191028083838b83156132f25781810151838201526020016132da565b6006546134ad9030906001600160a01b0316846122fc565b6006546040805163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905260848201524260a482015290516001600160a01b039092169163f305d71991849160c480830192606092919082900301818588803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b50505050506040513d606081101561354757600080fd5b5050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546865426565436f6e73657276616e63793a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520546865426565436f6e73657276616e637920746f6b656e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365546865426565436f6e73657276616e63793a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273546865426565436f6e73657276616e63793a20546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373546865426565436f6e73657276616e63793a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865426565436f6e73657276616e63793a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303045524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865426565436f6e73657276616e63793a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427546865426565436f6e73657276616e63793a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865426565436f6e73657276616e63793a2054686520726f7574657220616c72656164792068617320746861742061646472657373a2646970667358221220139824bd555c2d3488185ec28e5b7af2237fa5512ad549c56416be607d4085be64736f6c634300060c003360c06040527fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006080523480156200003557600080fd5b5060405180606001604052806021815260200162002366602191396040518060600160405280602281526020016200238760229139815182908290620000839060039060208501906200011c565b508051620000999060049060208401906200011c565b5050506000620000ae6200011860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060115550692a5a058fc295ed00000060a052620001b8565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015f57805160ff19168380011785556200018f565b828001600101855582156200018f579182015b828111156200018f57825182559160200191906001019062000172565b506200019d929150620001a1565b5090565b5b808211156200019d5760008155600101620001a2565b60805160601c60a05161217d620001e96000398061102b52806110f8525080610dee5280611ac4525061217d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638322fff211610125578063bc4c4b37116100ad578063e7841ec01161007c578063e7841ec01461067b578063e98030c714610683578063f2fde38b146106a0578063fbcbc0f1146106c6578063ffb2c479146106ec5761021c565b8063bc4c4b37146105eb578063be10b61414610619578063dd62ed3e14610621578063e30443bc1461064f5761021c565b806395d89b41116100f457806395d89b411461053f578063a457c2d714610547578063a8b9d24014610573578063a9059cbb14610599578063aafd847a146105c55761021c565b80638322fff2146104e557806385a6b3ae146105095780638da5cb5b1461051157806391b89fba146105195761021c565b806331e79db0116101a857806351c2a0e31161017757806351c2a0e31461048a5780636a474002146104a75780636f2789ec146104af57806370a08231146104b7578063715018a6146104dd5761021c565b806331e79db0146103a857806339509351146103d05780634e7b827f146103fc5780635183d6fd146104225761021c565b8063226cfa3d116101ef578063226cfa3d1461030057806323b872dd1461032657806327ce01471461035c5780633009a60914610382578063313ce5671461038a5761021c565b806306fdde0314610221578063095ea7b31461029e57806309bbedde146102de57806318160ddd146102f8575b600080fd5b610229610727565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ca600480360360408110156102b457600080fd5b506001600160a01b0381351690602001356107bd565b604080519115158252519081900360200190f35b6102e66107db565b60408051918252519081900360200190f35b6102e66107e1565b6102e66004803603602081101561031657600080fd5b50356001600160a01b03166107e7565b6102ca6004803603606081101561033c57600080fd5b506001600160a01b038135811691602081013590911690604001356107f9565b6102e66004803603602081101561037257600080fd5b50356001600160a01b0316610880565b6102e66108df565b6103926108e5565b6040805160ff9092168252519081900360200190f35b6103ce600480360360208110156103be57600080fd5b50356001600160a01b03166108ea565b005b6102ca600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610a46565b6102ca6004803603602081101561041257600080fd5b50356001600160a01b0316610a94565b61043f6004803603602081101561043857600080fd5b5035610aa9565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b6103ce600480360360208110156104a057600080fd5b5035610c08565b6103ce610cf2565b6102e6610d29565b6102e6600480360360208110156104cd57600080fd5b50356001600160a01b0316610d2f565b6103ce610d4a565b6104ed610dec565b604080516001600160a01b039092168252519081900360200190f35b6102e6610e10565b6104ed610e16565b6102e66004803603602081101561052f57600080fd5b50356001600160a01b0316610e25565b610229610e30565b6102ca6004803603604081101561055d57600080fd5b506001600160a01b038135169060200135610e91565b6102e66004803603602081101561058957600080fd5b50356001600160a01b0316610ef9565b6102ca600480360360408110156105af57600080fd5b506001600160a01b038135169060200135610f25565b6102e6600480360360208110156105db57600080fd5b50356001600160a01b0316610f39565b6102ca6004803603604081101561060157600080fd5b506001600160a01b0381351690602001351515610f54565b6102e6611029565b6102e66004803603604081101561063757600080fd5b506001600160a01b038135811691602001351661104d565b6103ce6004803603604081101561066557600080fd5b506001600160a01b038135169060200135611078565b6102e6611242565b6103ce6004803603602081101561069957600080fd5b5035611248565b6103ce600480360360208110156106b657600080fd5b50356001600160a01b0316611364565b61043f600480360360208110156106dc57600080fd5b50356001600160a01b031661145d565b6107096004803603602081101561070257600080fd5b50356115d0565b60408051938452602084019290925282820152519081900360600190f35b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b5050505050905090565b60006107d16107ca6116ce565b84846116d2565b5060015b92915050565b600a5490565b60025490565b60106020526000908152604090205481565b60006108068484846117be565b610876846108126116ce565b61087185604051806060016040528060288152602001612017602891396001600160a01b038a166000908152600160205260408120906108506116ce565b6001600160a01b0316815260208101919091526040016000205491906117f5565b6116d2565b5060019392505050565b6001600160a01b038116600090815260076020526040812054600160801b906108cf906108ca906108c46108bf6108b688610d2f565b6006549061188c565b6118ec565b906118fc565b61192f565b816108d657fe5b0490505b919050565b600e5481565b601290565b6108f26116ce565b6005546001600160a01b03908116911614610942576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff161561096857600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610996908290611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0383166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b1580156109f757600080fd5b505af4158015610a0b573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b60006107d1610a536116ce565b846108718560016000610a646116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061199b565b600f6020526000908152604090205460ff1681565b600080600080600080600080600a73ec4e387549b236e03de2b52e49b490fe3c10c59263deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b0757600080fd5b505af4158015610b1b573d6000803e3d6000fd5b505050506040513d6020811015610b3157600080fd5b50518910610b58575060009650600019955085945086935083925082915081905080610bfd565b6000600a73ec4e387549b236e03de2b52e49b490fe3c10c59263d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610bb457600080fd5b505af4158015610bc8573d6000803e3d6000fd5b505050506040513d6020811015610bde57600080fd5b50519050610beb8161145d565b98509850985098509850985098509850505b919395975091939597565b610c106116ce565b6005546001600160a01b03908116911614610c60576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610c6a6107e1565b11610c7457600080fd5b8015610cef57610ca5610c856107e1565b610c9383600160801b61188c565b81610c9a57fe5b60065491900461199b565b60065560408051828152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a2600954610ceb908261199b565b6009555b50565b60405162461bcd60e51b815260040180806020018281038252607f81526020018061205f607f913960800191505060405180910390fd5b60115481565b6001600160a01b031660009081526020819052604090205490565b610d526116ce565b6005546001600160a01b03908116911614610da2576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60095481565b6005546001600160a01b031690565b60006107d582610ef9565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60006107d1610e9e6116ce565b84610871856040518060600160405280602581526020016121236025913960016000610ec86116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906117f5565b6001600160a01b0381166000908152600860205260408120546107d590610f1f84610880565b906119f5565b60006107d1610f326116ce565b84846117be565b6001600160a01b031660009081526008602052604090205490565b6000610f5e6116ce565b6005546001600160a01b03908116911614610fae576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610fb984611a37565b9050801561101f576001600160a01b0384166000818152601060209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a360019150506107d5565b5060009392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110806116ce565b6005546001600160a01b039081169116146110d0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16156110f65761123e565b7f000000000000000000000000000000000000000000000000000000000000000081106111ac576111278282611942565b60408051632f0ad01760e21b8152600a60048201526001600160a01b038416602482015260448101839052905173ec4e387549b236e03de2b52e49b490fe3c10c5929163bc2b405c916064808301926000929190829003018186803b15801561118f57600080fd5b505af41580156111a3573d6000803e3d6000fd5b50505050611231565b6111b7826000611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0384166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b15801561121857600080fd5b505af415801561122c573d6000803e3d6000fd5b505050505b61123c826001610f54565b505b5050565b600e5490565b6112506116ce565b6005546001600160a01b039081169116146112a0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b610e1081101580156112b55750620151808111155b6112f05760405162461bcd60e51b8152600401808060200182810382526057815260200180611f1e6057913960600191505060405180910390fd5b6011548114156113315760405162461bcd60e51b8152600401808060200182810382526049815260200180611f756049913960600191505060405180910390fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b61136c6116ce565b6005546001600160a01b039081169116146113bc576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166114015760405162461bcd60e51b8152600401808060200182810382526026815260200180611ed66026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a73ec4e387549b236e03de2b52e49b490fe3c10c5926317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156114cf57600080fd5b505af41580156114e3573d6000803e3d6000fd5b505050506040513d60208110156114f957600080fd5b5051965060001995506000871261155d57600e5487111561152957600e54611522908890611bc6565b955061155d565b600e54600a546000911061153e57600061154d565b600e54600a5461154d916119f5565b905061155988826118fc565b9650505b61156688610ef9565b945061157188610880565b6001600160a01b03891660009081526010602052604090205490945092508261159b5760006115a9565b6011546115a990849061199b565b91504282116115b95760006115c3565b6115c382426119f5565b9050919395975091939597565b600a5460009081908190806115f0575050600e54600092508291506116c7565b600e546000805a90506000805b898410801561160b57508582105b156116b657600a54600190950194851061162457600094505b6000600a600001868154811061163657fe5b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915061166790611bf8565b1561168357611677816001610f54565b15611683576001909101905b60019092019160005a9050808511156116ad576116aa6116a386836119f5565b879061199b565b95505b93506115fd9050565b600e85905590975095509193505050505b9193909250565b3390565b6001600160a01b0383166117175760405162461bcd60e51b81526004018080602001828103825260248152602001806120ff6024913960400191505060405180910390fd5b6001600160a01b03821661175c5760405162461bcd60e51b8152600401808060200182810382526022815260200180611efc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b8152600401808060200182810382526038815260200180611fbe6038913960400191505060405180910390fd5b600081848411156118845760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611849578181015183820152602001611831565b50505050905090810190601f1680156118765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008261189b575060006107d5565b828202828482816118a857fe5b04146118e55760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff66021913960400191505060405180910390fd5b9392505050565b600081818112156107d557600080fd5b60008282018183128015906119115750838112155b80611926575060008312801561192657508381125b6118e557600080fd5b60008082121561193e57600080fd5b5090565b600061194d83610d2f565b90508082111561197557600061196383836119f5565b905061196f8482611c1f565b5061123c565b8082101561123c57600061198982846119f5565b90506119958482611c83565b50505050565b6000828201838110156118e5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006118e583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117f5565b600080611a4383610ef9565b90508015611bbd576001600160a01b038316600090815260086020526040902054611a6e908261199b565b6001600160a01b038416600081815260086020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a260007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b3957600080fd5b505af1158015611b4d573d6000803e3d6000fd5b505050506040513d6020811015611b6357600080fd5b5051905080611bb5576001600160a01b038416600090815260086020526040902054611b8f90836119f5565b6001600160a01b03851660009081526008602052604081209190915592506108da915050565b5090506108da565b50600092915050565b6000818303818312801590611bdb5750838113155b80611926575060008312801561192657508381136118e557600080fd5b600042821115611c0a575060006108da565b601154611c1742846119f5565b101592915050565b611c298282611cc7565b611c63611c446108bf8360065461188c90919063ffffffff16565b6001600160a01b03841660009081526007602052604090205490611bc6565b6001600160a01b0390921660009081526007602052604090209190915550565b611c8d8282611db7565b611c63611ca86108bf8360065461188c90919063ffffffff16565b6001600160a01b038416600090815260076020526040902054906118fc565b6001600160a01b038216611d22576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611d2e6000838361123c565b600254611d3b908261199b565b6002556001600160a01b038216600090815260208190526040902054611d61908261199b565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611dfc5760405162461bcd60e51b81526004018080602001828103825260218152602001806120de6021913960400191505060405180910390fd5b611e088260008361123c565b611e4581604051806060016040528060228152602001611eb4602291396001600160a01b03851660009081526020819052604090205491906117f5565b6001600160a01b038316600090815260208190526040902055600254611e6b90826119f5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20546865426565436f6e73657276616e637920636f6e74726163742e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206918748375ba2b19a44736a39c9872db7f69d99c631d8744d3e3cf7e4a4e151864736f6c634300060c0033546865426565436f6e73657276616e63795f4469766964656e5f547261636b6572546865426565436f6e73657276616e63795f4469766964656e645f547261636b6572546865426565436f6e73657276616e6379207c20542e4d452f544243546f6b656e546865426565436f6e73657276616e63793a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565546865426565436f6e73657276616e63793a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427
Deployed Bytecode
0x6080604052600436106102cd5760003560e01c80638322fff211610175578063a8b9d240116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610ae8578063e98030c714610afd578063f27fd25414610b27578063f2fde38b14610b51576102d4565b8063c492f04614610a19578063dd62ed3e14610a98578063e2f4560514610ad3576102d4565b8063a8b9d24014610897578063a9059cbb146108ca578063ad56c13c14610903578063adefd90c14610981578063b62496f5146109ab578063c0246668146109de576102d4565b806395d89b411161012e57806395d89b41146107cf57806398118cb4146107e45780639a7a23d6146107f95780639c1b8af514610834578063a26579ad14610849578063a457c2d71461085e576102d4565b80638322fff21461071e57806385141a7714610733578063871c128d1461074857806388bdd9be146107725780638c0344db146107a55780638da5cb5b146107ba576102d4565b806345f579771161023457806364b0f653116101ed5780636b67c4df116101c75780636b67c4df14610697578063700bb191146106ac57806370a08231146106d6578063715018a614610709576102d4565b806364b0f6531461061c57806365b8dbc0146106315780636843cd8414610664576102d4565b806345f579771461053857806349bd5a5e146105625780634e71d92d146105775780634fbee1931461058c5780635d098b38146105bf578063625e764c146105f2576102d4565b80632c1f5216116102865780632c1f52161461046057806330bb4cff14610475578063313ce5671461048a57806331e79db0146104b557806339509351146104ea5780634144d9e414610523576102d4565b806306fdde03146102d9578063095ea7b31461036357806313114a9d146103b05780631694505e146103d757806318160ddd1461040857806323b872dd1461041d576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee610b84565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610328578181015183820152602001610310565b50505050905090810190601f1680156103555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036f57600080fd5b5061039c6004803603604081101561038657600080fd5b506001600160a01b038135169060200135610c1a565b604080519115158252519081900360200190f35b3480156103bc57600080fd5b506103c5610c38565b60408051918252519081900360200190f35b3480156103e357600080fd5b506103ec610c3e565b604080516001600160a01b039092168252519081900360200190f35b34801561041457600080fd5b506103c5610c4d565b34801561042957600080fd5b5061039c6004803603606081101561044057600080fd5b506001600160a01b03813581169160208101359091169060400135610c53565b34801561046c57600080fd5b506103ec610cda565b34801561048157600080fd5b506103c5610ce9565b34801561049657600080fd5b5061049f610d5f565b6040805160ff9092168252519081900360200190f35b3480156104c157600080fd5b506104e8600480360360208110156104d857600080fd5b50356001600160a01b0316610d64565b005b3480156104f657600080fd5b5061039c6004803603604081101561050d57600080fd5b506001600160a01b038135169060200135610e25565b34801561052f57600080fd5b506103ec610e73565b34801561054457600080fd5b506104e86004803603602081101561055b57600080fd5b5035610e82565b34801561056e57600080fd5b506103ec610f01565b34801561058357600080fd5b506104e8610f10565b34801561059857600080fd5b5061039c600480360360208110156105af57600080fd5b50356001600160a01b0316610f95565b3480156105cb57600080fd5b506104e8600480360360208110156105e257600080fd5b50356001600160a01b0316610fb3565b3480156105fe57600080fd5b506104e86004803603602081101561061557600080fd5b503561102d565b34801561062857600080fd5b506103c561109f565b34801561063d57600080fd5b506104e86004803603602081101561065457600080fd5b50356001600160a01b03166110e4565b34801561067057600080fd5b506103c56004803603602081101561068757600080fd5b50356001600160a01b0316611369565b3480156106a357600080fd5b506103c56113ec565b3480156106b857600080fd5b506104e8600480360360208110156106cf57600080fd5b50356113f2565b3480156106e257600080fd5b506103c5600480360360208110156106f957600080fd5b50356001600160a01b03166114d9565b34801561071557600080fd5b506104e86114f4565b34801561072a57600080fd5b506103ec611596565b34801561073f57600080fd5b506103ec6115ba565b34801561075457600080fd5b506104e86004803603602081101561076b57600080fd5b50356115c9565b34801561077e57600080fd5b506104e86004803603602081101561079557600080fd5b50356001600160a01b03166116e6565b3480156107b157600080fd5b506103c5611a3d565b3480156107c657600080fd5b506103ec611a43565b3480156107db57600080fd5b506102ee611a52565b3480156107f057600080fd5b506103c5611ab3565b34801561080557600080fd5b506104e86004803603604081101561081c57600080fd5b506001600160a01b0381351690602001351515611ab9565b34801561084057600080fd5b506103c5611b68565b34801561085557600080fd5b506103c5611b6e565b34801561086a57600080fd5b5061039c6004803603604081101561088157600080fd5b506001600160a01b038135169060200135611bb3565b3480156108a357600080fd5b506103c5600480360360208110156108ba57600080fd5b50356001600160a01b0316611c1b565b3480156108d657600080fd5b5061039c600480360360408110156108ed57600080fd5b506001600160a01b038135169060200135611c6c565b34801561090f57600080fd5b506109366004803603602081101561092657600080fd5b50356001600160a01b0316611c80565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561098d57600080fd5b506104e8600480360360208110156109a457600080fd5b5035611d60565b3480156109b757600080fd5b5061039c600480360360208110156109ce57600080fd5b50356001600160a01b0316611dd2565b3480156109ea57600080fd5b506104e860048036036040811015610a0157600080fd5b506001600160a01b0381351690602001351515611de7565b348015610a2557600080fd5b506104e860048036036040811015610a3c57600080fd5b810190602081018135640100000000811115610a5757600080fd5b820183602082011115610a6957600080fd5b80359060200191846020830284011164010000000083111715610a8b57600080fd5b9193509150351515611efd565b348015610aa457600080fd5b506103c560048036036040811015610abb57600080fd5b506001600160a01b038135811691602001351661201d565b348015610adf57600080fd5b506103c5612048565b348015610af457600080fd5b506103c561204e565b348015610b0957600080fd5b506104e860048036036020811015610b2057600080fd5b5035612093565b348015610b3357600080fd5b5061093660048036036020811015610b4a57600080fd5b5035612138565b348015610b5d57600080fd5b506104e860048036036020811015610b7457600080fd5b50356001600160a01b031661219e565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b5050505050905090565b6000610c2e610c276122f8565b84846122fc565b5060015b92915050565b600e5481565b6006546001600160a01b031681565b60025490565b6000610c608484846123e8565b610cd084610c6c6122f8565b610ccb85604051806060016040528060288152602001613744602891396001600160a01b038a16600090815260016020526040812090610caa6122f8565b6001600160a01b031681526020810191909152604001600020549190612869565b6122fc565b5060019392505050565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610d2e57600080fd5b505afa158015610d42573d6000803e3d6000fd5b505050506040513d6020811015610d5857600080fd5b5051905090565b601290565b610d6c6122f8565b6005546001600160a01b03908116911614610dbc576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546040805163031e79db60e41b81526001600160a01b038481166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015610e0a57600080fd5b505af1158015610e1e573d6000803e3d6000fd5b5050505050565b6000610c2e610e326122f8565b84610ccb8560016000610e436122f8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612297565b600f546001600160a01b031681565b610e8a6122f8565b6005546001600160a01b03908116911614610eda576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600b819055600d54600c54610efb9190610ef5908490612297565b90612297565b600e5550565b6007546001600160a01b031681565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b5050565b6001600160a01b031660009081526011602052604090205460ff1690565b610fbb6122f8565b6005546001600160a01b0390811691161461100b576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6110356122f8565b6005546001600160a01b03908116911614611085576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600d819055600c54600b54610efb918391610ef591612297565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610d2e57600080fd5b6110ec6122f8565b6005546001600160a01b0390811691161461113c576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156111895760405162461bcd60e51b81526004018080602001828103825260368152602001806138bd6036913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117918290556040805163c45a015560e01b815290516000939092169163c45a015591600480820192602092909190829003018186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d602081101561124c57600080fd5b5051600654604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561131a57600080fd5b505af115801561132e573d6000803e3d6000fd5b505050506040513d602081101561134457600080fd5b5051600780546001600160a01b0319166001600160a01b039092169190911790555050565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b505192915050565b600d5481565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561144957600080fd5b505af115801561145d573d6000803e3d6000fd5b505050506040513d606081101561147357600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b6114fc6122f8565b6005546001600160a01b0390811691161461154c576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6009546001600160a01b031681565b6115d16122f8565b6005546001600160a01b03908116911614611621576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b62030d40811015801561163757506207a1208111155b6116725760405162461bcd60e51b815260040180806020018281038252604781526020018061378c6047913960600191505060405180910390fd5b6010548114156116b35760405162461bcd60e51b815260040180806020018281038252603f815260200180613859603f913960400191505060405180910390fd5b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b6116ee6122f8565b6005546001600160a01b0390811691161461173e576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546001600160a01b038281169116141561178b5760405162461bcd60e51b81526004018080602001828103825260408152602001806136986040913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d357600080fd5b505afa1580156117e7573d6000803e3d6000fd5b505050506040513d60208110156117fd57600080fd5b50516001600160a01b0316146118445760405162461bcd60e51b81526004018080602001828103825260618152602001806135b96061913960800191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561189357600080fd5b505af11580156118a7573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b1580156118f257600080fd5b505af1158015611906573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611921611a43565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561196057600080fd5b505af1158015611974573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b1580156119c657600080fd5b505af11580156119da573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b600b5481565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c105780601f10610be557610100808354040283529160200191610c10565b600c5481565b611ac16122f8565b6005546001600160a01b03908116911614611b11576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6007546001600160a01b0383811691161415611b5e5760405162461bcd60e51b81526004018080602001828103825260588152602001806136406058913960600191505060405180910390fd5b610f918282612900565b60105481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610d2e57600080fd5b6000610c2e611bc06122f8565b84610ccb856040518060600160405280602581526020016138986025913960016000611bea6122f8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612869565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b1580156113ba57600080fd5b6000610c2e611c796122f8565b84846123e8565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d610100811015611d1a57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b611d686122f8565b6005546001600160a01b03908116911614611db8576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b600c819055600d54600b54610efb9190610ef59084612297565b60126020526000908152604090205460ff1681565b611def6122f8565b6005546001600160a01b03908116911614611e3f576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff1615158115151415611e9d5760405162461bcd60e51b815260040180806020018281038252603d81526020018061381c603d913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b611f056122f8565b6005546001600160a01b03908116911614611f55576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b60005b82811015611faa578160116000868685818110611f7157fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611f58565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610d2e57600080fd5b61209b6122f8565b6005546001600160a01b039081169116146120eb576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b158015610e0a57600080fd5b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b158015611cef57600080fd5b6121a66122f8565b6005546001600160a01b039081169116146121f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061376c833981519152604482015290519081900360640190fd5b6001600160a01b03811661223b5760405162461bcd60e51b81526004018080602001828103825260268152602001806135716026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000828201838110156122f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166123415760405162461bcd60e51b81526004018080602001828103825260248152602001806137f86024913960400191505060405180910390fd5b6001600160a01b0382166123865760405162461bcd60e51b81526004018080602001828103825260228152602001806135976022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661242d5760405162461bcd60e51b81526004018080602001828103825260258152602001806137d36025913960400191505060405180910390fd5b6001600160a01b0382166124725760405162461bcd60e51b815260040180806020018281038252602381526020018061354e6023913960400191505060405180910390fd5b806124885761248383836000612a2e565b612864565b6000612493306114d9565b600a54909150811080159081906124b45750600754600160a01b900460ff16155b80156124d957506001600160a01b03851660009081526012602052604090205460ff16155b80156124fe57506124e8611a43565b6001600160a01b0316856001600160a01b031614155b8015612523575061250d611a43565b6001600160a01b0316846001600160a01b031614155b156125b3576007805460ff60a01b1916600160a01b179055600e54600d5460009161255991612553908690612b89565b90612be2565b905061256481612c24565b6000612581600e54612553600c5487612b8990919063ffffffff16565b905061258c81612e13565b6000612597306114d9565b90506125a281612e99565b50506007805460ff60a01b19169055505b6007546001600160a01b03861660009081526011602052604090205460ff600160a01b90920482161591168061260157506001600160a01b03851660009081526011602052604090205460ff165b1561260a575060005b801561267b57600061262c6064612553600e5488612b8990919063ffffffff16565b6001600160a01b03871660009081526012602052604090205490915060ff1615612662576126606064612553876001612b89565b015b61266c8582613092565b9450612679873083612a2e565b505b612686868686612a2e565b6008546001600160a01b031663e30443bc876126a1816114d9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156126e757600080fd5b505af19250505080156126f8575060015b506008546001600160a01b031663e30443bc86612714816114d9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561275a57600080fd5b505af192505050801561276b575060015b50600754600160a01b900460ff1661286057601054600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b1580156127d157600080fd5b505af192505050801561280557506040513d60608110156127f157600080fd5b508051602082015160409092015190919060015b61280e5761285e565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505b505050565b600081848411156128f85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128bd5781810151838201526020016128a5565b50505050905090810190601f1680156128ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b03821660009081526012602052604090205460ff161515811515141561295e5760405162461bcd60e51b815260040180806020018281038252604b8152602001806136d8604b913960600191505060405180910390fd5b6001600160a01b0382166000908152601260205260409020805460ff191682158015919091179091556129f2576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b1580156129d957600080fd5b505af11580156129ed573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038316612a735760405162461bcd60e51b81526004018080602001828103825260258152602001806137d36025913960400191505060405180910390fd5b6001600160a01b038216612ab85760405162461bcd60e51b815260040180806020018281038252602381526020018061354e6023913960400191505060405180910390fd5b612ac3838383612864565b612b008160405180606001604052806026815260200161361a602691396001600160a01b0386166000908152602081905260409020549190612869565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612b2f9082612297565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082612b9857506000610c32565b82820282848281612ba557fe5b04146122f15760405162461bcd60e51b81526004018080602001828103825260218152602001806137236021913960400191505060405180910390fd5b60006122f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d4565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c9357600080fd5b505afa158015612ca7573d6000803e3d6000fd5b505050506040513d6020811015612cbd57600080fd5b50519050612cca82613139565b6000612d6f827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3d57600080fd5b505afa158015612d51573d6000803e3d6000fd5b505050506040513d6020811015612d6757600080fd5b505190613092565b600f546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519293507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29091169163a9059cbb916044808201926020929091908290030181600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050506040513d6020811015610e1e57600080fd5b6000612e20826002612be2565b90506000612e2e8383613092565b905047612e3a8361332f565b6000612e464783613092565b9050612e528382613495565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15050505050565b612ea281613139565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f1157600080fd5b505afa158015612f25573d6000803e3d6000fd5b505050506040513d6020811015612f3b57600080fd5b50516008546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519293506000927f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29092169163a9059cbb9160448082019260209290919082900301818787803b158015612fb957600080fd5b505af1158015612fcd573d6000803e3d6000fd5b505050506040513d6020811015612fe357600080fd5b50519050801561286457600854604080516351c2a0e360e01b81526004810185905290516001600160a01b03909216916351c2a0e39160248082019260009290919082900301818387803b15801561303a57600080fd5b505af115801561304e573d6000803e3d6000fd5b5050604080518681526020810186905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39450908190039091019150a1505050565b60006122f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612869565b600081836131235760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128bd5781810151838201526020016128a5565b50600083858161312f57fe5b0495945050505050565b60408051600380825260808201909252606091602082018380368337019050509050308160008151811061316957fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131bd57600080fd5b505afa1580156131d1573d6000803e3d6000fd5b505050506040513d60208110156131e757600080fd5b50518151829060019081106131f857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160028151811061324657fe5b6001600160a01b03928316602091820292909201015260065461326c91309116846122fc565b600654604051635c11d79560e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b0390971696635c11d795968a968a9594939092909160c40190602080880191028083838b5b838110156132f25781810151838201526020016132da565b505050509050019650505050505050600060405180830381600087803b15801561331b57600080fd5b505af1158015612860573d6000803e3d6000fd5b6040805160028082526060808301845292602083019080368337019050509050308160008151811061335d57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156133b157600080fd5b505afa1580156133c5573d6000803e3d6000fd5b505050506040513d60208110156133db57600080fd5b50518151829060019081106133ec57fe5b6001600160a01b03928316602091820292909201015260065461341291309116846122fc565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602087810191028083838b83156132f25781810151838201526020016132da565b6006546134ad9030906001600160a01b0316846122fc565b6006546040805163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905260848201524260a482015290516001600160a01b039092169163f305d71991849160c480830192606092919082900301818588803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b50505050506040513d606081101561354757600080fd5b5050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546865426565436f6e73657276616e63793a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520546865426565436f6e73657276616e637920746f6b656e20636f6e747261637445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365546865426565436f6e73657276616e63793a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273546865426565436f6e73657276616e63793a20546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373546865426565436f6e73657276616e63793a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865426565436f6e73657276616e63793a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303045524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865426565436f6e73657276616e63793a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427546865426565436f6e73657276616e63793a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865426565436f6e73657276616e63793a2054686520726f7574657220616c72656164792068617320746861742061646472657373a2646970667358221220139824bd555c2d3488185ec28e5b7af2237fa5512ad549c56416be607d4085be64736f6c634300060c0033
Deployed Bytecode Sourcemap
45333:15476:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26486:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28653:169;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28653:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45968:76;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45420:41;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;45420:41:0;;;;;;;;;;;;;;27606:108;;;;;;;;;;;;;:::i;29304:355::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29304:355:0;;;;;;;;;;;;;;;;;:::i;45536:55::-;;;;;;;;;;;;;:::i;53243:141::-;;;;;;;;;;;;;:::i;27448:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53812:123;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53812:123:0;-1:-1:-1;;;;;53812:123:0;;:::i;:::-;;30068:218;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30068:218:0;;;;;;;;:::i;46053:83::-;;;;;;;;;;;;;:::i;51296:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51296:171:0;;:::i;45468:29::-;;;;;;;;;;;;;:::i;54863:88::-;;;;;;;;;;;;;:::i;53392:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53392:125:0;-1:-1:-1;;;;;53392:125:0;;:::i;51167:121::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51167:121:0;-1:-1:-1;;;;;51167:121:0;;:::i;51651:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51651:171:0;;:::i;55093:141::-;;;;;;;;;;;;;:::i;50019:511::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50019:511:0;-1:-1:-1;;;;;50019:511:0;;:::i;53677:130::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53677:130:0;-1:-1:-1;;;;;53677:130:0;;:::i;45928:33::-;;;;;;;;;;;;;:::i;54596:259::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54596:259:0;;:::i;27777:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27777:127:0;-1:-1:-1;;;;;27777:127:0;;:::i;15189:148::-;;;;;;;;;;;;;:::i;45679:82::-;;;;;;;;;;;;;:::i;45600:70::-;;;;;;;;;;;;;:::i;52557:430::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52557:430:0;;:::i;49116:895::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49116:895:0;-1:-1:-1;;;;;49116:895:0;;:::i;45849:32::-;;;;;;;;;;;;;:::i;14547:79::-;;;;;;;;;;;;;:::i;26705:104::-;;;;;;;;;;;;;:::i;45888:33::-;;;;;;;;;;;;;:::i;51832:275::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51832:275:0;;;;;;;;;;:::i;46217:40::-;;;;;;;;;;;;;:::i;53127:108::-;;;;;;;;;;;;;:::i;30789:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30789:269:0;;;;;;;;:::i;53525:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53525:147:0;-1:-1:-1;;;;;53525:147:0;;:::i;28117:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28117:175:0;;;;;;;;:::i;53943:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53943:318:0;-1:-1:-1;;;;;53943:318:0;;:::i;:::-;;;;-1:-1:-1;;;;;53943:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51475:168;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51475:168:0;;:::i;46533:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46533:58:0;-1:-1:-1;;;;;46533:58:0;;:::i;50538:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50538:309:0;;;;;;;;;;:::i;50855:304::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50855:304:0;-1:-1:-1;50855:304:0;;;;:::i;28355:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28355:151:0;;;;;;;;;;:::i;45780:54::-;;;;;;;;;;;;;:::i;54959:126::-;;;;;;;;;;;;;:::i;52995:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52995:124:0;;:::i;54266:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54266:325:0;;:::i;15492:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15492:244:0;-1:-1:-1;;;;;15492:244:0;;:::i;26486:100::-;26573:5;26566:12;;;;;;;;-1:-1:-1;;26566:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26540:13;;26566:12;;26573:5;;26566:12;;26573:5;26566:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26486:100;:::o;28653:169::-;28736:4;28753:39;28762:12;:10;:12::i;:::-;28776:7;28785:6;28753:8;:39::i;:::-;-1:-1:-1;28810:4:0;28653:169;;;;;:::o;45968:76::-;;;;:::o;45420:41::-;;;-1:-1:-1;;;;;45420:41:0;;:::o;27606:108::-;27694:12;;27606:108;:::o;29304:355::-;29444:4;29461:36;29471:6;29479:9;29490:6;29461:9;:36::i;:::-;29508:121;29517:6;29525:12;:10;:12::i;:::-;29539:89;29577:6;29539:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29539:19:0;;;;;;:11;:19;;;;;;29559:12;:10;:12::i;:::-;-1:-1:-1;;;;;29539:33:0;;;;;;;;;;;;-1:-1:-1;29539:33:0;;;:89;:37;:89::i;:::-;29508:8;:121::i;:::-;-1:-1:-1;29647:4:0;29304:355;;;;;:::o;45536:55::-;;;-1:-1:-1;;;;;45536:55:0;;:::o;53243:141::-;53333:15;;:43;;;-1:-1:-1;;;53333:43:0;;;;53306:7;;-1:-1:-1;;;;;53333:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53333:43:0;;-1:-1:-1;53243:141:0;:::o;27448:93::-;27531:2;27448:93;:::o;53812:123::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;53885:15:::1;::::0;:45:::1;::::0;;-1:-1:-1;;;53885:45:0;;-1:-1:-1;;;;;53885:45:0;;::::1;;::::0;::::1;::::0;;;:15;;;::::1;::::0;:36:::1;::::0;:45;;;;;:15:::1;::::0;:45;;;;;;;:15;;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53812:123:::0;:::o;30068:218::-;30156:4;30173:83;30182:12;:10;:12::i;:::-;30196:7;30205:50;30244:10;30205:11;:25;30217:12;:10;:12::i;:::-;-1:-1:-1;;;;;30205:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30205:25:0;;;:34;;;;;;;;;;;:38;:50::i;46053:83::-;;;-1:-1:-1;;;;;46053:83:0;;:::o;51296:171::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;51366:13:::1;:21:::0;;;51446:12:::1;::::0;51428::::1;::::0;51410:49:::1;::::0;51446:12;51410:31:::1;::::0;51382:5;;51410:17:::1;:31::i;:::-;:35:::0;::::1;:49::i;:::-;51398:9;:61:::0;-1:-1:-1;51296:171:0:o;45468:29::-;;;-1:-1:-1;;;;;45468:29:0;;:::o;54863:88::-;54894:15;;:49;;;-1:-1:-1;;;54894:49:0;;54925:10;54894:49;;;;:15;:49;;;;;;;;-1:-1:-1;;;;;54894:15:0;;;;:30;;:49;;;;;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54863:88:0:o;53392:125::-;-1:-1:-1;;;;;53481:28:0;53457:4;53481:28;;;:19;:28;;;;;;;;;53392:125::o;51167:121::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;51248:23:::1;:32:::0;;-1:-1:-1;;;;;;51248:32:0::1;-1:-1:-1::0;;;;;51248:32:0;;;::::1;::::0;;;::::1;::::0;;51167:121::o;51651:171::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;51720:12:::1;:20:::0;;;51781:12:::1;::::0;51763:13:::1;::::0;:49:::1;::::0;51735:5;;51763:31:::1;::::0;:17:::1;:31::i;55093:141::-:0;55185:15;;:41;;;-1:-1:-1;;;55185:41:0;;;;55158:7;;-1:-1:-1;;;;;55185:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;50019:511;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;50128:15:::1;::::0;-1:-1:-1;;;;;50106:38:0;;::::1;50128:15:::0;::::1;50106:38;;50098:105;;;;-1:-1:-1::0;;;50098:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50261:15;::::0;50219:59:::1;::::0;-1:-1:-1;;;;;50261:15:0;;::::1;::::0;50219:59;::::1;::::0;::::1;::::0;50261:15:::1;::::0;50219:59:::1;50289:15;:48:::0;;-1:-1:-1;;;;;;50289:48:0::1;-1:-1:-1::0;;;;;50289:48:0;;::::1;::::0;;;::::1;::::0;;;;50391:25:::1;::::0;;-1:-1:-1;;;50391:25:0;;;;-1:-1:-1;;50391:15:0;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50391:25:0;50458:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;50458:22:0;;;;-1:-1:-1;;;;;50373:69:0;;::::1;::::0;::::1;::::0;50451:4:::1;::::0;50458:15;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;50391:25:::1;::::0;50458:22;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50458:22:0;50373:108:::1;::::0;;-1:-1:-1;;;;;;50373:108:0::1;::::0;;;;;;-1:-1:-1;;;;;50373:108:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;50458:22:::1;::::0;50373:108;;;;;;;-1:-1:-1;50373:108:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50373:108:0;50492:13:::1;:30:::0;;-1:-1:-1;;;;;;50492:30:0::1;-1:-1:-1::0;;;;;50492:30:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;50019:511:0:o;53677:130::-;53768:15;;:34;;;-1:-1:-1;;;53768:34:0;;-1:-1:-1;;;;;53768:34:0;;;;;;;;;53747:7;;53768:15;;;;;:25;;:34;;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53768:34:0;;53677:130;-1:-1:-1;;53677:130:0:o;45928:33::-;;;;:::o;54596:259::-;54722:15;;:28;;;-1:-1:-1;;;;;;54722:28:0;;;;;;;;;;54656:18;;;;;;-1:-1:-1;;;;;54722:15:0;;;;:23;;:28;;;;;;;;;;;;;;;54656:18;54722:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54722:28:0;;;;;;;;;;;;54760:87;;;;;;;;;;;;;;;;;54722:28;54760:87;;;;;;;54722:28;;-1:-1:-1;54722:28:0;-1:-1:-1;54722:28:0;;-1:-1:-1;54837:9:0;;54825:5;;54760:87;;;;;;;;;54596:259;;;;:::o;27777:127::-;-1:-1:-1;;;;;27878:18:0;27851:7;27878:18;;;;;;;;;;;;27777:127::o;15189:148::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;15280:6:::1;::::0;15259:40:::1;::::0;15296:1:::1;::::0;-1:-1:-1;;;;;15280:6:0::1;::::0;15259:40:::1;::::0;15296:1;;15259:40:::1;15310:6;:19:::0;;-1:-1:-1;;;;;;15310:19:0::1;::::0;;15189:148::o;45679:82::-;;;:::o;45600:70::-;;;-1:-1:-1;;;;;45600:70:0;;:::o;52557:430::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;52655:6:::1;52643:8;:18;;:40;;;;;52677:6;52665:8;:18;;52643:40;52635:124;;;;-1:-1:-1::0;;;52635:124:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52790:16;;52778:8;:28;;52770:104;;;;-1:-1:-1::0;;;52770:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52924:16;::::0;52890:51:::1;::::0;52914:8;;52890:51:::1;::::0;;;::::1;52952:16;:27:::0;52557:430::o;49116:895::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;49225:15:::1;::::0;-1:-1:-1;;;;;49203:38:0;;::::1;49225:15:::0;::::1;49203:38;;49195:115;;;;-1:-1:-1::0;;;49195:115:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49323:51;49418:10;49323:107;;49489:4;-1:-1:-1::0;;;;;49451:43:0::1;:18;-1:-1:-1::0;;;;;49451:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49451:26:0;-1:-1:-1;;;;;49451:43:0::1;;49443:153;;;;-1:-1:-1::0;;;49443:153:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49609:18;-1:-1:-1::0;;;;;49609:39:0::1;;49657:18;49609:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;49609:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49688:54:0::1;::::0;;-1:-1:-1;;;49688:54:0;;49736:4:::1;49688:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;49688:39:0;::::1;::::0;-1:-1:-1;49688:39:0::1;::::0;-1:-1:-1;49688:54:0;;;;;-1:-1:-1;;49688:54:0;;;;;;;-1:-1:-1;49688:39:0;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49753:18;-1:-1:-1::0;;;;;49753:39:0::1;;49793:7;:5;:7::i;:::-;49753:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;49753:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49860:15:0::1;::::0;49812:65:::1;::::0;;-1:-1:-1;;;49812:65:0;;-1:-1:-1;;;;;49860:15:0;;::::1;49812:65;::::0;::::1;::::0;;;:39;;::::1;::::0;-1:-1:-1;49812:39:0::1;::::0;-1:-1:-1;49812:65:0;;;;;49860:15:::1;::::0;49812:65;;;;;;;;49860:15;49812:39;:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49937:15:0::1;::::0;49895:59:::1;::::0;-1:-1:-1;;;;;49937:15:0;;::::1;::::0;-1:-1:-1;49895:59:0;;::::1;::::0;-1:-1:-1;49895:59:0::1;::::0;49937:15:::1;::::0;49895:59:::1;49967:15;:36:::0;;-1:-1:-1;;;;;;49967:36:0::1;-1:-1:-1::0;;;;;49967:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;49116:895:0:o;45849:32::-;;;;:::o;14547:79::-;14612:6;;-1:-1:-1;;;;;14612:6:0;14547:79;:::o;26705:104::-;26794:7;26787:14;;;;;;;;-1:-1:-1;;26787:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26761:13;;26787:14;;26794:7;;26787:14;;26794:7;26787:14;;;;;;;;;;;;;;;;;;;;;;;;45888:33;;;;:::o;51832:275::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;51939:13:::1;::::0;-1:-1:-1;;;;;51931:21:0;;::::1;51939:13:::0;::::1;51931:21;;51923:122;;;;-1:-1:-1::0;;;51923:122:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52058:41;52087:4;52093:5;52058:28;:41::i;46217:40::-:0;;;;:::o;53127:108::-;53200:15;;:27;;;-1:-1:-1;;;53200:27:0;;;;53173:7;;-1:-1:-1;;;;;53200:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;30789:269;30882:4;30899:129;30908:12;:10;:12::i;:::-;30922:7;30931:96;30970:15;30931:96;;;;;;;;;;;;;;;;;:11;:25;30943:12;:10;:12::i;:::-;-1:-1:-1;;;;;30931:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30931:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;53525:147::-;53618:15;;:47;;;-1:-1:-1;;;53618:47:0;;-1:-1:-1;;;;;53618:47:0;;;;;;;;;53594:7;;53618:15;;;;;:38;;:47;;;;;;;;;;;;;;;:15;:47;;;;;;;;;;28117:175;28203:4;28220:42;28230:12;:10;:12::i;:::-;28244:9;28255:6;28220:9;:42::i;53943:318::-;54039:7;54061:6;54082;54103:7;54125;54147;54169;54191;54218:15;;;;;;;;;-1:-1:-1;;;;;54218:15:0;-1:-1:-1;;;;;54218:26:0;;54245:7;54218:35;;;;;;;;;;;;;-1:-1:-1;;;;;54218:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54218:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54218:35:0;;-1:-1:-1;54218:35:0;;-1:-1:-1;54218:35:0;-1:-1:-1;54218:35:0;-1:-1:-1;54218:35:0;-1:-1:-1;54218:35:0;;-1:-1:-1;54218:35:0;-1:-1:-1;53943:318:0;;;;;;;;;:::o;51475:168::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;51543:12:::1;:20:::0;;;51622:12:::1;::::0;51586:13:::1;::::0;:49:::1;::::0;51622:12;51586:31:::1;::::0;51558:5;51586:17:::1;:31::i;46533:58::-:0;;;;;;;;;;;;;;;:::o;50538:309::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50631:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;50623:114;;;;-1:-1:-1::0;;;50623:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50748:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50748:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50805:34;;;;;;;::::1;::::0;;;;;;;;::::1;50538:309:::0;;:::o;50855:304::-;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;50972:9:::1;50968:115;50987:19:::0;;::::1;50968:115;;;51063:8;51028:19;:32;51048:8;;51057:1;51048:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;51048:11:0::1;51028:32:::0;;-1:-1:-1;51028:32:0;::::1;::::0;;;;;;-1:-1:-1;51028:32:0;:43;;-1:-1:-1;;51028:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;51008:3:0::1;50968:115;;;;51100:51;51132:8;;51142;51100:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;51100:51:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;51100:51:0;;-1:-1:-1;;;;;51100:51:0::1;50855:304:::0;;;:::o;28355:151::-;-1:-1:-1;;;;;28471:18:0;;;28444:7;28471:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;28355:151::o;45780:54::-;;;;:::o;54959:126::-;55038:15;;:39;;;-1:-1:-1;;;55038:39:0;;;;55014:7;;-1:-1:-1;;;;;55038:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;52995:124;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;53069:15:::1;::::0;:42:::1;::::0;;-1:-1:-1;;;53069:42:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;53069:15:0;;::::1;::::0;:31:::1;::::0;:42;;;;;:15:::1;::::0;:42;;;;;;;;:15;;:42;::::1;;::::0;::::1;;;;::::0;::::1;54266:325:::0;54367:7;54389:6;54410;54431:7;54453;54475;54497;54519;54543:15;;;;;;;;;-1:-1:-1;;;;;54543:15:0;-1:-1:-1;;;;;54543:33:0;;54577:5;54543:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15492:244;14769:12;:10;:12::i;:::-;14759:6;;-1:-1:-1;;;;;14759:6:0;;;:22;;;14751:67;;;;;-1:-1:-1;;;14751:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14751:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15581:22:0;::::1;15573:73;;;;-1:-1:-1::0;;;15573:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15683:6;::::0;15662:38:::1;::::0;-1:-1:-1;;;;;15662:38:0;;::::1;::::0;15683:6:::1;::::0;15662:38:::1;::::0;15683:6:::1;::::0;15662:38:::1;15711:6;:17:::0;;-1:-1:-1;;;;;;15711:17:0::1;-1:-1:-1::0;;;;;15711:17:0;;;::::1;::::0;;;::::1;::::0;;15492:244::o;16048:181::-;16106:7;16138:5;;;16162:6;;;;16154:46;;;;;-1:-1:-1;;;16154:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16220:1;16048:181;-1:-1:-1;;;16048:181:0:o;4923:98::-;5003:10;4923:98;:::o;33975:380::-;-1:-1:-1;;;;;34111:19:0;;34103:68;;;;-1:-1:-1;;;34103:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34190:21:0;;34182:68;;;;-1:-1:-1;;;34182:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34263:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;34315:32;;;;;;;;;;;;;;;;;33975:380;;;:::o;55244:2212::-;-1:-1:-1;;;;;55376:18:0;;55368:68;;;;-1:-1:-1;;;55368:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55455:16:0;;55447:64;;;;-1:-1:-1;;;55447:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55527:11;55524:92;;55555:28;55571:4;55577:2;55581:1;55555:15;:28::i;:::-;55598:7;;55524:92;55622:28;55653:24;55671:4;55653:9;:24::i;:::-;55729:18;;55622:55;;-1:-1:-1;55705:42:0;;;;;;;55764:33;;-1:-1:-1;55789:8:0;;-1:-1:-1;;;55789:8:0;;;;55788:9;55764:33;:82;;;;-1:-1:-1;;;;;;55815:31:0;;;;;;:25;:31;;;;;;;;55814:32;55764:82;:114;;;;;55871:7;:5;:7::i;:::-;-1:-1:-1;;;;;55863:15:0;:4;-1:-1:-1;;;;;55863:15:0;;;55764:114;:144;;;;;55901:7;:5;:7::i;:::-;-1:-1:-1;;;;;55895:13:0;:2;-1:-1:-1;;;;;55895:13:0;;;55764:144;55760:620;;;55935:8;:15;;-1:-1:-1;;;;55935:15:0;-1:-1:-1;;;55935:15:0;;;56036:9;;56018:12;;55935:15;;55993:53;;:38;;:20;;:24;:38::i;:::-;:42;;:53::i;:::-;55967:79;;56061:33;56078:15;56061:16;:33::i;:::-;56111:18;56132:53;56175:9;;56132:38;56157:12;;56132:20;:24;;:38;;;;:::i;:53::-;56111:74;;56200:26;56215:10;56200:14;:26::i;:::-;56243:18;56264:24;56282:4;56264:9;:24::i;:::-;56243:45;;56303:32;56324:10;56303:20;:32::i;:::-;-1:-1:-1;;56352:8:0;:16;;-1:-1:-1;;;;56352:16:0;;;-1:-1:-1;55760:620:0;56410:8;;-1:-1:-1;;;;;56519:25:0;;56394:12;56519:25;;;:19;:25;;;;;;56410:8;-1:-1:-1;;;56410:8:0;;;;;56409:9;;56519:25;;:52;;-1:-1:-1;;;;;;56548:23:0;;;;;;:19;:23;;;;;;;;56519:52;56516:99;;;-1:-1:-1;56598:5:0;56516:99;56630:7;56627:280;;;56651:12;56666:30;56692:3;56666:21;56677:9;;56666:6;:10;;:21;;;;:::i;:30::-;-1:-1:-1;;;;;56711:29:0;;;;;;:25;:29;;;;;;56651:45;;-1:-1:-1;56711:29:0;;56708:92;;;56765:22;56783:3;56765:13;:6;56776:1;56765:10;:13::i;:22::-;56757:30;56708:92;56820:16;:6;56831:4;56820:10;:16::i;:::-;56811:25;;56853:42;56869:4;56883;56890;56853:15;:42::i;:::-;56627:280;;56919:33;56935:4;56941:2;56945:6;56919:15;:33::i;:::-;56969:15;;-1:-1:-1;;;;;56969:15:0;:26;57004:4;57011:15;57004:4;57011:9;:15::i;:::-;56969:58;;;;;;;;;;;;;-1:-1:-1;;;;;56969:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56965:74;57053:15;;-1:-1:-1;;;;;57053:15:0;:26;57088:2;57093:13;57088:2;57093:9;:13::i;:::-;57053:54;;;;;;;;;;;;;-1:-1:-1;;;;;57053:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57049:70;57135:8;;-1:-1:-1;;;57135:8:0;;;;57131:318;;57168:16;;57199:15;;:28;;;-1:-1:-1;;;;;;57199:28:0;;;;;;;;;;-1:-1:-1;;;;;57199:15:0;;;;:23;;:28;;;;;;;;;;;;;;;57154:11;57199:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57199:28:0;;;;;;;;;;;;;;;;57195:243;;;;;57316:86;;;;;;;;;;;;;;;;;;;;;;;;;;57392:9;;57381:4;;57316:86;;;;;;;;;57228:184;;;57195:243;57131:318;;55244:2212;;;;;;;:::o;16951:192::-;17037:7;17073:12;17065:6;;;;17057:29;;;;-1:-1:-1;;;17057:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17109:5:0;;;16951:192::o;52129:418::-;-1:-1:-1;;;;;52220:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;52212:128;;;;-1:-1:-1;;;52212:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52351:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;52351:39:0;;;;;;;;;;;;52403:79;;52428:15;;:42;;;-1:-1:-1;;;52428:42:0;;-1:-1:-1;;;;;52428:42:0;;;;;;;;;:15;;;;;:36;;:42;;;;;:15;;:42;;;;;;;:15;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52403:79;52499:40;;;;;;-1:-1:-1;;;;;52499:40:0;;;;;;;;52129:418;;:::o;31548:573::-;-1:-1:-1;;;;;31688:20:0;;31680:70;;;;-1:-1:-1;;;31680:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31769:23:0;;31761:71;;;;-1:-1:-1;;;31761:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31845:47;31866:6;31874:9;31885:6;31845:20;:47::i;:::-;31925:71;31947:6;31925:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31925:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;31905:17:0;;;:9;:17;;;;;;;;;;;:91;;;;32030:20;;;;;;;:32;;32055:6;32030:24;:32::i;:::-;-1:-1:-1;;;;;32007:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;32078:35;;;;;;;32007:20;;32078:35;;;;;;;;;;;;;31548:573;;;:::o;17402:471::-;17460:7;17705:6;17701:47;;-1:-1:-1;17735:1:0;17728:8;;17701:47;17772:5;;;17776:1;17772;:5;:1;17796:5;;;;;:10;17788:56;;;;-1:-1:-1;;;17788:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18349:132;18407:7;18434:39;18438:1;18441;18434:39;;;;;;;;;;;;;;;;;:3;:39::i;57464:334::-;57528:25;57563:3;-1:-1:-1;;;;;57556:21:0;;57586:4;57556:36;;;;;;;;;;;;;-1:-1:-1;;;;;57556:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57556:36:0;;-1:-1:-1;57605:24:0;57622:6;57605:16;:24::i;:::-;57640:18;57661:61;57704:17;57669:3;-1:-1:-1;;;;;57662:21:0;;57692:4;57662:36;;;;;;;;;;;;;-1:-1:-1;;;;;57662:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57662:36:0;;57661:42;:61::i;:::-;57754:23;;57733:57;;;-1:-1:-1;;;57733:57:0;;-1:-1:-1;;;;;57754:23:0;;;57733:57;;;;;;;;;;;;;;-1:-1:-1;57740:3:0;57733:20;;;;;;:57;;;;;;;;;;;;;;;-1:-1:-1;57733:20:0;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57806:922;57915:12;57930:13;:6;57941:1;57930:10;:13::i;:::-;57915:28;-1:-1:-1;57954:17:0;57974:16;:6;57915:28;57974:10;:16::i;:::-;57954:36;-1:-1:-1;58293:21:0;58359:22;58376:4;58359:16;:22::i;:::-;58512:18;58533:41;:21;58559:14;58533:25;:41::i;:::-;58512:62;;58624:35;58637:9;58648:10;58624:12;:35::i;:::-;58677:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57806:922;;;;;:::o;60407:399::-;60471:24;60488:6;60471:16;:24::i;:::-;60506:17;60533:3;-1:-1:-1;;;;;60526:21:0;;60556:4;60526:36;;;;;;;;;;;;;-1:-1:-1;;;;;60526:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60526:36:0;60617:15;;60588:57;;;-1:-1:-1;;;60588:57:0;;-1:-1:-1;;;;;60617:15:0;;;60588:57;;;;;;;;;;;;60526:36;;-1:-1:-1;;;60595:3:0;60588:20;;;;;;:57;;;;;60526:36;;60588:57;;;;;;;;-1:-1:-1;60588:20:0;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60588:57:0;;-1:-1:-1;60658:141:0;;;;60686:15;;:49;;;-1:-1:-1;;;60686:49:0;;;;;;;;;;-1:-1:-1;;;;;60686:15:0;;;;:38;;:49;;;;;:15;;:49;;;;;;;;:15;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60755:32:0;;;;;;;;;;;;;;;;-1:-1:-1;60755:32:0;;;;;;;;-1:-1:-1;60755:32:0;60407:399;;;:::o;16512:136::-;16570:7;16597:43;16601:1;16604;16597:43;;;;;;;;;;;;;;;;;:3;:43::i;18977:278::-;19063:7;19098:12;19091:5;19083:28;;;;-1:-1:-1;;;19083:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19122:9;19138:1;19134;:5;;;;;;;18977:278;-1:-1:-1;;;;;18977:278:0:o;59341:530::-;59433:16;;;59447:1;59433:16;;;;;;;;;59409:21;;59433:16;;;59409:21;;59433:16;;;;;-1:-1:-1;59433:16:0;59409:40;;59478:4;59460;59465:1;59460:7;;;;;;;;-1:-1:-1;;;;;59460:23:0;;;:7;;;;;;;;;;:23;;;;59504:15;;:22;;;-1:-1:-1;;;59504:22:0;;;;:15;;;;;:20;;:22;;;;;59460:7;;59504:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59504:22:0;59494:7;;:4;;59499:1;;59494:7;;;;;;;;;;;:32;-1:-1:-1;;;;;59494:32:0;;;-1:-1:-1;;;;;59494:32:0;;;;;59547:3;59537:4;59542:1;59537:7;;;;;;;;-1:-1:-1;;;;;59537:13:0;;;:7;;;;;;;;;:13;59595:15;;59563:62;;59580:4;;59595:15;59613:11;59563:8;:62::i;:::-;59664:15;;:199;;-1:-1:-1;;;59664:199:0;;;;;;;;:15;:199;;;;;;59817:4;59664:199;;;;;;59837:15;59664:199;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59664:15:0;;;;:69;;59748:11;;59790:4;;59817;59837:15;59664:199;;;;;;;;;;;;;;;;:15;:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58738:595;58892:16;;;58906:1;58892:16;;;58868:21;58892:16;;;;;58868:21;58892:16;;;;;;;;;;-1:-1:-1;58892:16:0;58868:40;;58937:4;58919;58924:1;58919:7;;;;;;;;-1:-1:-1;;;;;58919:23:0;;;:7;;;;;;;;;;:23;;;;58963:15;;:22;;;-1:-1:-1;;;58963:22:0;;;;:15;;;;;:20;;:22;;;;;58919:7;;58963:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58963:22:0;58953:7;;:4;;58958:1;;58953:7;;;;;;-1:-1:-1;;;;;58953:32:0;;;:7;;;;;;;;;:32;59030:15;;58998:62;;59015:4;;59030:15;59048:11;58998:8;:62::i;:::-;59099:15;;:224;;-1:-1:-1;;;59099:224:0;;;;;;;;-1:-1:-1;59099:224:0;;;;;;59277:4;59099:224;;;;;;59297:15;59099:224;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59099:15:0;;;;:66;;:224;;;;59277:4;59297:15;59099:224;;;;;;;-1:-1:-1;59099:224:0;;;;;;;;-1:-1:-1;59099:224:0;;;;;;;;;;;;;;;;59879:520;60061:15;;60029:62;;60046:4;;-1:-1:-1;;;;;60061:15:0;60079:11;60029:8;:62::i;:::-;60134:15;;:255;;;-1:-1:-1;;;60134:255:0;;60206:4;60134:255;;;;;;;;;;:15;:255;;;;;;;;;;;;;;;;60363:15;60134:255;;;;;;-1:-1:-1;;;;;60134:15:0;;;;:31;;60173:9;;60134:255;;;;;;;;;;;;;;60173:9;60134:15;:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;59879:520:0:o
Swarm Source
ipfs://6918748375ba2b19a44736a39c9872db7f69d99c631d8744d3e3cf7e4a4e1518
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.