Token Hydro
Overview ERC20
Price
$0.00 @ 0.000000 MOVR
Fully Diluted Market Cap
Total Supply:
997,657,521.121942 HYDRO
Holders:
144 addresses
Transfers:
-
Contract:
Decimals:
18
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
H2Ov2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-26 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {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 Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `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); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/math/[email protected] pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/interfaces/IH2OPlugin.sol pragma solidity ^0.8.0; interface IH2OPlugin { function retirePlugin() external; function h2oAddress() external view returns (address); } // File contracts/interfaces/IH2OLiquidityPlugin.sol pragma solidity ^0.8.0; interface IH2OLiquidityPlugin is IH2OPlugin { function pair() external returns (address); function addLiquidity(uint256 _tokenAmount) external; } // File contracts/interfaces/IDividendDistributor.sol pragma solidity ^0.8.0; interface IDividendDistributor { function setShare(address shareholder, uint256 amount) external; function deposit(uint256 amount) external; function process(uint256 gas) external returns (uint256 processedCount); function claimDividend(address shareholder) external; } // File contracts/interfaces/IH2ODistributorPlugin.sol pragma solidity ^0.8.0; interface IH2ODistributorPlugin is IH2OPlugin, IDividendDistributor { function processAtIndex(uint256 gas, uint256 distributorIndex) external returns (uint256 processedCount); } // File contracts/interfaces/IPairChange.sol pragma solidity ^0.8.0; interface IPairChange { function onPairChange() external; } // File contracts/utils/UtilsLibrary.sol pragma solidity ^0.8.0; library UtilsLibrary { event ErrorLog(bytes data); } // File contracts/plugins/H2OPluginManager.sol pragma solidity ^0.8.0; // import "hardhat/console.sol"; abstract contract H2OPluginManager is Ownable { using SafeMath for uint256; struct PluginCandidate { uint8 pluginId; address implementation; uint256 proposedTime; } uint8 internal constant LIQUIDITY_PLUGIN_ID = 1; uint8 internal constant DISTRIBUTOR_PLUGIN_ID = 2; uint256 private constant MIN_APPROVAL_DELAY = 1 days; mapping(uint8 => address) private _plugins; mapping(uint8 => PluginCandidate) public pluginCandidates; uint256 public approvalDelay; uint256 public proposedApprovalDelay; uint256 public proposedApprovalDelayTime; event NewPluginCandidate(uint8 indexed pluginId, address implementation); event PluginUpgraded(uint8 indexed pluginId, address implementation); event NewApprovalDelayCandidate(uint256 approvalDelay); event ApprovalDelayUpgraded(uint256 approvalDelay); constructor(uint256 _approvalDelay) { approvalDelay = _approvalDelay; } function setupPlugin(uint8 _pluginId, address _implementation) external onlyOwner { require(_plugins[_pluginId] == address(0), "Plugin already setup"); require( address(this) == IH2OPlugin(_implementation).h2oAddress(), "Plugin not valid" ); _plugins[_pluginId] = _implementation; onPluginUpgraded(_pluginId, false); } function proposePlugin(uint8 _pluginId, address _implementation) external onlyOwner { require( address(this) == IH2OPlugin(_implementation).h2oAddress(), "Plugin not valid" ); pluginCandidates[_pluginId] = PluginCandidate({ pluginId: _pluginId, implementation: _implementation, proposedTime: block.timestamp }); emit NewPluginCandidate(_pluginId, _implementation); } function upgradePlugin(uint8 _pluginId) external onlyOwner { PluginCandidate storage candidate = pluginCandidates[_pluginId]; require( candidate.implementation != address(0), "There is no candidate" ); require( proposedApprovalDelay == 0, "Cannot upgrade plugin while changing approval delay" ); require( candidate.proposedTime.add(approvalDelay) < block.timestamp, "Delay has not passed" ); emit PluginUpgraded(_pluginId, candidate.implementation); if (_plugins[_pluginId] != address(0)) { try IH2OPlugin(_plugins[_pluginId]).retirePlugin() {} catch ( bytes memory reason ) { emit UtilsLibrary.ErrorLog(reason); } } _plugins[_pluginId] = candidate.implementation; candidate.implementation = address(0); candidate.proposedTime = 5000000000; onPluginUpgraded(_pluginId, true); } function proposeApprovalDelay(uint256 _approvalDelay) external onlyOwner { require(_approvalDelay >= MIN_APPROVAL_DELAY, "Delay too small"); proposedApprovalDelay = _approvalDelay; proposedApprovalDelayTime = block.timestamp; emit NewApprovalDelayCandidate(_approvalDelay); } function upgradeApprovalDelay() external onlyOwner { require(proposedApprovalDelay != 0, "There is no candidate"); require( proposedApprovalDelayTime.add(approvalDelay) < block.timestamp, "Delay has not passed" ); emit ApprovalDelayUpgraded(proposedApprovalDelay); approvalDelay = proposedApprovalDelay; proposedApprovalDelayTime = 5000000000; proposedApprovalDelay = 0; } function onPluginUpgraded(uint8, bool) internal virtual {} function plugin(uint8 _pluginId) public view returns (address pluginAddress) { pluginAddress = _plugins[_pluginId]; } } // File contracts/H2Ov2.sol pragma solidity ^0.8.0; // import "hardhat/console.sol"; contract H2Ov2 is ERC20, ERC20Burnable, IPairChange, H2OPluginManager { using SafeMath for uint256; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isWalletLimitExempt; mapping(address => bool) public isDividendExempt; address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ZERO = 0x0000000000000000000000000000000000000000; address public pair; address public marketingFeeReceiver; uint256 public liquidityFeeOfTotal = 2000; uint256 public reflectionFeeOfTotal = 8000; uint256 public marketingFeeOfTotal = 0; uint256 public burnFeeOfTotal = 0; uint256 public buyTotalFee = 500; uint256 public sellTotalFee = 1000; uint256 public constant feeDenominator = 10000; uint256 public maxWalletSize; bool public dividendNeedToUpdateHolders = false; // 0 means that auto distribution is disabled uint256 public autoDistributorGas = 0; // 0 means that auto swap is disabled uint256 public autoSwapThreshold = 0; bool private isSwapping = false; bool private isSwappingBack = false; bool private isProcessing = false; constructor(uint256 _approvalDelay) ERC20("Hydro", "HYDRO") H2OPluginManager(_approvalDelay) { _mint(_msgSender(), 10**(9 + decimals())); maxWalletSize = (totalSupply() * 10) / 100; isFeeExempt[_msgSender()] = true; isWalletLimitExempt[_msgSender()] = true; isWalletLimitExempt[address(this)] = true; isDividendExempt[DEAD] = true; isDividendExempt[ZERO] = true; isDividendExempt[address(this)] = true; marketingFeeReceiver = _msgSender(); } function onPluginUpgraded(uint8 pluginId, bool isUpgrade) internal override { address pluginAddress = plugin(pluginId); _approve(address(this), pluginAddress, type(uint256).max); isFeeExempt[pluginAddress] = true; isWalletLimitExempt[pluginAddress] = true; isDividendExempt[pluginAddress] = true; if (pluginId == LIQUIDITY_PLUGIN_ID) { onPairChange(); } else if (pluginId == DISTRIBUTOR_PLUGIN_ID) { if (isUpgrade) { dividendNeedToUpdateHolders = true; } } } function onPairChange() public override { pair = _liquidityPlugin().pair(); isWalletLimitExempt[pair] = true; isDividendExempt[pair] = true; } function setAutoDistributorSettings(uint256 gas) external onlyOwner { require(gas < 750000); autoDistributorGas = gas; } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function setIsDividendExempt(address holder, bool exempt) external onlyOwner { _setIsDividendExempt(holder, exempt); } function setIsWalletLimitExempt(address holder, bool exempt) external onlyOwner { isWalletLimitExempt[holder] = exempt; } function setMaxWallet(uint256 numerator, uint256 divisor) external onlyOwner { require(numerator > 0 && divisor > 0 && divisor <= 10000); maxWalletSize = (totalSupply() * numerator) / divisor; } function setAutoSwapThreshold(uint256 _autoSwapThreshold) external onlyOwner { require( _autoSwapThreshold <= totalSupply(), "Invalid autoswap threshold" ); autoSwapThreshold = _autoSwapThreshold; } function setMarketingFeeReceiver(address _marketingFeeReceiver) external onlyOwner { marketingFeeReceiver = _marketingFeeReceiver; isWalletLimitExempt[_marketingFeeReceiver] = true; } function swapBackAll() public { swapBack(balanceOf(address(this))); } function swapBack(uint256 amount) public { require( !dividendNeedToUpdateHolders, "Need to update holders to swapback" ); if (amount == 0) { return; } isSwappingBack = true; uint256 amountToLiquify = amount.mul(liquidityFeeOfTotal).div( feeDenominator ); uint256 amountToMarketing = amount.mul(marketingFeeOfTotal).div( feeDenominator ); uint256 amountToBurn = amount.mul(burnFeeOfTotal).div(feeDenominator); uint256 amountToSwap = amount .sub(amountToLiquify) .sub(amountToMarketing) .sub(amountToBurn); if (amountToLiquify > 0) { try _liquidityPlugin().addLiquidity(amountToLiquify) {} catch ( bytes memory reason ) { emit UtilsLibrary.ErrorLog(reason); } } if (amountToMarketing > 0) { _transfer(address(this), marketingFeeReceiver, amountToMarketing); } if (amountToBurn > 0) { _burn(address(this), amountToBurn); } if (amountToSwap > 0) { try _distributorPlugin().deposit(amountToSwap) {} catch ( bytes memory reason ) { emit UtilsLibrary.ErrorLog(reason); } } isSwappingBack = false; } function configureDividendHolders( address[] memory holders, bool updatingFinished ) external onlyOwner { for (uint256 i = 0; i < holders.length; i++) { _setIsDividendExempt(holders[i], false); } if (updatingFinished) { dividendNeedToUpdateHolders = false; } } function setFees( uint256 _liquidityFeeOfTotal, uint256 _reflectionFeeOfTotal, uint256 _marketingFeeOfTotal, uint256 _burnFeeOfTotal, uint256 _buyTotalFee, uint256 _sellTotalFee ) external onlyOwner { require( _liquidityFeeOfTotal .add(_reflectionFeeOfTotal) .add(_marketingFeeOfTotal) .add(_burnFeeOfTotal) == feeDenominator, "Incorrect fees" ); liquidityFeeOfTotal = _liquidityFeeOfTotal; reflectionFeeOfTotal = _reflectionFeeOfTotal; marketingFeeOfTotal = _marketingFeeOfTotal; burnFeeOfTotal = _burnFeeOfTotal; buyTotalFee = _buyTotalFee; sellTotalFee = _sellTotalFee; require(buyTotalFee < feeDenominator.div(5)); require(sellTotalFee < feeDenominator.div(5)); } function process(uint256 gas) public { isProcessing = true; try _distributorPlugin().process(gas) { isProcessing = false; } catch (bytes memory reason) { emit UtilsLibrary.ErrorLog(reason); } } function processAtIndex(uint256 gas, uint256 distributorIndex) public returns (uint256 processedCount) { isProcessing = true; try _distributorPlugin().processAtIndex(gas, distributorIndex) returns ( uint256 _processedCount ) { isProcessing = false; return _processedCount; } catch (bytes memory reason) { emit UtilsLibrary.ErrorLog(reason); return 0; } } function claimDividend(address shareholder) external { isProcessing = true; _distributorPlugin().claimDividend(shareholder); isProcessing = false; } 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 || isSwapping || isSwappingBack || isProcessing) { super._transfer(from, to, amount); _checkWalletLimit(to); return; } if (_shouldSwapBack(to)) { swapBackAll(); } isSwapping = true; bool isSelling = to == pair; uint256 amountReceived = _shouldTakeFee(from, to) ? _takeFee(isSelling, from, amount) : amount; super._transfer(from, to, amountReceived); isSwapping = false; _checkWalletLimit(to); _setShares(from, to); if (_isAutoDistributing() && !dividendNeedToUpdateHolders) { process(autoDistributorGas); } } function _setShares(address from, address to) private { isProcessing = true; if (!isDividendExempt[from]) { try _distributorPlugin().setShare(from, balanceOf(from)) {} catch ( bytes memory reason ) { emit UtilsLibrary.ErrorLog(reason); } } if (!isDividendExempt[to]) { try _distributorPlugin().setShare(to, balanceOf(to)) {} catch ( bytes memory reason ) { emit UtilsLibrary.ErrorLog(reason); } } isProcessing = false; } function _shouldTakeFee(address from, address to) internal view returns (bool) { return !isFeeExempt[from] && !isFeeExempt[to]; } function _takeFee( bool selling, address sender, uint256 amount ) internal returns (uint256) { uint256 totalFee = _getTotalFee(selling); if (totalFee == 0) { return amount; } uint256 feeAmount = (amount * totalFee) / feeDenominator; super._transfer(sender, address(this), feeAmount); return amount - feeAmount; } function _getTotalFee(bool selling) public view returns (uint256) { if (selling) { return sellTotalFee; } else { return buyTotalFee; } } function _liquidityPlugin() private view returns (IH2OLiquidityPlugin result) { result = IH2OLiquidityPlugin(plugin(LIQUIDITY_PLUGIN_ID)); } function _distributorPlugin() private view returns (IH2ODistributorPlugin result) { result = IH2ODistributorPlugin(plugin(DISTRIBUTOR_PLUGIN_ID)); } function _shouldSwapBack(address to) internal view returns (bool) { return _msgSender() != pair && !isSwapping && autoSwapThreshold > 0 && to == pair && balanceOf(address(this)) >= autoSwapThreshold; } function _checkWalletLimit(address _address) private view { if ( isWalletLimitExempt[_address] || _address == pair || _address == DEAD ) { return; } require( balanceOf(_address) <= maxWalletSize, "Transfer amount exceeds the bag size." ); } function _setIsDividendExempt(address holder, bool exempt) private { require(holder != address(this) && holder != pair); isDividendExempt[holder] = exempt; isProcessing = true; if (exempt) { _distributorPlugin().setShare(holder, 0); } else { _distributorPlugin().setShare(holder, balanceOf(holder)); } isProcessing = false; } function _isAutoDistributing() private view returns (bool) { return autoDistributorGas > 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"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":false,"internalType":"uint256","name":"approvalDelay","type":"uint256"}],"name":"ApprovalDelayUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"approvalDelay","type":"uint256"}],"name":"NewApprovalDelayCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"pluginId","type":"uint8"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"NewPluginCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"pluginId","type":"uint8"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"PluginUpgraded","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"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"_getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"approvalDelay","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":[],"name":"autoDistributorGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"bool","name":"updatingFinished","type":"bool"}],"name":"configureDividendHolders","outputs":[],"stateMutability":"nonpayable","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":[],"name":"dividendNeedToUpdateHolders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDenominator","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":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWalletLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","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":"onPairChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"}],"name":"plugin","outputs":[{"internalType":"address","name":"pluginAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"pluginCandidates","outputs":[{"internalType":"uint8","name":"pluginId","type":"uint8"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"uint256","name":"proposedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"},{"internalType":"uint256","name":"distributorIndex","type":"uint256"}],"name":"processAtIndex","outputs":[{"internalType":"uint256","name":"processedCount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"name":"proposeApprovalDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedApprovalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposedApprovalDelayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setAutoDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoSwapThreshold","type":"uint256"}],"name":"setAutoSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_burnFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_buyTotalFee","type":"uint256"},{"internalType":"uint256","name":"_sellTotalFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsWalletLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setMarketingFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"setupPlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBackAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"upgradeApprovalDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"}],"name":"upgradePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526107d0601055611f406011556000601281905560138190556101f46014556103e86015556017805460ff191690556018819055601955601a805462ffffff191690553480156200005357600080fd5b5060405162003af038038062003af08339810160408190526200007691620003ee565b8060405180604001604052806005815260200164487964726f60d81b81525060405180604001604052806005815260200164485944524f60d81b8152508160039080519060200190620000cb92919062000348565b508051620000e190600490602084019062000348565b505050620000fe620000f86200020a60201b60201c565b6200020e565b6008556200012733620001146012600962000423565b6200012190600a620004b7565b62000260565b60646200013360025490565b6200014090600a62000585565b6200014c91906200044b565b60165550336000818152600b602090815260408083208054600160ff199182168117909255600c845282852080548216831790553085528285208054821683179055600d9093527fdc7fafdc41998a74ecacb8f8bd877011aba1f1d03a3a0d37a2e7879a393b1d6a80548416821790557f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee8054841682179055922080549091169091179055600f80546001600160a01b0319169091179055620005fa565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002cf919062000408565b90915550506001600160a01b03821660009081526020819052604081208054839290620002fe90849062000408565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200035690620005a7565b90600052602060002090601f0160209004810192826200037a5760008555620003c5565b82601f106200039557805160ff1916838001178555620003c5565b82800160010185558215620003c5579182015b82811115620003c5578251825591602001919060010190620003a8565b50620003d3929150620003d7565b5090565b5b80821115620003d35760008155600101620003d8565b6000602082840312156200040157600080fd5b5051919050565b600082198211156200041e576200041e620005e4565b500190565b600060ff821660ff84168060ff03821115620004435762000443620005e4565b019392505050565b6000826200046957634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620004af578160001904821115620004935762000493620005e4565b80851615620004a157918102915b93841c939080029062000473565b509250929050565b6000620004c860ff841683620004cf565b9392505050565b600082620004e0575060016200057f565b81620004ef575060006200057f565b8160018114620005085760028114620005135762000533565b60019150506200057f565b60ff841115620005275762000527620005e4565b50506001821b6200057f565b5060208310610133831016604e8410600b841016171562000558575081810a6200057f565b6200056483836200046e565b80600019048211156200057b576200057b620005e4565b0290505b92915050565b6000816000190483118215151615620005a257620005a2620005e4565b500290565b600181811c90821680620005bc57607f821691505b60208210811415620005de57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6134e6806200060a6000396000f3fe608060405234801561001057600080fd5b506004361061038d5760003560e01c806386f6c3c1116101de578063c867d60b1161010f578063edafd4ad116100ad578063f708a64f1161007c578063f708a64f146107de578063fa3853be146107f1578063fdcf45ab14610804578063ffb2c4791461080c57600080fd5b8063edafd4ad146107a6578063f2fde38b146107b9578063f44a5fb9146107cc578063f64fbd7b146107d557600080fd5b8063dd62ed3e116100e9578063dd62ed3e14610748578063e260d91114610781578063e2d1e75c1461078a578063e96fada21461079357600080fd5b8063c867d60b14610709578063d2060a331461072c578063d889e3cd1461073f57600080fd5b8063a9059cbb1161017c578063c210b78711610156578063c210b787146106be578063c257955b146106c7578063c272301d146106d0578063c7f267d1146106fc57600080fd5b8063a9059cbb14610685578063abe57e7014610698578063c1ebb47b146106ab57600080fd5b80638f3fa860116101b85780638f3fa8601461064e57806395d89b4114610657578063a457c2d71461065f578063a8aa1b311461067257600080fd5b806386f6c3c11461060e5780638b98f6ce146106215780638da5cb5b1461062957600080fd5b80633807a89b116102c35780636d9b1191116102615780637249001911610230578063724900191461057357806379cc6790146105865780637e7ae1f61461059957806385a270fd146105ac57600080fd5b80636d9b1191146105265780636ef948c51461053957806370a0823114610542578063715018a61461056b57600080fd5b806342966c681161029d57806342966c68146104d45780634355855a146104e75780635b2a7d681461050a578063658d4b7f1461051357600080fd5b80633807a89b1461048b578063395093511461049e5780633f4218e0146104b157600080fd5b806323b872dd116103305780633003b4f71161030a5780633003b4f71461044d578063313ce5671461046057806333f70a8c1461046f5780633705b3921461048257600080fd5b806323b872dd1461041f57806324a1d30e14610432578063254634a71461043a57600080fd5b806315f7e05e1161036c57806315f7e05e146103e6578063180b0d7e146103fb57806318160ddd146104045780632198cf6c1461040c57600080fd5b8062afb3251461039257806306fdde03146103ae578063095ea7b3146103c3575b600080fd5b61039b60155481565b6040519081526020015b60405180910390f35b6103b661081f565b6040516103a59190613360565b6103d66103d1366004613120565b6108b1565b60405190151581526020016103a5565b6103f96103f4366004613037565b6108c8565b005b61039b61271081565b60025461039b565b6103f961041a3660046130eb565b610999565b6103d661042d3660046130aa565b610a11565b6103f9610ad2565b6103f96104483660046132f7565b610bd2565b6103f961045b366004613245565b610da1565b604051601281526020016103a5565b61039b61047d366004613277565b610e7b565b61039b60145481565b6103f961049936600461314c565b610fe5565b6103d66104ac366004613120565b611085565b6103d66104bf366004613037565b600b6020526000908152604090205460ff1681565b6103f96104e2366004613245565b6110c1565b6103d66104f5366004613037565b600d6020526000908152604090205460ff1681565b61039b60105481565b6103f96105213660046130eb565b6110ce565b6103f96105343660046132f7565b611141565b61039b60115481565b61039b610550366004613037565b6001600160a01b031660009081526020819052604090205490565b6103f96112f9565b6103f9610581366004613245565b61134d565b6103f9610594366004613120565b6113a9565b61039b6105a736600461322a565b611448565b6105e76105ba3660046132dc565b6007602052600090815260409020805460019091015460ff82169161010090046001600160a01b03169083565b6040805160ff90941684526001600160a01b039092166020840152908201526060016103a5565b6103f961061c366004613299565b611465565b6103f961156d565b6005546001600160a01b03165b6040516001600160a01b0390911681526020016103a5565b61039b60165481565b6103b66116ba565b6103d661066d366004613120565b6116c9565b600e54610636906001600160a01b031681565b6103d6610693366004613120565b61177a565b6103f96106a6366004613277565b611787565b6103f96106b9366004613245565b61181c565b61039b60095481565b61039b600a5481565b6106366106de3660046132dc565b60ff166000908152600660205260409020546001600160a01b031690565b6017546103d69060ff1681565b6103d6610717366004613037565b600c6020526000908152604090205460ff1681565b6103f961073a366004613245565b611b7d565b61039b60125481565b61039b610756366004613071565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61039b60185481565b61039b60085481565b600f54610636906001600160a01b031681565b6103f96107b4366004613037565b611c1c565b6103f96107c7366004613037565b611c9e565b61039b60195481565b61039b60135481565b6103f96107ec3660046130eb565b611d6b565b6103f96107ff3660046132dc565b611dbd565b6103f9612117565b6103f961081a366004613245565b612130565b60606003805461082e906133e3565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906133e3565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b60006108be338484612272565b5060015b92915050565b601a805462ff0000191662010000179055610914600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6040517f15f7e05e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015291909116906315f7e05e90602401600060405180830381600087803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050601a805462ff000019169055505050565b6005546001600160a01b031633146109e65760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000610a1e8484846123ca565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ab85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016109dd565b610ac58533858403612272565b60019150505b9392505050565b600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546001600160a01b03166001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190613054565b600e80546001600160a01b0319166001600160a01b0392831690811782556000908152600c60209081526040808320805460ff19908116600190811790925594549095168352600d909152902080549091169091179055565b6005546001600160a01b03163314610c1a5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b806001600160a01b031663bb9b0e116040518163ffffffff1660e01b815260040160206040518083038186803b158015610c5357600080fd5b505afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190613054565b6001600160a01b0316306001600160a01b031614610ceb5760405162461bcd60e51b815260206004820152601060248201527f506c7567696e206e6f742076616c69640000000000000000000000000000000060448201526064016109dd565b6040805160608101825260ff8481168083526001600160a01b03858116602080860182815242878901908152600086815260078452899020975188549251909516610100027fffffffffffffffffffffff0000000000000000000000000000000000000000009092169490961693909317929092178555925160019094019390935592519081527ff3e44d72134edbcfa291935b844c19d17f2d07d32e815e603f8541308e1b633c910160405180910390a25050565b6005546001600160a01b03163314610de95760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b62015180811015610e3c5760405162461bcd60e51b815260206004820152600f60248201527f44656c617920746f6f20736d616c6c000000000000000000000000000000000060448201526064016109dd565b600981905542600a556040518181527f881ed576bf5a6166a3eeb00d5e829eca45e717f655ca310912f35b6e438edb3c9060200160405180910390a150565b601a805462ff00001916620100001790556000610ec9600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6040517f33f70a8c00000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b0391909116906333f70a8c90604401602060405180830381600087803b158015610f2d57600080fd5b505af1925050508015610f5d575060408051601f3d908101601f19168201909252610f5a9181019061325e565b60015b610fd2573d808015610f8b576040519150601f19603f3d011682016040523d82523d6000602084013e610f90565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051610fc09190613360565b60405180910390a160009150506108c2565b601a805462ff00001916905590506108c2565b6005546001600160a01b0316331461102d5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60005b825181101561106f5761105d83828151811061104e5761104e61344f565b60200260200101516000612587565b806110678161341e565b915050611030565b508015611081576017805460ff191690555b5050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108be9185906110bc908690613373565b612272565b6110cb338261273b565b50565b6005546001600160a01b031633146111165760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111895760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60ff82166000908152600660205260409020546001600160a01b0316156111f25760405162461bcd60e51b815260206004820152601460248201527f506c7567696e20616c726561647920736574757000000000000000000000000060448201526064016109dd565b806001600160a01b031663bb9b0e116040518163ffffffff1660e01b815260040160206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190613054565b6001600160a01b0316306001600160a01b0316146112c35760405162461bcd60e51b815260206004820152601060248201527f506c7567696e206e6f742076616c69640000000000000000000000000000000060448201526064016109dd565b60ff8216600090815260066020526040812080546001600160a01b0319166001600160a01b0384161790556110819083906128c0565b6005546001600160a01b031633146113415760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b61134b6000612968565b565b6005546001600160a01b031633146113955760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b620b71b081106113a457600080fd5b601855565b60006113b58333610756565b90508181101561142c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e63650000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6114398333848403612272565b611443838361273b565b505050565b6000811561145857505060155490565b505060145490565b919050565b6005546001600160a01b031633146114ad5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6127106114c6846114c087818b8b6129ba565b906129ba565b146115135760405162461bcd60e51b815260206004820152600e60248201527f496e636f7272656374206665657300000000000000000000000000000000000060448201526064016109dd565b60108690556011859055601284905560138390556014829055601581905561153e61271060056129c6565b6014541061154b57600080fd5b61155861271060056129c6565b6015541061156557600080fd5b505050505050565b6005546001600160a01b031633146115b55760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6009546116045760405162461bcd60e51b815260206004820152601560248201527f5468657265206973206e6f2063616e646964617465000000000000000000000060448201526064016109dd565b4261161c600854600a546129ba90919063ffffffff16565b106116695760405162461bcd60e51b815260206004820152601460248201527f44656c617920686173206e6f742070617373656400000000000000000000000060448201526064016109dd565b7fe2f8f6f8cfd1eb62b24aebcd6545714702eae4a2437111f497e023ae295cfe0e60095460405161169c91815260200190565b60405180910390a16009805460085564012a05f200600a5560009055565b60606004805461082e906133e3565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117635760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109dd565b6117703385858403612272565b5060019392505050565b60006108be3384846123ca565b6005546001600160a01b031633146117cf5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6000821180156117df5750600081115b80156117ed57506127108111155b6117f657600080fd5b808261180160025490565b61180b91906133ad565b611815919061338b565b6016555050565b60175460ff16156118955760405162461bcd60e51b815260206004820152602260248201527f4e65656420746f2075706461746520686f6c6465727320746f2073776170626160448201527f636b00000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b8061189d5750565b601a805461ff0019166101001790556010546000906118cb90612710906118c59085906129d2565b906129c6565b905060006118ea6127106118c5601254866129d290919063ffffffff16565b905060006119096127106118c5601354876129d290919063ffffffff16565b905060006119238261191d858189896129de565b906129de565b90508315611a3157600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546040517f51c6590a000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b03909116906351c6590a90602401600060405180830381600087803b1580156119b357600080fd5b505af19250505080156119c4575060015b611a31573d8080156119f2576040519150601f19603f3d011682016040523d82523d6000602084013e6119f7565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051611a279190613360565b60405180910390a1505b8215611a4f57600f54611a4f9030906001600160a01b0316856123ca565b8115611a5f57611a5f308361273b565b8015611b6b57600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546040517fb6b55f25000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015611aed57600080fd5b505af1925050508015611afe575060015b611b6b573d808015611b2c576040519150601f19603f3d011682016040523d82523d6000602084013e611b31565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051611b619190613360565b60405180910390a1505b5050601a805461ff0019169055505050565b6005546001600160a01b03163314611bc55760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b600254811115611c175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206175746f73776170207468726573686f6c6400000000000060448201526064016109dd565b601955565b6005546001600160a01b03163314611c645760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b600f80546001600160a01b039092166001600160a01b0319909216821790556000908152600c60205260409020805460ff19166001179055565b6005546001600160a01b03163314611ce65760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6001600160a01b038116611d625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109dd565b6110cb81612968565b6005546001600160a01b03163314611db35760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6110818282612587565b6005546001600160a01b03163314611e055760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60ff81166000908152600760205260409020805461010090046001600160a01b0316611e735760405162461bcd60e51b815260206004820152601560248201527f5468657265206973206e6f2063616e646964617465000000000000000000000060448201526064016109dd565b60095415611ee95760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f74207570677261646520706c7567696e207768696c65206368616e60448201527f67696e6720617070726f76616c2064656c61790000000000000000000000000060648201526084016109dd565b42611f0360085483600101546129ba90919063ffffffff16565b10611f505760405162461bcd60e51b815260206004820152601460248201527f44656c617920686173206e6f742070617373656400000000000000000000000060448201526064016109dd565b80546040516101009091046001600160a01b0316815260ff8316907f278338c5ff3ee22e705a9ea3d286fe2b9f88068102ea404e42d45321d3226c179060200160405180910390a260ff82166000908152600660205260409020546001600160a01b0316156120a05760ff82166000908152600660205260408082205481517f09e137c300000000000000000000000000000000000000000000000000000000815291516001600160a01b03909116926309e137c3926004808201939182900301818387803b15801561202257600080fd5b505af1925050508015612033575060015b6120a0573d808015612061576040519150601f19603f3d011682016040523d82523d6000602084013e612066565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c556299380816040516120969190613360565b60405180910390a1505b805460ff8316600090815260066020526040902080546101009092046001600160a01b03166001600160a01b031990921691909117905580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16815564012a05f2006001808301919091556110819083906128c0565b3060009081526020819052604090205461134b9061181c565b601a805462ff000019166201000017905561217c600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6001600160a01b031663ffb2c479826040518263ffffffff1660e01b81526004016121a991815260200190565b602060405180830381600087803b1580156121c357600080fd5b505af19250505080156121f3575060408051601f3d908101601f191682019092526121f09181019061325e565b60015b612262573d808015612221576040519150601f19603f3d011682016040523d82523d6000602084013e612226565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c556299380816040516122569190613360565b60405180910390a15050565b50601a805462ff00001916905550565b6001600160a01b0383166122ed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b0382166123695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dd565b6001600160a01b0382166124905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dd565b80158061249f5750601a5460ff165b806124b15750601a54610100900460ff165b806124c45750601a5462010000900460ff165b156124dd576124d48383836129ea565b61144382612bd0565b6124e682612cb1565b156124f3576124f3612117565b601a805460ff19166001179055600e546001600160a01b03838116911614600061251d8585612d24565b6125275782612532565b612532828685612d6a565b905061253f8585836129ea565b601a805460ff1916905561255284612bd0565b61255c8585612dc0565b60185415158015612570575060175460ff16155b1561258057612580601854612130565b5050505050565b6001600160a01b03821630148015906125ae5750600e546001600160a01b03838116911614155b6125b757600080fd5b6001600160a01b0382166000908152600d6020526040902080548215801560ff1990921691909117909155601a805462ff000019166201000017905561269557600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b0316604051630a5b654b60e11b81526001600160a01b0384811660048301526000602483015291909116906314b6ca9690604401600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b5050505061272b565b7f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03838116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050505b5050601a805462ff000019169055565b6001600160a01b0382166127b75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b038216600090815260208190526040902054818110156128465760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b03831660009081526020819052604081208383039055600280548492906128759084906133cc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60ff82166000908152600660205260409020546001600160a01b03166128e93082600019612272565b6001600160a01b0381166000908152600b602090815260408083208054600160ff199182168117909255600c84528285208054821683179055600d909352922080549091168217905560ff8416141561294457611443610ad2565b60ff831660021415611443578115611443576017805460ff19166001179055505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610acb8284613373565b6000610acb828461338b565b6000610acb82846133ad565b6000610acb82846133cc565b6001600160a01b038316612a4e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dd565b6001600160a01b038216612ab05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dd565b6001600160a01b03831660009081526020819052604090205481811015612b3f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b76908490613373565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bc291815260200190565b60405180910390a350505050565b6001600160a01b0381166000908152600c602052604090205460ff1680612c045750600e546001600160a01b038281169116145b80612c1957506001600160a01b03811661dead145b15612c215750565b6016546001600160a01b03821660009081526020819052604090205411156110cb5760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657220616d6f756e74206578636565647320746865206261672060448201527f73697a652e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b600e546000906001600160a01b0316336001600160a01b031614158015612cdb5750601a5460ff16155b8015612ce957506000601954115b8015612d025750600e546001600160a01b038381169116145b80156108c2575060195430600090815260208190526040902054101592915050565b6001600160a01b0382166000908152600b602052604081205460ff16158015610acb5750506001600160a01b03166000908152600b602052604090205460ff1615919050565b600080612d7685611448565b905080612d865782915050610acb565b6000612710612d9583866133ad565b612d9f919061338b565b9050612dac8530836129ea565b612db681856133cc565b9695505050505050565b601a805462ff00001916620100001790556001600160a01b0382166000908152600d602052604090205460ff16612eec577f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03838116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b158015612e6e57600080fd5b505af1925050508015612e7f575060015b612eec573d808015612ead576040519150601f19603f3d011682016040523d82523d6000602084013e612eb2565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051612ee29190613360565b60405180910390a1505b6001600160a01b0381166000908152600d602052604090205460ff1661272b577f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03828116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b158015612f8957600080fd5b505af1925050508015612f9a575060015b61272b573d808015612fc8576040519150601f19603f3d011682016040523d82523d6000602084013e612fcd565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051612ffd9190613360565b60405180910390a15061272b565b80356114608161347b565b8035801515811461146057600080fd5b803560ff8116811461146057600080fd5b60006020828403121561304957600080fd5b8135610acb8161347b565b60006020828403121561306657600080fd5b8151610acb8161347b565b6000806040838503121561308457600080fd5b823561308f8161347b565b9150602083013561309f8161347b565b809150509250929050565b6000806000606084860312156130bf57600080fd5b83356130ca8161347b565b925060208401356130da8161347b565b929592945050506040919091013590565b600080604083850312156130fe57600080fd5b82356131098161347b565b915061311760208401613016565b90509250929050565b6000806040838503121561313357600080fd5b823561313e8161347b565b946020939093013593505050565b6000806040838503121561315f57600080fd5b823567ffffffffffffffff8082111561317757600080fd5b818501915085601f83011261318b57600080fd5b813560208282111561319f5761319f613465565b8160051b604051601f19603f830116810181811086821117156131c4576131c4613465565b604052838152828101945085830182870184018b10156131e357600080fd5b600096505b8487101561320d576131f98161300b565b8652600196909601959483019483016131e8565b50965061321d9050878201613016565b9450505050509250929050565b60006020828403121561323c57600080fd5b610acb82613016565b60006020828403121561325757600080fd5b5035919050565b60006020828403121561327057600080fd5b5051919050565b6000806040838503121561328a57600080fd5b50508035926020909101359150565b60008060008060008060c087890312156132b257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000602082840312156132ee57600080fd5b610acb82613026565b6000806040838503121561330a57600080fd5b61308f83613026565b6000815180845260005b818110156133395760208185018101518683018201520161331d565b8181111561334b576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610acb6020830184613313565b6000821982111561338657613386613439565b500190565b6000826133a857634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156133c7576133c7613439565b500290565b6000828210156133de576133de613439565b500390565b600181811c908216806133f757607f821691505b6020821081141561341857634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561343257613432613439565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110cb57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212208abdfdd825a52a7ac13e23dccb0962595459b1127a0a02fcf1eb5bed8cf783f664736f6c634300080700330000000000000000000000000000000000000000000000000000000000003840
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000003840
-----Decoded View---------------
Arg [0] : _approvalDelay (uint256): 14400
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000003840
Deployed ByteCode Sourcemap
32746:11811:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33464:34;;;;;;;;;16122:25:1;;;16110:2;16095:18;33464:34:0;;;;;;;;6523:100;;;:::i;:::-;;;;;;;:::i;8690:169::-;;;;;;:::i;:::-;;:::i;:::-;;;7021:14:1;;7014:22;6996:41;;6984:2;6969:18;8690:169:0;6856:187:1;40292:180:0;;;;;;:::i;:::-;;:::i;:::-;;33505:46;;33546:5;33505:46;;7643:108;7731:12;;7643:108;;35765:158;;;;;;:::i;:::-;;:::i;9341:492::-;;;;;;:::i;:::-;;:::i;35142:174::-;;;:::i;30001:506::-;;;;;;:::i;:::-;;:::i;31590:318::-;;;;;;:::i;:::-;;:::i;7485:93::-;;;7568:2;16553:36:1;;16541:2;16526:18;7485:93:0;16411:184:1;39792:492:0;;;;;;:::i;:::-;;:::i;33425:32::-;;;;;;38260:350;;;;;;:::i;:::-;;:::i;10242:215::-;;;;;;:::i;:::-;;:::i;32858:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16981:91;;;;;;:::i;:::-;;:::i;32966:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33243:41;;;;;;35475:119;;;;;;:::i;:::-;;:::i;29576:417::-;;;;;;:::i;:::-;;:::i;33291:42::-;;;;;;7814:127;;;;;;:::i;:::-;-1:-1:-1;;;;;7915:18:0;7888:7;7915:18;;;;;;;;;;;;7814:127;19421:94;;;:::i;35324:143::-;;;;;;:::i;:::-;;:::i;17391:368::-;;;;;;:::i;:::-;;:::i;42756:194::-;;;;;;:::i;:::-;;:::i;29014:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29014:57:0;;;;;;;;16828:4:1;16816:17;;;16798:36;;-1:-1:-1;;;;;16870:55:1;;;16865:2;16850:18;;16843:83;16942:18;;;16935:34;16786:2;16771:18;29014:57:0;16600:375:1;38618:898:0;;;;;;:::i;:::-;;:::i;31916:470::-;;;:::i;18770:87::-;18843:6;;-1:-1:-1;;;;;18843:6:0;18770:87;;;-1:-1:-1;;;;;6177:55:1;;;6159:74;;6147:2;6132:18;18770:87:0;6013:226:1;33560:28:0;;;;;;6742:104;;;:::i;10960:413::-;;;;;;:::i;:::-;;:::i;33171:19::-;;;;;-1:-1:-1;;;;;33171:19:0;;;8154:175;;;;;;:::i;:::-;;:::i;35931:240::-;;;;;;:::i;:::-;;:::i;36794:1458::-;;;;;;:::i;:::-;;:::i;29115:36::-;;;;;;29158:40;;;;;;32460:163;;;;;;:::i;:::-;32596:19;;32541:21;32596:19;;;:8;:19;;;;;;-1:-1:-1;;;;;32596:19:0;;32460:163;33597:47;;;;;;;;;32908:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36179:279;;;;;;:::i;:::-;;:::i;33340:38::-;;;;;;8392:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8508:18:0;;;8481:7;8508:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8392:151;33704:37;;;;;;29080:28;;;;;;33199:35;;;;;-1:-1:-1;;;;;33199:35:0;;;36466:229;;;;;;:::i;:::-;;:::i;19670:192::-;;;;;;:::i;:::-;;:::i;33791:36::-;;;;;;33385:33;;;;;;35602:155;;;;;;:::i;:::-;;:::i;30515:1067::-;;;;;;:::i;:::-;;:::i;36703:83::-;;;:::i;39524:260::-;;;;;;:::i;:::-;;:::i;6523:100::-;6577:13;6610:5;6603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6523:100;:::o;8690:169::-;8773:4;8790:39;4310:10;8813:7;8822:6;8790:8;:39::i;:::-;-1:-1:-1;8847:4:0;8690:169;;;;;:::o;40292:180::-;40356:12;:19;;-1:-1:-1;;40356:19:0;;;;;40386:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;40386:20;:47;;;;;-1:-1:-1;;;;;6177:55:1;;;40386:47:0;;;6159:74:1;40386:34:0;;;;;;;6132:18:1;;40386:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40444:12:0;:20;;-1:-1:-1;;40444:20:0;;;-1:-1:-1;;;40292:180:0:o;35765:158::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;;;;;;;;;-1:-1:-1;;;;;35879:27:0;;;::::1;;::::0;;;:19:::1;:27;::::0;;;;:36;;-1:-1:-1;;35879:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35765:158::o;9341:492::-;9481:4;9498:36;9508:6;9516:9;9527:6;9498:9;:36::i;:::-;-1:-1:-1;;;;;9574:19:0;;9547:24;9574:19;;;:11;:19;;;;;;;;4310:10;9574:33;;;;;;;;9626:26;;;;9618:79;;;;-1:-1:-1;;;9618:79:0;;11565:2:1;9618:79:0;;;11547:21:1;11604:2;11584:18;;;11577:30;11643:34;11623:18;;;11616:62;11714:10;11694:18;;;11687:38;11742:19;;9618:79:0;11363:404:1;9618:79:0;9733:57;9742:6;4310:10;9783:6;9764:16;:25;9733:8;:57::i;:::-;9821:4;9814:11;;;9341:492;;;;;;:::o;35142:174::-;28838:1;43035:26;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;-1:-1:-1;;;;;35200:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35193:4;:32;;-1:-1:-1;;;;;;35193:32:0;-1:-1:-1;;;;;35193:32:0;;;;;;;;-1:-1:-1;35236:25:0;;;:19;:25;;;;;;;;:32;;-1:-1:-1;;35236:32:0;;;-1:-1:-1;35236:32:0;;;;;;35296:4;;;;;35279:22;;:16;:22;;;;;:29;;;;;;;;;;35142:174::o;30001:506::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;30169:15:::1;-1:-1:-1::0;;;;;30158:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30141:57:0::1;30149:4;-1:-1:-1::0;;;;;30141:57:0::1;;30119:123;;;::::0;-1:-1:-1;;;30119:123:0;;15007:2:1;30119:123:0::1;::::0;::::1;14989:21:1::0;15046:2;15026:18;;;15019:30;15085:18;15065;;;15058:46;15121:18;;30119:123:0::1;14805:340:1::0;30119:123:0::1;30283:152;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;30283:152:0;;::::1;;::::0;;::::1;::::0;;;30408:15:::1;30283:152:::0;;;;;;-1:-1:-1;30253:27:0;;;:16:::1;:27:::0;;;;;:182;;;;;;;;::::1;;;::::0;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;30253:182:0;;::::1;::::0;;;;30453:46;;6159:74:1;;;30453:46:0::1;::::0;6132:18:1;30453:46:0::1;;;;;;;30001:506:::0;;:::o;31590:318::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;28950:6:::1;31682:14;:36;;31674:64;;;::::0;-1:-1:-1;;;31674:64:0;;10818:2:1;31674:64:0::1;::::0;::::1;10800:21:1::0;10857:2;10837:18;;;10830:30;10896:17;10876:18;;;10869:45;10931:18;;31674:64:0::1;10616:339:1::0;31674:64:0::1;31749:21;:38:::0;;;31826:15:::1;31798:25;:43:::0;31859:41:::1;::::0;16122:25:1;;;31859:41:0::1;::::0;16110:2:1;16095:18;31859:41:0::1;;;;;;;31590:318:::0;:::o;39792:492::-;39929:12;:19;;-1:-1:-1;;39929:19:0;;;;;39889:22;39963:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;39963:20;:58;;;;;;;;16332:25:1;;;16373:18;;;16366:34;;;-1:-1:-1;;;;;39963:35:0;;;;;;;16305:18:1;;39963:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39963:58:0;;;;;;;;-1:-1:-1;;39963:58:0;;;;;;;;;;;;:::i;:::-;;;39959:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:29;40235:6;40213:29;;;;;;:::i;:::-;;;;;;;;40264:1;40257:8;;;;;39959:318;40095:12;:20;;-1:-1:-1;;40095:20:0;;;40137:15;-1:-1:-1;40130:22:0;;38260:350;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;38403:9:::1;38398:111;38422:7;:14;38418:1;:18;38398:111;;;38458:39;38479:7;38487:1;38479:10;;;;;;;;:::i;:::-;;;;;;;38491:5;38458:20;:39::i;:::-;38438:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38398:111;;;;38523:16;38519:84;;;38556:27;:35:::0;;-1:-1:-1;;38556:35:0::1;::::0;;38519:84:::1;38260:350:::0;;:::o;10242:215::-;4310:10;10330:4;10379:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10379:34:0;;;;;;;;;;10330:4;;10347:80;;10370:7;;10379:47;;10416:10;;10379:47;:::i;:::-;10347:8;:80::i;16981:91::-;17037:27;4310:10;17057:6;17037:5;:27::i;:::-;16981:91;:::o;35475:119::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;-1:-1:-1;;;;;35558:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;35558:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35475:119::o;29576:417::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;29700:19:::1;::::0;::::1;29731:1;29700:19:::0;;;:8:::1;:19;::::0;;;;;-1:-1:-1;;;;;29700:19:0::1;:33:::0;29692:66:::1;;;::::0;-1:-1:-1;;;29692:66:0;;14658:2:1;29692:66:0::1;::::0;::::1;14640:21:1::0;14697:2;14677:18;;;14670:30;14736:22;14716:18;;;14709:50;14776:18;;29692:66:0::1;14456:344:1::0;29692:66:0::1;29819:15;-1:-1:-1::0;;;;;29808:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29791:57:0::1;29799:4;-1:-1:-1::0;;;;;29791:57:0::1;;29769:123;;;::::0;-1:-1:-1;;;29769:123:0;;15007:2:1;29769:123:0::1;::::0;::::1;14989:21:1::0;15046:2;15026:18;;;15019:30;15085:18;15065;;;15058:46;15121:18;;29769:123:0::1;14805:340:1::0;29769:123:0::1;29903:19;::::0;::::1;;::::0;;;:8:::1;:19;::::0;;;;:37;;-1:-1:-1;;;;;;29903:37:0::1;-1:-1:-1::0;;;;;29903:37:0;::::1;;::::0;;29951:34:::1;::::0;29903:19;;29951:16:::1;:34::i;19421:94::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;19486:21:::1;19504:1;19486:9;:21::i;:::-;19421:94::o:0;35324:143::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;35417:6:::1;35411:3;:12;35403:21;;;::::0;::::1;;35435:18;:24:::0;35324:143::o;17391:368::-;17468:24;17495:32;17505:7;4310:10;8392:151;:::i;17495:32::-;17468:59;;17566:6;17546:16;:26;;17538:75;;;;-1:-1:-1;;;17538:75:0;;12335:2:1;17538:75:0;;;12317:21:1;12374:2;12354:18;;;12347:30;12413:34;12393:18;;;12386:62;12484:6;12464:18;;;12457:34;12508:19;;17538:75:0;12133:400:1;17538:75:0;17649:58;17658:7;4310:10;17700:6;17681:16;:25;17649:8;:58::i;:::-;17729:22;17735:7;17744:6;17729:5;:22::i;:::-;17457:302;17391:368;;:::o;42756:194::-;42813:7;42837;42833:110;;;-1:-1:-1;;42868:12:0;;;42756:194::o;42833:110::-;-1:-1:-1;;42920:11:0;;;42756:194::o;42833:110::-;42756:194;;;:::o;38618:898::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;33546:5:::1;38909:148;39041:15:::0;38909:109:::1;38997:20:::0;38909:109;:20;38952:21;38909:42:::1;:65::i;:::-;:87:::0;::::1;:109::i;:148::-;:166;38887:230;;;::::0;-1:-1:-1;;;38887:230:0;;10475:2:1;38887:230:0::1;::::0;::::1;10457:21:1::0;10514:2;10494:18;;;10487:30;10553:16;10533:18;;;10526:44;10587:18;;38887:230:0::1;10273:338:1::0;38887:230:0::1;39128:19;:42:::0;;;39181:20:::1;:44:::0;;;39236:19:::1;:42:::0;;;39289:14:::1;:32:::0;;;39332:11:::1;:26:::0;;;39369:12:::1;:28:::0;;;39430:21:::1;33546:5;39449:1;39430:18;:21::i;:::-;39416:11;;:35;39408:44;;;::::0;::::1;;39486:21;33546:5;39505:1;39486:18;:21::i;:::-;39471:12;;:36;39463:45;;;::::0;::::1;;38618:898:::0;;;;;;:::o;31916:470::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;31986:21:::1;::::0;31978:60:::1;;;::::0;-1:-1:-1;;;31978:60:0;;13548:2:1;31978:60:0::1;::::0;::::1;13530:21:1::0;13587:2;13567:18;;;13560:30;13626:23;13606:18;;;13599:51;13667:18;;31978:60:0::1;13346:345:1::0;31978:60:0::1;32118:15;32071:44;32101:13;;32071:25;;:29;;:44;;;;:::i;:::-;:62;32049:132;;;::::0;-1:-1:-1;;;32049:132:0;;10126:2:1;32049:132:0::1;::::0;::::1;10108:21:1::0;10165:2;10145:18;;;10138:30;10204:22;10184:18;;;10177:50;10244:18;;32049:132:0::1;9924:344:1::0;32049:132:0::1;32199:44;32221:21;;32199:44;;;;16122:25:1::0;;16110:2;16095:18;;15976:177;32199:44:0::1;;;;;;;;32272:21;::::0;;32256:13:::1;:37:::0;32332:10:::1;32304:25;:38:::0;-1:-1:-1;32353:25:0;;31916:470::o;6742:104::-;6798:13;6831:7;6824:14;;;;;:::i;10960:413::-;4310:10;11053:4;11097:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11097:34:0;;;;;;;;;;11150:35;;;;11142:85;;;;-1:-1:-1;;;11142:85:0;;15352:2:1;11142:85:0;;;15334:21:1;15391:2;15371:18;;;15364:30;15430:34;15410:18;;;15403:62;15501:7;15481:18;;;15474:35;15526:19;;11142:85:0;15150:401:1;11142:85:0;11263:67;4310:10;11286:7;11314:15;11295:16;:34;11263:8;:67::i;:::-;-1:-1:-1;11361:4:0;;10960:413;-1:-1:-1;;;10960:413:0:o;8154:175::-;8240:4;8257:42;4310:10;8281:9;8292:6;8257:9;:42::i;35931:240::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;36062:1:::1;36050:9;:13;:28;;;;;36077:1;36067:7;:11;36050:28;:48;;;;;36093:5;36082:7;:16;;36050:48;36042:57;;;::::0;::::1;;36156:7;36143:9;36127:13;7731:12:::0;;;7643:108;36127:13:::1;:25;;;;:::i;:::-;36126:37;;;;:::i;:::-;36110:13;:53:::0;-1:-1:-1;;35931:240:0:o;36794:1458::-;36869:27;;;;36868:28;36846:112;;;;-1:-1:-1;;;36846:112:0;;11162:2:1;36846:112:0;;;11144:21:1;11201:2;11181:18;;;11174:30;11240:34;11220:18;;;11213:62;11311:4;11291:18;;;11284:32;11333:19;;36846:112:0;10960:398:1;36846:112:0;36973:11;36969:50;;36794:1458;:::o;36969:50::-;37029:14;:21;;-1:-1:-1;;37029:21:0;;;;;37100:19;;37029:21;;37089:75;;33546:5;;37089:31;;:6;;:10;:31::i;:::-;:35;;:75::i;:::-;37063:101;;37175:25;37203:75;33546:5;37203:31;37214:19;;37203:6;:10;;:31;;;;:::i;:75::-;37175:103;;37289:20;37312:46;33546:5;37312:26;37323:14;;37312:6;:10;;:26;;;;:::i;:46::-;37289:69;-1:-1:-1;37369:20:0;37392:110;37289:69;37392:78;37452:17;37392:78;:6;37417:15;37392:24;:41::i;:::-;:59;;:78::i;:110::-;37369:133;-1:-1:-1;37519:19:0;;37515:236;;28838:1;43035:26;32596:19;:8;:19;;;;37559:48;;;;;;;;16122:25:1;;;-1:-1:-1;;;;;32596:19:0;;;;37559:31;;16095:18:1;;37559:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37555:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37695:29;37717:6;37695:29;;;;;;:::i;:::-;;;;;;;;37611:129;37555:185;37765:21;;37761:119;;37828:20;;37803:65;;37821:4;;-1:-1:-1;;;;;37828:20:0;37850:17;37803:9;:65::i;:::-;37894:16;;37890:83;;37927:34;37941:4;37948:12;37927:5;:34::i;:::-;37987:16;;37983:227;;28894:1;43231:28;32596:19;:8;:19;;;;38024:42;;;;;;;;16122:25:1;;;-1:-1:-1;;;;;32596:19:0;;;;38024:28;;16095:18:1;;38024:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38020:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38154:29;38176:6;38154:29;;;;;;:::i;:::-;;;;;;;;38070:129;38020:179;-1:-1:-1;;38222:14:0;:22;;-1:-1:-1;;38222:22:0;;;-1:-1:-1;;;36794:1458:0:o;36179:279::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;7731:12;;36312:18:::1;:35;;36290:111;;;::::0;-1:-1:-1;;;36290:111:0;;13898:2:1;36290:111:0::1;::::0;::::1;13880:21:1::0;13937:2;13917:18;;;13910:30;13976:28;13956:18;;;13949:56;14022:18;;36290:111:0::1;13696:350:1::0;36290:111:0::1;36412:17;:38:::0;36179:279::o;36466:229::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;36583:20:::1;:44:::0;;-1:-1:-1;;;;;36583:44:0;;::::1;-1:-1:-1::0;;;;;;36583:44:0;;::::1;::::0;::::1;::::0;;:20:::1;36638:42:::0;;;:19:::1;:42;::::0;;;;:49;;-1:-1:-1;;36638:49:0::1;36583:44:::0;36638:49:::1;::::0;;36466:229::o;19670:192::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;-1:-1:-1;;;;;19759:22:0;::::1;19751:73;;;::::0;-1:-1:-1;;;19751:73:0;;8909:2:1;19751:73:0::1;::::0;::::1;8891:21:1::0;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;9058:8;9038:18;;;9031:36;9084:19;;19751:73:0::1;8707:402:1::0;19751:73:0::1;19835:19;19845:8;19835:9;:19::i;35602:155::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;35713:36:::1;35734:6;35742;35713:20;:36::i;30515:1067::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;30621:27:::1;::::0;::::1;30585:33;30621:27:::0;;;:16:::1;:27;::::0;;;;30683:24;;::::1;::::0;::::1;-1:-1:-1::0;;;;;30683:24:0::1;30661:109;;;::::0;-1:-1:-1;;;30661:109:0;;13548:2:1;30661:109:0::1;::::0;::::1;13530:21:1::0;13587:2;13567:18;;;13560:30;13626:23;13606:18;;;13599:51;13667:18;;30661:109:0::1;13346:345:1::0;30661:109:0::1;30803:21;::::0;:26;30781:127:::1;;;::::0;-1:-1:-1;;;30781:127:0;;15758:2:1;30781:127:0::1;::::0;::::1;15740:21:1::0;15797:2;15777:18;;;15770:30;15836:34;15816:18;;;15809:62;15907:21;15887:18;;;15880:49;15946:19;;30781:127:0::1;15556:415:1::0;30781:127:0::1;30985:15;30941:41;30968:13;;30941:9;:22;;;:26;;:41;;;;:::i;:::-;:59;30919:129;;;::::0;-1:-1:-1;;;30919:129:0;;10126:2:1;30919:129:0::1;::::0;::::1;10108:21:1::0;10165:2;10145:18;;;10138:30;10204:22;10184:18;;;10177:50;10244:18;;30919:129:0::1;9924:344:1::0;30919:129:0::1;31092:24:::0;;31066:51:::1;::::0;31092:24:::1;::::0;;::::1;-1:-1:-1::0;;;;;31092:24:0::1;6159:74:1::0;;31066:51:0::1;::::0;::::1;::::0;::::1;::::0;6147:2:1;6132:18;31066:51:0::1;;;;;;;31134:19;::::0;::::1;31165:1;31134:19:::0;;;:8:::1;:19;::::0;;;;;-1:-1:-1;;;;;31134:19:0::1;:33:::0;31130:248:::1;;31199:19;::::0;::::1;;::::0;;;:8:::1;:19;::::0;;;;;;31188:46;;;;;;;-1:-1:-1;;;;;31199:19:0;;::::1;::::0;31188:44:::1;::::0;:46:::1;::::0;;::::1;::::0;;;;;;;31199:19;;31188:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;31184:183;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31322:29;31344:6;31322:29;;;;;;:::i;:::-;;;;;;;;31238:129;31184:183;31410:24:::0;;31388:19:::1;::::0;::::1;31410:24;31388:19:::0;;;:8:::1;:19;::::0;;;;:46;;31410:24:::1;::::0;;::::1;-1:-1:-1::0;;;;;31410:24:0::1;-1:-1:-1::0;;;;;;31388:46:0;;::::1;::::0;;;::::1;::::0;;31445:37;;;::::1;::::0;;31518:10:::1;-1:-1:-1::0;31493:22:0;;::::1;:35:::0;;;;31541:33:::1;::::0;31388:19;;31541:16:::1;:33::i;36703:83::-:0;36771:4;7888:7;7915:18;;;;;;;;;;;36744:34;;36794:1458;:::i;39524:260::-;39572:12;:19;;-1:-1:-1;;39572:19:0;;;;;39606:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;39606:20;-1:-1:-1;;;;;39606:28:0;;39635:3;39606:33;;;;;;;;;;;;;16122:25:1;;16110:2;16095:18;;15976:177;39606:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39606:33:0;;;;;;;;-1:-1:-1;;39606:33:0;;;;;;;;;;;;:::i;:::-;;;39602:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39736:29;39758:6;39736:29;;;;;;:::i;:::-;;;;;;;;39688:89;16981:91;:::o;39602:175::-;-1:-1:-1;39655:12:0;:20;;-1:-1:-1;;39655:20:0;;;39524:260;:::o;14644:380::-;-1:-1:-1;;;;;14780:19:0;;14772:68;;;;-1:-1:-1;;;14772:68:0;;14253:2:1;14772:68:0;;;14235:21:1;14292:2;14272:18;;;14265:30;14331:34;14311:18;;;14304:62;14402:6;14382:18;;;14375:34;14426:19;;14772:68:0;14051:400:1;14772:68:0;-1:-1:-1;;;;;14859:21:0;;14851:68;;;;-1:-1:-1;;;14851:68:0;;9316:2:1;14851:68:0;;;9298:21:1;9355:2;9335:18;;;9328:30;9394:34;9374:18;;;9367:62;9465:4;9445:18;;;9438:32;9487:19;;14851:68:0;9114:398:1;14851:68:0;-1:-1:-1;;;;;14932:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14984:32;;16122:25:1;;;14984:32:0;;16095:18:1;14984:32:0;;;;;;;14644:380;;;:::o;40480:1024::-;-1:-1:-1;;;;;40612:18:0;;40604:68;;;;-1:-1:-1;;;40604:68:0;;13142:2:1;40604:68:0;;;13124:21:1;13181:2;13161:18;;;13154:30;13220:34;13200:18;;;13193:62;-1:-1:-1;;;13271:18:1;;;13264:35;13316:19;;40604:68:0;12940:401:1;40604:68:0;-1:-1:-1;;;;;40691:16:0;;40683:64;;;;-1:-1:-1;;;40683:64:0;;7696:2:1;40683:64:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:33;7868:19;;40683:64:0;7494:399:1;40683:64:0;40764:11;;;:25;;-1:-1:-1;40779:10:0;;;;40764:25;:43;;;-1:-1:-1;40793:14:0;;;;;;;40764:43;:59;;;-1:-1:-1;40811:12:0;;;;;;;40764:59;40760:182;;;40840:33;40856:4;40862:2;40866:6;40840:15;:33::i;:::-;40888:21;40906:2;40888:17;:21::i;40760:182::-;40958:19;40974:2;40958:15;:19::i;:::-;40954:65;;;40994:13;:11;:13::i;:::-;41031:10;:17;;-1:-1:-1;;41031:17:0;41044:4;41031:17;;;41084:4;;-1:-1:-1;;;;;41078:10:0;;;41084:4;;41078:10;41031;41126:24;41141:4;41078:2;41126:14;:24::i;:::-;:95;;41215:6;41126:95;;;41166:33;41175:9;41186:4;41192:6;41166:8;:33::i;:::-;41101:120;;41232:41;41248:4;41254:2;41258:14;41232:15;:41::i;:::-;41286:10;:18;;-1:-1:-1;;41286:18:0;;;41317:21;41335:2;41317:17;:21::i;:::-;41351:20;41362:4;41368:2;41351:10;:20::i;:::-;44524:18;;:22;;41388:53;;;;-1:-1:-1;41414:27:0;;;;41413:28;41388:53;41384:113;;;41458:27;41466:18;;41458:7;:27::i;:::-;40593:911;;40480:1024;;;:::o;44020:419::-;-1:-1:-1;;;;;44106:23:0;;44124:4;44106:23;;;;:41;;-1:-1:-1;44143:4:0;;-1:-1:-1;;;;;44133:14:0;;;44143:4;;44133:14;;44106:41;44098:50;;;;;;-1:-1:-1;;;;;44159:24:0;;;;;;:16;:24;;;;;:33;;;;;;-1:-1:-1;;44159:33:0;;;;;;;;;;44203:12;:19;;-1:-1:-1;;44203:19:0;;;;;44233:168;;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;44260:40;;-1:-1:-1;;;44260:40:0;;-1:-1:-1;;;;;6444:55:1;;;44260:40:0;;;6426:74:1;44298:1:0;6516:18:1;;;6509:34;44260:29:0;;;;;;;6399:18:1;;44260:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44233:168;;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;44333:56;;-1:-1:-1;;;44333:56:0;;;;;6426:74:1;;;;6516:18;;;6509:34;44333:56:0;32596:19;;;;;44333:29;;6399:18:1;;;;;44333:56:0;;;;;43231:28;32596:19;44333:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44233:168;-1:-1:-1;;44411:12:0;:20;;-1:-1:-1;;44411:20:0;;;44020:419::o;13615:591::-;-1:-1:-1;;;;;13699:21:0;;13691:67;;;;-1:-1:-1;;;13691:67:0;;12740:2:1;13691:67:0;;;12722:21:1;12779:2;12759:18;;;12752:30;12818:34;12798:18;;;12791:62;12889:3;12869:18;;;12862:31;12910:19;;13691:67:0;12538:397:1;13691:67:0;-1:-1:-1;;;;;13858:18:0;;13833:22;13858:18;;;;;;;;;;;13895:24;;;;13887:71;;;;-1:-1:-1;;;13887:71:0;;8506:2:1;13887:71:0;;;8488:21:1;8545:2;8525:18;;;8518:30;8584:34;8564:18;;;8557:62;8655:4;8635:18;;;8628:32;8677:19;;13887:71:0;8304:398:1;13887:71:0;-1:-1:-1;;;;;13994:18:0;;:9;:18;;;;;;;;;;14015:23;;;13994:44;;14060:12;:22;;14032:6;;13994:9;14060:22;;14032:6;;14060:22;:::i;:::-;;;;-1:-1:-1;;14100:37:0;;16122:25:1;;;14126:1:0;;-1:-1:-1;;;;;14100:37:0;;;;;16110:2:1;16095:18;14100:37:0;;;;;;;17457:302;17391:368;;:::o;34518:616::-;32596:19;;;34628:21;32596:19;;;:8;:19;;;;;;-1:-1:-1;;;;;32596:19:0;34679:57;34696:4;32596:19;-1:-1:-1;;34679:8:0;:57::i;:::-;-1:-1:-1;;;;;34747:26:0;;;;;;:11;:26;;;;;;;;:33;;34776:4;-1:-1:-1;;34747:33:0;;;;;;;;34791:19;:34;;;;;:41;;;;;;;;34843:16;:31;;;;;:38;;;;;;;;;34747:33;34898:31;;;34894:233;;;34946:14;:12;:14::i;34894:233::-;34982:33;;;28894:1;34982:33;34978:149;;;35036:9;35032:84;;;35066:27;:34;;-1:-1:-1;;35066:34:0;35096:4;35066:34;;;34617:517;34518:616;;:::o;19870:173::-;19945:6;;;-1:-1:-1;;;;;19962:17:0;;;-1:-1:-1;;;;;;19962:17:0;;;;;;;19995:40;;19945:6;;;19962:17;19945:6;;19995:40;;19926:16;;19995:40;19915:128;19870:173;:::o;22850:98::-;22908:7;22935:5;22939:1;22935;:5;:::i;23987:98::-;24045:7;24072:5;24076:1;24072;:5;:::i;23588:98::-;23646:7;23673:5;23677:1;23673;:5;:::i;23231:98::-;23289:7;23316:5;23320:1;23316;:5;:::i;11863:733::-;-1:-1:-1;;;;;12003:20:0;;11995:70;;;;-1:-1:-1;;;11995:70:0;;13142:2:1;11995:70:0;;;13124:21:1;13181:2;13161:18;;;13154:30;13220:34;13200:18;;;13193:62;-1:-1:-1;;;13271:18:1;;;13264:35;13316:19;;11995:70:0;12940:401:1;11995:70:0;-1:-1:-1;;;;;12084:23:0;;12076:71;;;;-1:-1:-1;;;12076:71:0;;7696:2:1;12076:71:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:33;7868:19;;12076:71:0;7494:399:1;12076:71:0;-1:-1:-1;;;;;12244:17:0;;12220:21;12244:17;;;;;;;;;;;12280:23;;;;12272:74;;;;-1:-1:-1;;;12272:74:0;;9719:2:1;12272:74:0;;;9701:21:1;9758:2;9738:18;;;9731:30;9797:34;9777:18;;;9770:62;9868:8;9848:18;;;9841:36;9894:19;;12272:74:0;9517:402:1;12272:74:0;-1:-1:-1;;;;;12382:17:0;;;:9;:17;;;;;;;;;;;12402:22;;;12382:42;;12446:20;;;;;;;;:30;;12418:6;;12382:9;12446:30;;12418:6;;12446:30;:::i;:::-;;;;;;;;12511:9;-1:-1:-1;;;;;12494:35:0;12503:6;-1:-1:-1;;;;;12494:35:0;;12522:6;12494:35;;;;16122:25:1;;16110:2;16095:18;;15976:177;12494:35:0;;;;;;;;11984:612;11863:733;;;:::o;43642:370::-;-1:-1:-1;;;;;43729:29:0;;;;;;:19;:29;;;;;;;;;:62;;-1:-1:-1;43787:4:0;;-1:-1:-1;;;;;43775:16:0;;;43787:4;;43775:16;43729:62;:95;;;-1:-1:-1;;;;;;43808:16:0;;33047:42;43808:16;43729:95;43711:158;;;43642:370;:::o;43711:158::-;43926:13;;-1:-1:-1;;;;;7915:18:0;;7888:7;7915:18;;;;;;;;;;;43903:36;;43881:123;;;;-1:-1:-1;;;43881:123:0;;8100:2:1;43881:123:0;;;8082:21:1;8139:2;8119:18;;;8112:30;8178:34;8158:18;;;8151:62;8249:7;8229:18;;;8222:35;8274:19;;43881:123:0;7898:401:1;43354:280:0;43467:4;;43414;;-1:-1:-1;;;;;43467:4:0;4310:10;-1:-1:-1;;;;;43451:20:0;;;:48;;;;-1:-1:-1;43489:10:0;;;;43488:11;43451:48;:86;;;;;43536:1;43516:17;;:21;43451:86;:113;;;;-1:-1:-1;43560:4:0;;-1:-1:-1;;;;;43554:10:0;;;43560:4;;43554:10;43451:113;:175;;;;-1:-1:-1;43609:17:0;;43599:4;7888:7;7915:18;;;;;;;;;;;43581:45;;43431:195;43354:280;-1:-1:-1;;43354:280:0:o;42145:175::-;-1:-1:-1;;;;;42275:17:0;;42245:4;42275:17;;;:11;:17;;;;;;;;42274:18;:38;;;;-1:-1:-1;;;;;;;42297:15:0;;;;;:11;:15;;;;;;;;42296:16;;42145:175;-1:-1:-1;42145:175:0:o;42328:420::-;42444:7;42464:16;42483:21;42496:7;42483:12;:21::i;:::-;42464:40;-1:-1:-1;42519:13:0;42515:59;;42556:6;42549:13;;;;;42515:59;42584:17;33546:5;42605:17;42614:8;42605:6;:17;:::i;:::-;42604:36;;;;:::i;:::-;42584:56;;42653:49;42669:6;42685:4;42692:9;42653:15;:49::i;:::-;42722:18;42731:9;42722:6;:18;:::i;:::-;42715:25;42328:420;-1:-1:-1;;;;;;42328:420:0:o;41512:625::-;41577:12;:19;;-1:-1:-1;;41577:19:0;;;;;-1:-1:-1;;;;;41612:22:0;;41577:19;41612:22;;;:16;:22;;;;;;41577:19;41612:22;41607:244;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;41655:52;;-1:-1:-1;;;41655:52:0;;;;;6426:74:1;;;;6516:18;;;6509:34;41655:52:0;32596:19;;;;;41655:29;;6399:18:1;;;;;41655:52:0;;;;;43231:28;32596:19;41655:52;;;;;;;;;;;;;;;;;;;;;;;;;41651:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41795:29;41817:6;41795:29;;;;;;:::i;:::-;;;;;;;;41711:129;41651:189;-1:-1:-1;;;;;41866:20:0;;;;;;:16;:20;;;;;;;;41861:238;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;41907:48;;-1:-1:-1;;;41907:48:0;;;;;6426:74:1;;;;6516:18;;;6509:34;41907:48:0;32596:19;;;;;41907:29;;6399:18:1;;;;;41907:48:0;;;;;43231:28;32596:19;41907:48;;;;;;;;;;;;;;;;;;;;;;;;;41903:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42043:29;42065:6;42043:29;;;;;;:::i;:::-;;;;;;;;41959:129;41903:185;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:160::-;218:20;;274:13;;267:21;257:32;;247:60;;303:1;300;293:12;318:156;384:20;;444:4;433:16;;423:27;;413:55;;464:1;461;454:12;479:247;538:6;591:2;579:9;570:7;566:23;562:32;559:52;;;607:1;604;597:12;559:52;646:9;633:23;665:31;690:5;665:31;:::i;731:251::-;801:6;854:2;842:9;833:7;829:23;825:32;822:52;;;870:1;867;860:12;822:52;902:9;896:16;921:31;946:5;921:31;:::i;987:388::-;1055:6;1063;1116:2;1104:9;1095:7;1091:23;1087:32;1084:52;;;1132:1;1129;1122:12;1084:52;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;987:388;;;;;:::o;1380:456::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:52;;;1542:1;1539;1532:12;1494:52;1581:9;1568:23;1600:31;1625:5;1600:31;:::i;:::-;1650:5;-1:-1:-1;1707:2:1;1692:18;;1679:32;1720:33;1679:32;1720:33;:::i;:::-;1380:456;;1772:7;;-1:-1:-1;;;1826:2:1;1811:18;;;;1798:32;;1380:456::o;1841:315::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2022:9;2009:23;2041:31;2066:5;2041:31;:::i;:::-;2091:5;-1:-1:-1;2115:35:1;2146:2;2131:18;;2115:35;:::i;:::-;2105:45;;1841:315;;;;;:::o;2161:::-;2229:6;2237;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2345:9;2332:23;2364:31;2389:5;2364:31;:::i;:::-;2414:5;2466:2;2451:18;;;;2438:32;;-1:-1:-1;;;2161:315:1:o;2481:1202::-;2571:6;2579;2632:2;2620:9;2611:7;2607:23;2603:32;2600:52;;;2648:1;2645;2638:12;2600:52;2688:9;2675:23;2717:18;2758:2;2750:6;2747:14;2744:34;;;2774:1;2771;2764:12;2744:34;2812:6;2801:9;2797:22;2787:32;;2857:7;2850:4;2846:2;2842:13;2838:27;2828:55;;2879:1;2876;2869:12;2828:55;2915:2;2902:16;2937:4;2960:2;2956;2953:10;2950:36;;;2966:18;;:::i;:::-;3012:2;3009:1;3005:10;3044:2;3038:9;3107:2;3103:7;3098:2;3094;3090:11;3086:25;3078:6;3074:38;3162:6;3150:10;3147:22;3142:2;3130:10;3127:18;3124:46;3121:72;;;3173:18;;:::i;:::-;3209:2;3202:22;3259:18;;;3293:15;;;;-1:-1:-1;3328:11:1;;;3358;;;3354:20;;3351:33;-1:-1:-1;3348:53:1;;;3397:1;3394;3387:12;3348:53;3419:1;3410:10;;3429:169;3443:2;3440:1;3437:9;3429:169;;;3500:23;3519:3;3500:23;:::i;:::-;3488:36;;3461:1;3454:9;;;;;3544:12;;;;3576;;3429:169;;;-1:-1:-1;3617:6:1;-1:-1:-1;3642:35:1;;-1:-1:-1;3658:18:1;;;3642:35;:::i;:::-;3632:45;;;;;;2481:1202;;;;;:::o;3688:180::-;3744:6;3797:2;3785:9;3776:7;3772:23;3768:32;3765:52;;;3813:1;3810;3803:12;3765:52;3836:26;3852:9;3836:26;:::i;3873:180::-;3932:6;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;-1:-1:-1;4024:23:1;;3873:180;-1:-1:-1;3873:180:1:o;4058:184::-;4128:6;4181:2;4169:9;4160:7;4156:23;4152:32;4149:52;;;4197:1;4194;4187:12;4149:52;-1:-1:-1;4220:16:1;;4058:184;-1:-1:-1;4058:184:1:o;4247:248::-;4315:6;4323;4376:2;4364:9;4355:7;4351:23;4347:32;4344:52;;;4392:1;4389;4382:12;4344:52;-1:-1:-1;;4415:23:1;;;4485:2;4470:18;;;4457:32;;-1:-1:-1;4247:248:1:o;4500:523::-;4604:6;4612;4620;4628;4636;4644;4697:3;4685:9;4676:7;4672:23;4668:33;4665:53;;;4714:1;4711;4704:12;4665:53;-1:-1:-1;;4737:23:1;;;4807:2;4792:18;;4779:32;;-1:-1:-1;4858:2:1;4843:18;;4830:32;;4909:2;4894:18;;4881:32;;-1:-1:-1;4960:3:1;4945:19;;4932:33;;-1:-1:-1;5012:3:1;4997:19;4984:33;;-1:-1:-1;4500:523:1;-1:-1:-1;4500:523:1:o;5028:182::-;5085:6;5138:2;5126:9;5117:7;5113:23;5109:32;5106:52;;;5154:1;5151;5144:12;5106:52;5177:27;5194:9;5177:27;:::i;5215:317::-;5281:6;5289;5342:2;5330:9;5321:7;5317:23;5313:32;5310:52;;;5358:1;5355;5348:12;5310:52;5381:27;5398:9;5381:27;:::i;5537:471::-;5578:3;5616:5;5610:12;5643:6;5638:3;5631:19;5668:1;5678:162;5692:6;5689:1;5686:13;5678:162;;;5754:4;5810:13;;;5806:22;;5800:29;5782:11;;;5778:20;;5771:59;5707:12;5678:162;;;5858:6;5855:1;5852:13;5849:87;;;5924:1;5917:4;5908:6;5903:3;5899:16;5895:27;5888:38;5849:87;-1:-1:-1;5990:2:1;5969:15;-1:-1:-1;;5965:29:1;5956:39;;;;5997:4;5952:50;;5537:471;-1:-1:-1;;5537:471:1:o;7048:217::-;7195:2;7184:9;7177:21;7158:4;7215:44;7255:2;7244:9;7240:18;7232:6;7215:44;:::i;16980:128::-;17020:3;17051:1;17047:6;17044:1;17041:13;17038:39;;;17057:18;;:::i;:::-;-1:-1:-1;17093:9:1;;16980:128::o;17113:274::-;17153:1;17179;17169:189;;-1:-1:-1;;;17211:1:1;17204:88;17315:4;17312:1;17305:15;17343:4;17340:1;17333:15;17169:189;-1:-1:-1;17372:9:1;;17113:274::o;17392:168::-;17432:7;17498:1;17494;17490:6;17486:14;17483:1;17480:21;17475:1;17468:9;17461:17;17457:45;17454:71;;;17505:18;;:::i;:::-;-1:-1:-1;17545:9:1;;17392:168::o;17565:125::-;17605:4;17633:1;17630;17627:8;17624:34;;;17638:18;;:::i;:::-;-1:-1:-1;17675:9:1;;17565:125::o;17695:437::-;17774:1;17770:12;;;;17817;;;17838:61;;17892:4;17884:6;17880:17;17870:27;;17838:61;17945:2;17937:6;17934:14;17914:18;17911:38;17908:218;;;-1:-1:-1;;;17979:1:1;17972:88;18083:4;18080:1;18073:15;18111:4;18108:1;18101:15;17908:218;;17695:437;;;:::o;18137:135::-;18176:3;-1:-1:-1;;18197:17:1;;18194:43;;;18217:18;;:::i;:::-;-1:-1:-1;18264:1:1;18253:13;;18137:135::o;18277:184::-;-1:-1:-1;;;18326:1:1;18319:88;18426:4;18423:1;18416:15;18450:4;18447:1;18440:15;18466:184;-1:-1:-1;;;18515:1:1;18508:88;18615:4;18612:1;18605:15;18639:4;18636:1;18629:15;18655:184;-1:-1:-1;;;18704:1:1;18697:88;18804:4;18801:1;18794:15;18828:4;18825:1;18818:15;18844:154;-1:-1:-1;;;;;18923:5:1;18919:54;18912:5;18909:65;18899:93;;18988:1;18985;18978:12
Swarm Source
ipfs://8abdfdd825a52a7ac13e23dccb0962595459b1127a0a02fcf1eb5bed8cf783f6