More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 605 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Ten By ... | 13990601 | 976 days ago | IN | 0 ETH | 0.01795087 | ||||
Withdraw Ten By ... | 13813934 | 1004 days ago | IN | 0 ETH | 0.01391443 | ||||
Withdraw Ten By ... | 13407446 | 1068 days ago | IN | 0 ETH | 0.02022867 | ||||
Withdraw Ten By ... | 13222572 | 1097 days ago | IN | 0 ETH | 0.00845768 | ||||
Withdraw Ten By ... | 13219757 | 1097 days ago | IN | 0 ETH | 0.01234143 | ||||
Withdraw Ten By ... | 12826301 | 1158 days ago | IN | 0 ETH | 0.00629888 | ||||
Deposit Ten By U... | 12821308 | 1159 days ago | IN | 0 ETH | 0.00699584 | ||||
Mine LP Ten | 12815197 | 1160 days ago | IN | 0 ETH | 0.00330067 | ||||
Withdraw Ten By ... | 12768553 | 1167 days ago | IN | 0 ETH | 0.00527325 | ||||
Mine LP Ten | 12754245 | 1169 days ago | IN | 0 ETH | 0.00052061 | ||||
Withdraw Ten By ... | 12753887 | 1170 days ago | IN | 0 ETH | 0.00122825 | ||||
Mine LP Ten | 12735443 | 1172 days ago | IN | 0 ETH | 0.00246351 | ||||
Mine LP Ten | 12659119 | 1184 days ago | IN | 0 ETH | 0.00303055 | ||||
Withdraw Ten By ... | 12651486 | 1185 days ago | IN | 0 ETH | 0.00132444 | ||||
Mine LP Ten | 12651479 | 1185 days ago | IN | 0 ETH | 0.00175965 | ||||
Deposit Ten By U... | 12599916 | 1193 days ago | IN | 0 ETH | 0.00186704 | ||||
Withdraw Ten By ... | 12599812 | 1194 days ago | IN | 0 ETH | 0.00136444 | ||||
Mine LP Ten | 12581671 | 1196 days ago | IN | 0 ETH | 0.0016971 | ||||
Mine LP Ten | 12580996 | 1196 days ago | IN | 0 ETH | 0.00168492 | ||||
Mine LP Ten | 12564292 | 1199 days ago | IN | 0 ETH | 0.00255409 | ||||
Withdraw Ten By ... | 12547260 | 1202 days ago | IN | 0 ETH | 0.00355849 | ||||
Mine LP Ten | 12445985 | 1217 days ago | IN | 0 ETH | 0.00734805 | ||||
Mine LP Ten | 12444539 | 1218 days ago | IN | 0 ETH | 0.00499785 | ||||
Withdraw Ten By ... | 12439308 | 1218 days ago | IN | 0 ETH | 0.01132485 | ||||
Mine LP Ten | 12385677 | 1227 days ago | IN | 0 ETH | 0.00510417 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Tenet
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-24 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.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); } pragma solidity ^0.6.0; // import "./IERC20.sol"; // import "../../math/SafeMath.sol"; // import "../../utils/Address.sol"; pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.6.0; //import "../GSN/Context.sol"; /** * @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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.6.0; //import "../../GSN/Context.sol"; //import "./IERC20.sol"; //import "../../math/SafeMath.sol"; //import "../../utils/Address.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } pragma solidity 0.6.12; //import "./openzeppelin/contracts/token/ERC20/ERC20.sol"; //import "./openzeppelin/contracts/access/Ownable.sol"; // TntToken with Governance. contract TenetToken is ERC20("Tenet", "TEN"), Ownable { // @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } function burn(address _account, uint256 _amount) public onlyOwner { _burn(_account, _amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol // @notice A record of each accounts delegate mapping (address => address) internal _delegates; // @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } // @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; // @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; // @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); // @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); // @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; // @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); // @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "delegateBySig: invalid nonce"); require(now <= expiry, "delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying TNTs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } pragma solidity 0.6.12; //import "./openzeppelin/contracts/token/ERC20/IERC20.sol"; //import "./openzeppelin/contracts/token/ERC20/SafeERC20.sol"; //import "./openzeppelin/contracts/utils/EnumerableSet.sol"; //import "./openzeppelin/contracts/math/SafeMath.sol"; //import "./openzeppelin/contracts/access/Ownable.sol"; contract TenetMine is Ownable { using SafeMath for uint256; struct MinePeriodInfo { uint256 tenPerBlockPeriod; uint256 totalTenPeriod; } uint256 public bonusEndBlock; uint256 public bonus_multiplier; uint256 public bonusTenPerBlock; uint256 public startBlock; uint256 public endBlock; uint256 public subBlockNumerPeriod; uint256 public totalSupply; MinePeriodInfo[] public allMinePeriodInfo; constructor( uint256 _startBlock, uint256 _bonusEndBlockOffset, uint256 _bonus_multiplier, uint256 _bonusTenPerBlock, uint256 _subBlockNumerPeriod, uint256[] memory _tenPerBlockPeriod ) public { startBlock = _startBlock>0 ? _startBlock : block.number + 1; bonusEndBlock = startBlock.add(_bonusEndBlockOffset); bonus_multiplier = _bonus_multiplier; bonusTenPerBlock = _bonusTenPerBlock; subBlockNumerPeriod = _subBlockNumerPeriod; totalSupply = bonusEndBlock.sub(startBlock).mul(bonusTenPerBlock).mul(bonus_multiplier); for (uint256 i = 0; i < _tenPerBlockPeriod.length; i++) { allMinePeriodInfo.push(MinePeriodInfo({ tenPerBlockPeriod: _tenPerBlockPeriod[i], totalTenPeriod: totalSupply })); totalSupply = totalSupply.add(subBlockNumerPeriod.mul(_tenPerBlockPeriod[i])); } endBlock = bonusEndBlock.add(subBlockNumerPeriod.mul(_tenPerBlockPeriod.length)); } function set_startBlock(uint256 _startBlock) public onlyOwner { require(block.number < _startBlock, "set_startBlock: startBlock invalid"); uint256 bonusEndBlockOffset = bonusEndBlock.sub(startBlock); startBlock = _startBlock>0 ? _startBlock : block.number + 1; bonusEndBlock = startBlock.add(bonusEndBlockOffset); endBlock = bonusEndBlock.add(subBlockNumerPeriod.mul(allMinePeriodInfo.length)); } function getMinePeriodCount() public view returns (uint256) { return allMinePeriodInfo.length; } function calcMineTenReward(uint256 _from,uint256 _to) public view returns (uint256) { if(_from < startBlock){ _from = startBlock; } if(_from >= endBlock){ return 0; } if(_from >= _to){ return 0; } uint256 mineFrom = calcTotalMine(_from); uint256 mineTo= calcTotalMine(_to); return mineTo.sub(mineFrom); } function calcTotalMine(uint256 _to) public view returns (uint256 totalMine) { if(_to <= startBlock){ totalMine = 0; }else if(_to <= bonusEndBlock){ totalMine = _to.sub(startBlock).mul(bonusTenPerBlock).mul(bonus_multiplier); }else if(_to < endBlock){ uint256 periodIndex = _to.sub(bonusEndBlock).div(subBlockNumerPeriod); uint256 periodBlock = _to.sub(bonusEndBlock).mod(subBlockNumerPeriod); MinePeriodInfo memory minePeriodInfo = allMinePeriodInfo[periodIndex]; uint256 curMine = periodBlock.mul(minePeriodInfo.tenPerBlockPeriod); totalMine = curMine.add(minePeriodInfo.totalTenPeriod); }else{ totalMine = totalSupply; } } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to,uint256 _end,uint256 _tokenBonusEndBlock,uint256 _tokenBonusMultipler) public pure returns (uint256) { if(_to > _end){ _to = _end; } if(_from>_end){ return 0; }else if (_to <= _tokenBonusEndBlock) { return _to.sub(_from).mul(_tokenBonusMultipler); } else if (_from >= _tokenBonusEndBlock) { return _to.sub(_from); } else { return _tokenBonusEndBlock.sub(_from).mul(_tokenBonusMultipler).add(_to.sub(_tokenBonusEndBlock)); } } } pragma solidity 0.6.12; //import "./openzeppelin/contracts/token/ERC20/IERC20.sol"; //import "./openzeppelin/contracts/token/ERC20/SafeERC20.sol"; //import "./openzeppelin/contracts/utils/EnumerableSet.sol"; //import "./openzeppelin/contracts/math/SafeMath.sol"; //import "./openzeppelin/contracts/access/Ownable.sol"; //import "./TenetToken.sol"; //import "./TenetMine.sol"; // Tenet is the master of TEN. He can make TEN and he is a fair guy. contract Tenet is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; uint256 rewardTokenDebt; uint256 rewardTenDebt; uint256 lastBlockNumber; uint256 freezeBlocks; uint256 freezeTen; } // Info of each pool. struct PoolSettingInfo{ address lpToken; address tokenAddr; address projectAddr; uint256 tokenAmount; uint256 startBlock; uint256 endBlock; uint256 tokenPerBlock; uint256 tokenBonusEndBlock; uint256 tokenBonusMultipler; } struct PoolInfo { uint256 lastRewardBlock; uint256 lpTokenTotalAmount; uint256 accTokenPerShare; uint256 accTenPerShare; uint256 userCount; uint256 amount; uint256 rewardTenDebt; uint256 mineTokenAmount; } struct TenPoolInfo { uint256 lastRewardBlock; uint256 accTenPerShare; uint256 allocPoint; uint256 lpTokenTotalAmount; } TenetToken public ten; TenetMine public tenMineCalc; IERC20 public lpTokenTen; address public devaddr; uint256 public devaddrAmount; uint256 public modifyAllocPointPeriod; uint256 public lastModifyAllocPointBlock; uint256 public totalAllocPoint; uint256 public devWithdrawStartBlock; uint256 public addpoolfee; uint256 public bonusAllocPointBlock; uint256 public minProjectUserCount; uint256 public emergencyWithdraw; uint256 public constant MINLPTOKEN_AMOUNT = 10; uint256 public constant PERSHARERATE = 1000000000000; PoolInfo[] public poolInfo; PoolSettingInfo[] public poolSettingInfo; TenPoolInfo public tenProjectPool; TenPoolInfo public tenUserPool; mapping (uint256 => mapping (address => UserInfo)) public userInfo; mapping (address => UserInfo) public userInfoUserPool; mapping (address => bool) public tenMintRightAddr; address public bonusAddr; uint256 public bonusPoolFeeRate; event AddPool(address indexed user, uint256 indexed pid, uint256 tokenAmount,uint256 lpTenAmount); event Deposit(address indexed user, uint256 indexed pid, uint256 amount,uint256 penddingToken,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event DepositFrom(address indexed user, uint256 indexed pid, uint256 amount,address from,uint256 penddingToken,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event MineLPToken(address indexed user, uint256 indexed pid, uint256 penddingToken,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount,uint256 penddingToken,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event DepositLPTen(address indexed user, uint256 indexed pid, uint256 amount,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event WithdrawLPTen(address indexed user, uint256 indexed pid, uint256 amount,uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event MineLPTen(address indexed user, uint256 penddingTen,uint256 freezeTen,uint256 freezeBlocks); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event DevWithdraw(address indexed user, uint256 amount); constructor( TenetToken _ten, TenetMine _tenMineCalc, IERC20 _lpTen, address _devaddr, uint256 _allocPointProject, uint256 _allocPointUser, uint256 _devWithdrawStartBlock, uint256 _modifyAllocPointPeriod, uint256 _bonusAllocPointBlock, uint256 _minProjectUserCount ) public { ten = _ten; tenMineCalc = _tenMineCalc; devaddr = _devaddr; lpTokenTen = _lpTen; tenProjectPool.allocPoint = _allocPointProject; tenUserPool.allocPoint = _allocPointUser; totalAllocPoint = _allocPointProject.add(_allocPointUser); devaddrAmount = 0; devWithdrawStartBlock = _devWithdrawStartBlock; addpoolfee = 0; emergencyWithdraw = 0; modifyAllocPointPeriod = _modifyAllocPointPeriod; lastModifyAllocPointBlock = tenMineCalc.startBlock(); bonusAllocPointBlock = _bonusAllocPointBlock; minProjectUserCount = _minProjectUserCount; bonusAddr = msg.sender; bonusPoolFeeRate = 0; } modifier onlyMinter() { require(tenMintRightAddr[msg.sender] == true, "onlyMinter: caller is no right to mint"); _; } modifier onlyNotEmergencyWithdraw() { require(emergencyWithdraw == 0, "onlyNotEmergencyWithdraw: emergencyWithdraw now"); _; } function poolLength() external view returns (uint256) { return poolInfo.length; } function set_basicInfo(TenetToken _ten,IERC20 _lpTokenTen,TenetMine _tenMineCalc,uint256 _devWithdrawStartBlock,uint256 _bonusAllocPointBlock,uint256 _minProjectUserCount) public onlyOwner { ten = _ten; lpTokenTen = _lpTokenTen; tenMineCalc = _tenMineCalc; devWithdrawStartBlock = _devWithdrawStartBlock; bonusAllocPointBlock = _bonusAllocPointBlock; minProjectUserCount = _minProjectUserCount; } function set_bonusInfo(address _bonusAddr,uint256 _addpoolfee,uint256 _bonusPoolFeeRate) public onlyOwner { bonusAddr = _bonusAddr; addpoolfee = _addpoolfee; bonusPoolFeeRate = _bonusPoolFeeRate; } function set_tenMintRightAddr(address _addr,bool isHaveRight) public onlyOwner { tenMintRightAddr[_addr] = isHaveRight; } function tenMint(address _toAddr,uint256 _amount) public onlyMinter { if(_amount > 0){ ten.mint(_toAddr,_amount); devaddrAmount = devaddrAmount.add(_amount.div(10)); } } /* function set_tenetToken(TenetToken _ten) public onlyOwner { ten = _ten; }*/ function set_tenNewOwner(address _tenNewOwner) public onlyOwner { ten.transferOwnership(_tenNewOwner); } /* function set_tenetLPToken(IERC20 _lpTokenTen) public onlyOwner { lpTokenTen = _lpTokenTen; } function set_tenetMine(TenetMine _tenMineCalc) public onlyOwner { tenMineCalc = _tenMineCalc; }*/ function set_emergencyWithdraw(uint256 _emergencyWithdraw) public onlyOwner { emergencyWithdraw = _emergencyWithdraw; } /* function set_addPoolFee(uint256 _addpoolfee) public onlyOwner { addpoolfee = _addpoolfee; } function set_devWithdrawStartBlock(uint256 _devWithdrawStartBlock) public onlyOwner { devWithdrawStartBlock = _devWithdrawStartBlock; } */ function set_allocPoint(uint256 _allocPointProject,uint256 _allocPointUser,uint256 _modifyAllocPointPeriod) public onlyOwner { _minePoolTen(tenProjectPool); _minePoolTen(tenUserPool); tenProjectPool.allocPoint = _allocPointProject; tenUserPool.allocPoint = _allocPointUser; modifyAllocPointPeriod = _modifyAllocPointPeriod; totalAllocPoint = _allocPointProject.add(_allocPointUser); require(totalAllocPoint > 0, "set_allocPoint: Alloc Point invalid"); } /* function set_bonusAllocPointBlock(uint256 _bonusAllocPointBlock) public onlyOwner { bonusAllocPointBlock = _bonusAllocPointBlock; } function set_minProjectUserCount(uint256 _minProjectUserCount) public onlyOwner { minProjectUserCount = _minProjectUserCount; } */ function add(address _lpToken, address _tokenAddr, uint256 _tokenAmount, uint256 _startBlock, uint256 _endBlockOffset, uint256 _tokenPerBlock, uint256 _tokenBonusEndBlockOffset, uint256 _tokenBonusMultipler, uint256 _lpTenAmount) public onlyNotEmergencyWithdraw { if(_startBlock == 0){ _startBlock = block.number; } require(block.number <= _startBlock, "add: startBlock invalid"); require(_endBlockOffset >= _tokenBonusEndBlockOffset, "add: bonusEndBlockOffset invalid"); require(tenMineCalc.getMultiplier(_startBlock,_startBlock.add(_endBlockOffset),_startBlock.add(_endBlockOffset),_startBlock.add(_tokenBonusEndBlockOffset),_tokenBonusMultipler).mul(_tokenPerBlock) <= _tokenAmount, "add: token amount invalid"); require(_tokenAmount > 0, "add: tokenAmount invalid"); IERC20(_tokenAddr).safeTransferFrom(msg.sender,address(this), _tokenAmount); if(addpoolfee > 0){ IERC20(address(ten)).safeTransferFrom(msg.sender,address(this), addpoolfee); if(bonusPoolFeeRate > 0){ IERC20(address(ten)).safeTransfer(bonusAddr, addpoolfee.mul(bonusPoolFeeRate).div(10000)); if(bonusPoolFeeRate < 10000){ ten.burn(address(this),addpoolfee.sub(addpoolfee.mul(bonusPoolFeeRate).div(10000))); } }else{ ten.burn(address(this),addpoolfee); } } uint256 pid = poolInfo.length; poolSettingInfo.push(PoolSettingInfo({ lpToken: _lpToken, tokenAddr: _tokenAddr, projectAddr: msg.sender, tokenAmount:_tokenAmount, startBlock: _startBlock, endBlock: _startBlock.add(_endBlockOffset), tokenPerBlock: _tokenPerBlock, tokenBonusEndBlock: _startBlock.add(_tokenBonusEndBlockOffset), tokenBonusMultipler: _tokenBonusMultipler })); poolInfo.push(PoolInfo({ lastRewardBlock: block.number > _startBlock ? block.number : _startBlock, accTokenPerShare: 0, accTenPerShare: 0, lpTokenTotalAmount: 0, userCount: 0, amount: 0, rewardTenDebt: 0, mineTokenAmount: 0 })); if(_lpTenAmount>=MINLPTOKEN_AMOUNT){ depositTenByProject(pid,_lpTenAmount); } emit AddPool(msg.sender, pid, _tokenAmount,_lpTenAmount); } function updateAllocPoint() public { if(lastModifyAllocPointBlock.add(modifyAllocPointPeriod) <= block.number){ uint256 totalLPTokenAmount = tenProjectPool.lpTokenTotalAmount.mul(bonusAllocPointBlock.add(1e4)).div(1e4).add(tenUserPool.lpTokenTotalAmount); if(totalLPTokenAmount > 0) { tenProjectPool.allocPoint = tenProjectPool.allocPoint.add(tenProjectPool.lpTokenTotalAmount.mul(1e4).mul(bonusAllocPointBlock.add(1e4)).div(1e4).div(totalLPTokenAmount)).div(2); tenUserPool.allocPoint = tenUserPool.allocPoint.add(tenUserPool.lpTokenTotalAmount.mul(1e4).div(totalLPTokenAmount)).div(2); totalAllocPoint = tenProjectPool.allocPoint.add(tenUserPool.allocPoint); lastModifyAllocPointBlock = block.number; require(totalAllocPoint > 0, "updateAllocPoint: Alloc Point invalid"); } } } // Update reward variables of the given pool to be up-to-date. function _minePoolTen(TenPoolInfo storage tenPool) internal { if (block.number <= tenPool.lastRewardBlock) { return; } if (tenPool.lpTokenTotalAmount < MINLPTOKEN_AMOUNT) { tenPool.lastRewardBlock = block.number; return; } if(emergencyWithdraw > 0){ tenPool.lastRewardBlock = block.number; return; } uint256 tenReward = tenMineCalc.calcMineTenReward(tenPool.lastRewardBlock, block.number); if(tenReward > 0){ tenReward = tenReward.mul(tenPool.allocPoint).div(totalAllocPoint); devaddrAmount = devaddrAmount.add(tenReward.div(10)); ten.mint(address(this), tenReward); tenPool.accTenPerShare = tenPool.accTenPerShare.add(tenReward.mul(PERSHARERATE).div(tenPool.lpTokenTotalAmount)); } tenPool.lastRewardBlock = block.number; updateAllocPoint(); } function _withdrawProjectTenPool(PoolInfo storage pool) internal returns (uint256 pending){ if (pool.amount >= MINLPTOKEN_AMOUNT) { pending = pool.amount.mul(tenProjectPool.accTenPerShare).div(PERSHARERATE).sub(pool.rewardTenDebt); if(pending > 0){ if(pool.userCount == 0){ ten.burn(address(this),pending); pending = 0; } else{ if(pool.userCount<minProjectUserCount){ uint256 newPending = pending.mul(bonusAllocPointBlock.mul(pool.userCount).div(minProjectUserCount).add(1e4)).div(bonusAllocPointBlock.add(1e4)); if(pending.sub(newPending) > 0){ ten.burn(address(this),pending.sub(newPending)); } pending = newPending; } pool.accTenPerShare = pool.accTenPerShare.add(pending.mul(PERSHARERATE).div(pool.lpTokenTotalAmount)); } } } } function _updateProjectTenPoolAmount(PoolInfo storage pool,uint256 _amount,uint256 amountType) internal{ if(amountType == 1){ lpTokenTen.safeTransferFrom(msg.sender, address(this), _amount); tenProjectPool.lpTokenTotalAmount = tenProjectPool.lpTokenTotalAmount.add(_amount); pool.amount = pool.amount.add(_amount); }else if(amountType == 2){ pool.amount = pool.amount.sub(_amount); lpTokenTen.safeTransfer(address(msg.sender), _amount); tenProjectPool.lpTokenTotalAmount = tenProjectPool.lpTokenTotalAmount.sub(_amount); } pool.rewardTenDebt = pool.amount.mul(tenProjectPool.accTenPerShare).div(PERSHARERATE); } function depositTenByProject(uint256 _pid,uint256 _amount) public onlyNotEmergencyWithdraw { require(_amount > 0, "depositTenByProject: lpamount not good"); PoolInfo storage pool = poolInfo[_pid]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; require(poolSetting.projectAddr == msg.sender, "depositTenByProject: not good"); _minePoolTen(tenProjectPool); _withdrawProjectTenPool(pool); _updateProjectTenPoolAmount(pool,_amount,1); emit DepositLPTen(msg.sender, 1, _amount,0,0,0); } function withdrawTenByProject(uint256 _pid,uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; require(poolSetting.projectAddr == msg.sender, "withdrawTenByProject: not good"); require(pool.amount >= _amount, "withdrawTenByProject: not good"); if(emergencyWithdraw == 0){ _minePoolTen(tenProjectPool); _withdrawProjectTenPool(pool); }else{ if(pool.lastRewardBlock < poolSetting.endBlock){ if(poolSetting.tokenAmount.sub(pool.mineTokenAmount) > 0){ IERC20(poolSetting.tokenAddr).safeTransfer(poolSetting.projectAddr,poolSetting.tokenAmount.sub(pool.mineTokenAmount)); } } } if(_amount > 0){ _updateProjectTenPoolAmount(pool,_amount,2); } emit WithdrawLPTen(msg.sender, 1, _amount,0,0,0); } function _updatePoolUserInfo(uint256 accTenPerShare,UserInfo storage user,uint256 _freezeBlocks,uint256 _freezeTen,uint256 _amount,uint256 _amountType) internal { if(_amountType == 1){ user.amount = user.amount.add(_amount); }else if(_amountType == 2){ user.amount = user.amount.sub(_amount); } user.rewardTenDebt = user.amount.mul(accTenPerShare).div(PERSHARERATE); user.lastBlockNumber = block.number; user.freezeBlocks = _freezeBlocks; user.freezeTen = _freezeTen; } function _calcFreezeTen(UserInfo storage user,uint256 accTenPerShare) internal view returns (uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen){ pendingTen = user.amount.mul(accTenPerShare).div(PERSHARERATE).sub(user.rewardTenDebt); uint256 blockNow = 0; if(pendingTen>0){ if(user.lastBlockNumber<tenMineCalc.startBlock()){ blockNow = block.number.sub(tenMineCalc.startBlock()); }else{ blockNow = block.number.sub(user.lastBlockNumber); } }else{ if(user.freezeTen > 0){ blockNow = block.number.sub(user.lastBlockNumber); } } uint256 periodBlockNumer = tenMineCalc.subBlockNumerPeriod(); freezeBlocks = blockNow.add(user.freezeBlocks); if(freezeBlocks <= periodBlockNumer){ freezeTen = pendingTen.add(user.freezeTen); pendingTen = 0; }else{ if(pendingTen == 0){ freezeBlocks = 0; freezeTen = 0; pendingTen = user.freezeTen; }else{ freezeTen = pendingTen.add(user.freezeTen).mul(periodBlockNumer).div(freezeBlocks); pendingTen = pendingTen.add(user.freezeTen).sub(freezeTen); freezeBlocks = periodBlockNumer; } } } function _withdrawUserTenPool(address userAddr,UserInfo storage user) internal returns (uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen){ (pendingTen,freezeBlocks,freezeTen) = _calcFreezeTen(user,tenUserPool.accTenPerShare); safeTenTransfer(userAddr, pendingTen); } function depositTenByUser(uint256 _amount) public onlyNotEmergencyWithdraw { require(_amount > 0, "depositTenByUser: lpamount not good"); UserInfo storage user = userInfoUserPool[msg.sender]; _minePoolTen(tenUserPool); (uint256 pending,uint256 freezeBlocks,uint256 freezeTen) = _withdrawUserTenPool(msg.sender,user); lpTokenTen.safeTransferFrom(address(msg.sender), address(this), _amount); _updatePoolUserInfo(tenUserPool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,1); tenUserPool.lpTokenTotalAmount = tenUserPool.lpTokenTotalAmount.add(_amount); emit DepositLPTen(msg.sender, 2, _amount,pending,freezeTen,freezeBlocks); } function withdrawTenByUser(uint256 _amount) public { require(_amount > 0, "withdrawTenByUser: lpamount not good"); UserInfo storage user = userInfoUserPool[msg.sender]; require(user.amount >= _amount, "withdrawTenByUser: not good"); if(emergencyWithdraw == 0){ _minePoolTen(tenUserPool); (uint256 pending,uint256 freezeBlocks,uint256 freezeTen) = _withdrawUserTenPool(msg.sender,user); _updatePoolUserInfo(tenUserPool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,2); emit WithdrawLPTen(msg.sender, 2, _amount,pending,freezeTen,freezeBlocks); }else{ _updatePoolUserInfo(tenUserPool.accTenPerShare,user,user.freezeBlocks,user.freezeTen,_amount,2); emit WithdrawLPTen(msg.sender, 2, _amount,0,user.freezeTen,user.freezeBlocks); } tenUserPool.lpTokenTotalAmount = tenUserPool.lpTokenTotalAmount.sub(_amount); lpTokenTen.safeTransfer(address(msg.sender), _amount); } function mineLPTen() public onlyNotEmergencyWithdraw { _minePoolTen(tenUserPool); UserInfo storage user = userInfoUserPool[msg.sender]; (uint256 pending,uint256 freezeBlocks,uint256 freezeTen) = _withdrawUserTenPool(msg.sender,user); _updatePoolUserInfo(tenUserPool.accTenPerShare,user,freezeBlocks,freezeTen,0,0); emit MineLPTen(msg.sender,pending,freezeTen,freezeBlocks); } function depositTenByUserFrom(address _from,uint256 _amount) public onlyNotEmergencyWithdraw { require(_amount > 0, "depositTenByUserFrom: lpamount not good"); UserInfo storage user = userInfoUserPool[_from]; _minePoolTen(tenUserPool); (uint256 pending,uint256 freezeBlocks,uint256 freezeTen) = _withdrawUserTenPool(_from,user); lpTokenTen.safeTransferFrom(address(msg.sender), address(this), _amount); _updatePoolUserInfo(tenUserPool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,1); tenUserPool.lpTokenTotalAmount = tenUserPool.lpTokenTotalAmount.add(_amount); emit DepositLPTen(_from, 2, _amount,pending,freezeTen,freezeBlocks); } function _minePoolToken(PoolInfo storage pool,PoolSettingInfo storage poolSetting) internal { if (block.number <= pool.lastRewardBlock) { return; } if (pool.lpTokenTotalAmount >= MINLPTOKEN_AMOUNT) { uint256 multiplier = tenMineCalc.getMultiplier(pool.lastRewardBlock, block.number,poolSetting.endBlock,poolSetting.tokenBonusEndBlock,poolSetting.tokenBonusMultipler); if(multiplier > 0){ uint256 tokenReward = multiplier.mul(poolSetting.tokenPerBlock); pool.mineTokenAmount = pool.mineTokenAmount.add(tokenReward); pool.accTokenPerShare = pool.accTokenPerShare.add(tokenReward.mul(PERSHARERATE).div(pool.lpTokenTotalAmount)); } } if(pool.lastRewardBlock < poolSetting.endBlock){ if(block.number >= poolSetting.endBlock){ if(poolSetting.tokenAmount.sub(pool.mineTokenAmount) > 0){ IERC20(poolSetting.tokenAddr).safeTransfer(poolSetting.projectAddr,poolSetting.tokenAmount.sub(pool.mineTokenAmount)); } } } pool.lastRewardBlock = block.number; _minePoolTen(tenProjectPool); _withdrawProjectTenPool(pool); _updateProjectTenPoolAmount(pool,0,0); } function _withdrawTokenPool(address userAddr,PoolInfo storage pool,UserInfo storage user,PoolSettingInfo storage poolSetting) internal returns (uint256 pendingToken,uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen){ if (user.amount >= MINLPTOKEN_AMOUNT) { pendingToken = user.amount.mul(pool.accTokenPerShare).div(PERSHARERATE).sub(user.rewardTokenDebt); if(pendingToken > 0){ IERC20(poolSetting.tokenAddr).safeTransfer(userAddr, pendingToken); } (pendingTen,freezeBlocks,freezeTen) = _calcFreezeTen(user,pool.accTenPerShare); safeTenTransfer(userAddr, pendingTen); } } function _updateTokenPoolUser(uint256 accTokenPerShare,uint256 accTenPerShare,UserInfo storage user,uint256 _freezeBlocks,uint256 _freezeTen,uint256 _amount,uint256 _amountType) internal { _updatePoolUserInfo(accTenPerShare,user,_freezeBlocks,_freezeTen,_amount,_amountType); user.rewardTokenDebt = user.amount.mul(accTokenPerShare).div(PERSHARERATE); } function depositLPToken(uint256 _pid, uint256 _amount) public onlyNotEmergencyWithdraw { require(_amount > 0, "depositLPToken: lpamount not good"); PoolInfo storage pool = poolInfo[_pid]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _minePoolToken(pool,poolSetting); (uint256 pendingToken,uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen) = _withdrawTokenPool(msg.sender,pool,user,poolSetting); if (user.amount < MINLPTOKEN_AMOUNT) { pool.userCount = pool.userCount.add(1); } IERC20(poolSetting.lpToken).safeTransferFrom(address(msg.sender), address(this), _amount); pool.lpTokenTotalAmount = pool.lpTokenTotalAmount.add(_amount); _updateTokenPoolUser(pool.accTokenPerShare,pool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,1); emit Deposit(msg.sender, _pid, _amount,pendingToken,pendingTen,freezeTen,freezeBlocks); } function withdrawLPToken(uint256 _pid, uint256 _amount) public { require(_amount > 0, "withdrawLPToken: lpamount not good"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; require(user.amount >= _amount, "withdrawLPToken: not good"); if(emergencyWithdraw == 0){ _minePoolToken(pool,poolSetting); (uint256 pendingToken,uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen) = _withdrawTokenPool(msg.sender,pool,user,poolSetting); _updateTokenPoolUser(pool.accTokenPerShare,pool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,2); emit Withdraw(msg.sender, _pid, _amount,pendingToken,pendingTen,freezeTen,freezeBlocks); }else{ _updateTokenPoolUser(pool.accTokenPerShare,pool.accTenPerShare,user,user.freezeBlocks,user.freezeTen,_amount,2); emit Withdraw(msg.sender, _pid, _amount,0,0,user.freezeTen,user.freezeBlocks); } IERC20(poolSetting.lpToken).safeTransfer(address(msg.sender), _amount); pool.lpTokenTotalAmount = pool.lpTokenTotalAmount.sub(_amount); if(user.amount < MINLPTOKEN_AMOUNT){ pool.userCount = pool.userCount.sub(1); } } function mineLPToken(uint256 _pid) public onlyNotEmergencyWithdraw { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; _minePoolToken(pool,poolSetting); (uint256 pendingToken,uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen) = _withdrawTokenPool(msg.sender,pool,user,poolSetting); _updateTokenPoolUser(pool.accTokenPerShare,pool.accTenPerShare,user,freezeBlocks,freezeTen,0,0); emit MineLPToken(msg.sender, _pid, pendingToken,pendingTen,freezeTen,freezeBlocks); } function depositLPTokenFrom(address _from,uint256 _pid, uint256 _amount) public onlyNotEmergencyWithdraw { require(_amount > 0, "depositLPTokenFrom: lpamount not good"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_from]; PoolSettingInfo storage poolSetting = poolSettingInfo[_pid]; _minePoolToken(pool,poolSetting); (uint256 pendingToken,uint256 pendingTen,uint256 freezeBlocks,uint256 freezeTen) = _withdrawTokenPool(_from,pool,user,poolSetting); if (user.amount < MINLPTOKEN_AMOUNT) { pool.userCount = pool.userCount.add(1); } IERC20(poolSetting.lpToken).safeTransferFrom(msg.sender, address(this), _amount); pool.lpTokenTotalAmount = pool.lpTokenTotalAmount.add(_amount); _updateTokenPoolUser(pool.accTokenPerShare,pool.accTenPerShare,user,freezeBlocks,freezeTen,_amount,1); emit DepositFrom(_from, _pid, _amount,msg.sender,pendingToken,pendingTen,freezeTen,freezeBlocks); } function dev(address _devaddr) public { require(msg.sender == devaddr, "dev: wut?"); devaddr = _devaddr; } function devWithdraw(uint256 _amount) public { require(block.number >= devWithdrawStartBlock, "devWithdraw: start Block invalid"); require(msg.sender == devaddr, "devWithdraw: devaddr invalid"); require(devaddrAmount >= _amount, "devWithdraw: amount invalid"); ten.mint(devaddr,_amount); devaddrAmount = devaddrAmount.sub(_amount); emit DevWithdraw(msg.sender, _amount); } function safeTenTransfer(address _to, uint256 _amount) internal { if(_amount > 0){ uint256 bal = ten.balanceOf(address(this)); if (_amount > bal) { if(bal > 0){ IERC20(address(ten)).safeTransfer(_to, bal); } } else { IERC20(address(ten)).safeTransfer(_to, _amount); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract TenetToken","name":"_ten","type":"address"},{"internalType":"contract TenetMine","name":"_tenMineCalc","type":"address"},{"internalType":"contract IERC20","name":"_lpTen","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_allocPointProject","type":"uint256"},{"internalType":"uint256","name":"_allocPointUser","type":"uint256"},{"internalType":"uint256","name":"_devWithdrawStartBlock","type":"uint256"},{"internalType":"uint256","name":"_modifyAllocPointPeriod","type":"uint256"},{"internalType":"uint256","name":"_bonusAllocPointBlock","type":"uint256"},{"internalType":"uint256","name":"_minProjectUserCount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTenAmount","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"penddingToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"DepositFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"DepositLPTen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DevWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"MineLPTen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"MineLPToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penddingTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeTen","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"freezeBlocks","type":"uint256"}],"name":"WithdrawLPTen","type":"event"},{"inputs":[],"name":"MINLPTOKEN_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERSHARERATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlockOffset","type":"uint256"},{"internalType":"uint256","name":"_tokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"_tokenBonusEndBlockOffset","type":"uint256"},{"internalType":"uint256","name":"_tokenBonusMultipler","type":"uint256"},{"internalType":"uint256","name":"_lpTenAmount","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addpoolfee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusAllocPointBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusPoolFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositLPTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositTenByProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositTenByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositTenByUserFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWithdrawStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devaddrAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastModifyAllocPointBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpTokenTen","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minProjectUserCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mineLPTen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mineLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"modifyAllocPointPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"lpTokenTotalAmount","type":"uint256"},{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"accTenPerShare","type":"uint256"},{"internalType":"uint256","name":"userCount","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardTenDebt","type":"uint256"},{"internalType":"uint256","name":"mineTokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolSettingInfo","outputs":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"projectAddr","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"tokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"tokenBonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"tokenBonusMultipler","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPointProject","type":"uint256"},{"internalType":"uint256","name":"_allocPointUser","type":"uint256"},{"internalType":"uint256","name":"_modifyAllocPointPeriod","type":"uint256"}],"name":"set_allocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract TenetToken","name":"_ten","type":"address"},{"internalType":"contract IERC20","name":"_lpTokenTen","type":"address"},{"internalType":"contract TenetMine","name":"_tenMineCalc","type":"address"},{"internalType":"uint256","name":"_devWithdrawStartBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusAllocPointBlock","type":"uint256"},{"internalType":"uint256","name":"_minProjectUserCount","type":"uint256"}],"name":"set_basicInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusAddr","type":"address"},{"internalType":"uint256","name":"_addpoolfee","type":"uint256"},{"internalType":"uint256","name":"_bonusPoolFeeRate","type":"uint256"}],"name":"set_bonusInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_emergencyWithdraw","type":"uint256"}],"name":"set_emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"isHaveRight","type":"bool"}],"name":"set_tenMintRightAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tenNewOwner","type":"address"}],"name":"set_tenNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ten","outputs":[{"internalType":"contract TenetToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tenMineCalc","outputs":[{"internalType":"contract TenetMine","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"tenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tenMintRightAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tenProjectPool","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTenPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lpTokenTotalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tenUserPool","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTenPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lpTokenTotalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardTokenDebt","type":"uint256"},{"internalType":"uint256","name":"rewardTenDebt","type":"uint256"},{"internalType":"uint256","name":"lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"freezeBlocks","type":"uint256"},{"internalType":"uint256","name":"freezeTen","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfoUserPool","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardTokenDebt","type":"uint256"},{"internalType":"uint256","name":"rewardTenDebt","type":"uint256"},{"internalType":"uint256","name":"lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"freezeBlocks","type":"uint256"},{"internalType":"uint256","name":"freezeTen","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTenByProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTenByUser","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620063db380380620063db83398181016040526101408110156200003857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000b5620003c460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35089600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560106002018190555084601460020181905550620002858587620003cc60201b6200450d1790919060201c565b6008819055506000600581905550836009819055506000600a819055506000600d8190555082600681905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031a57600080fd5b505afa1580156200032f573d6000803e3d6000fd5b505050506040513d60208110156200034657600080fd5b810190808051906020019092919050505060078190555081600b8190555080600c8190555033601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601c819055505050505050505050505062000455565b600033905090565b6000808284019050838110156200044b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b615f7680620004656000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638da5cb5b11610182578063d49e77cd116100e9578063e3b24a74116100a2578063f2fde38b1161007c578063f2fde38b14610d03578063fac6ae0614610d47578063faf7444a14610d65578063ff168bd514610e10576102bb565b8063e3b24a7414610c4a578063e9dabb0114610c98578063ef0fe55d14610cd0576102bb565b8063d49e77cd14610b2c578063d676a34914610b60578063d694b36114610b7e578063d97763c714610b9c578063db2e21bc14610bde578063e1e3bf1714610bfc576102bb565b8063b53c183f1161013b578063b53c183f146109bf578063bafc355314610a3a578063bd54948a14610a94578063c00ec00614610ab2578063c543c92214610ae0578063c5f7624314610b0e576102bb565b80638da5cb5b1461083e57806393f1a40b14610872578063a14bab3a146108f7578063aa1bc31c14610915578063aba4d2dc14610949578063b4bbde6e14610967576102bb565b80634b6578c0116102265780635d916b0b116101df5780635d916b0b14610728578063643ceff914610760578063715018a6146107945780637dc10fde1461079e578063897bcc2b146107cc5780638d88a90e146107fa576102bb565b80634b6578c0146105c557806350e991d0146105e357806352316db014610601578063576f6f0314610634578063593f33d6146106d65780635c9f6bab146106f4576102bb565b80631e154ecb116102785780631e154ecb1461040557806322c4c7b9146104c15780632b065273146104ef57806330a7c4201461053f5780633ee7eead14610583578063475884c21461058d576102bb565b80630340c465146102c0578063081e3eda146102ca5780630f42f8fc146102e857806313eaabb8146103405780631526fe271461037457806317caf6f1146103e7575b600080fd5b6102c8610e48565b005b6102d261104f565b6040518082815260200191505060405180910390f35b61033e600480360360608110156102fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061105c565b005b610348611315565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103a06004803603602081101561038a57600080fd5b810190808035906020019092919050505061133b565b604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6103ef611390565b6040518082815260200191505060405180910390f35b6104316004803603602081101561041b57600080fd5b8101908080359060200190929190505050611396565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b6104ed600480360360208110156104d757600080fd5b8101908080359060200190929190505050611451565b005b61053d6004803603604081101561050557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506115eb565b005b6105816004803603602081101561055557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061170e565b005b61058b61187c565b005b6105c3600480360360408110156105a357600080fd5b8101908080359060200190929190803590602001909291905050506119b1565b005b6105cd611c4b565b6040518082815260200191505060405180910390f35b6105eb611c54565b6040518082815260200191505060405180910390f35b610609611c5a565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6106d4600480360360c081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611c78565b005b6106de611e20565b6040518082815260200191505060405180910390f35b6106fc611e26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61075e6004803603604081101561073e57600080fd5b810190808035906020019092919080359060200190929190505050611e4c565b005b610768612136565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61079c61215c565b005b6107ca600480360360208110156107b457600080fd5b81019080803590602001909291905050506122e2565b005b6107f8600480360360208110156107e257600080fd5b81019080803590602001909291905050506123b4565b005b61083c6004803603602081101561081057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125bc565b005b6108466126c3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108be6004803603604081101561088857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ec565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108ff612735565b6040518082815260200191505060405180910390f35b61091d61273b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610951612761565b6040518082815260200191505060405180910390f35b6109bd6004803603606081101561097d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612767565b005b610a01600480360360208110156109d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612883565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610a7c60048036036020811015610a5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b60405180821515815260200191505060405180910390f35b610a9c6128df565b6040518082815260200191505060405180910390f35b610ade60048036036020811015610ac857600080fd5b81019080803590602001909291905050506128e5565b005b610b0c60048036036020811015610af657600080fd5b8101908080359060200190929190505050612ba9565b005b610b16612e95565b6040518082815260200191505060405180910390f35b610b34612e9a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b68612ec0565b6040518082815260200191505060405180910390f35b610b86612ec6565b6040518082815260200191505060405180910390f35b610bdc60048036036060811015610bb257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612ecc565b005b610be661303c565b6040518082815260200191505060405180910390f35b610c4860048036036040811015610c1257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613042565b005b610c9660048036036040811015610c6057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061324b565b005b610cce60048036036040811015610cae57600080fd5b8101908080359060200190929190803590602001909291905050506133db565b005b610cd861373b565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610d4560048036036020811015610d1957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613759565b005b610d4f613964565b6040518082815260200191505060405180910390f35b610e0e6004803603610120811015610d7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061396a565b005b610e4660048036036040811015610e2657600080fd5b8101908080359060200190929190803590602001909291905050506142c7565b005b43610e6060065460075461450d90919063ffffffff16565b1161104d576000610ec0601460030154610eb2612710610ea4610e90612710600b5461450d90919063ffffffff16565b60106003015461459590919063ffffffff16565b61461b90919063ffffffff16565b61450d90919063ffffffff16565b9050600081111561104b57610f5d6002610f4f610f3b84610f2d612710610f1f610ef7612710600b5461450d90919063ffffffff16565b610f1161271060106003015461459590919063ffffffff16565b61459590919063ffffffff16565b61461b90919063ffffffff16565b61461b90919063ffffffff16565b60106002015461450d90919063ffffffff16565b61461b90919063ffffffff16565b601060020181905550610fbc6002610fae610f9a84610f8c61271060146003015461459590919063ffffffff16565b61461b90919063ffffffff16565b60146002015461450d90919063ffffffff16565b61461b90919063ffffffff16565b601460020181905550610fe260146002015460106002015461450d90919063ffffffff16565b6008819055504360078190555060006008541161104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615dd36025913960400191505060405180910390fd5b5b505b565b6000600e80549050905090565b6000600d54146110b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ed36025913960400191505060405180910390fd5b6000600e838154811061111f57fe5b9060005260206000209060080201905060006018600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f858154811061119257fe5b906000526020600020906009020190506111ac8382614665565b6000806000806111be8a8888886148f2565b9350935093509350600a866000015410156111f4576111eb6001886004015461450d90919063ffffffff16565b87600401819055505b61124533308a8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b61125c88886001015461450d90919063ffffffff16565b876001018190555061127c876002015488600301548885858d6001614a98565b888a73ffffffffffffffffffffffffffffffffffffffff167f5123213d56c2aca6c740277a20b098eb37d6d821e54eebbca222c75c011812f38a3388888789604051808781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e818154811061134857fe5b90600052602060002090600802016000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b60085481565b600f81815481106113a357fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b6000600d54146114ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6000600e82815481106114bb57fe5b9060005260206000209060080201905060006018600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f848154811061152e57fe5b906000526020600020906009020190506115488382614665565b60008060008061155a338888886148f2565b935093509350935061157a87600201548860030154888585600080614a98565b873373ffffffffffffffffffffffffffffffffffffffff167f6147d8823b466ffe24571f4e6bdaa09dc9ad6b50ae8fe9d14b245fa5a030b0b3868685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050565b6115f3614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611716614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561186157600080fd5b505af1158015611875573d6000803e3d6000fd5b5050505050565b6000600d54146118d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6118e16014614aed565b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008060006119333385614d61565b92509250925061194d601460010154858484600080614d92565b3373ffffffffffffffffffffffffffffffffffffffff167f316b921f9fa222f5c27be723155725de2e54d321016ab4d8c1bfec7d9e02d96c84838560405180848152602001838152602001828152602001935050505060405180910390a250505050565b6000600d5414611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615df86021913960400191505060405180910390fd5b6000600e8381548110611a7457fe5b906000526020600020906008020190506000600f8481548110611a9357fe5b9060005260206000209060090201905060006018600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b018383614665565b600080600080611b13338887896148f2565b9350935093509350600a85600001541015611b4957611b406001886004015461450d90919063ffffffff16565b87600401819055505b611b9a33308a8960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b611bb188886001015461450d90919063ffffffff16565b8760010181905550611bd1876002015488600301548785858d6001614a98565b883373ffffffffffffffffffffffffffffffffffffffff167f55e1b84deec6eefe49c2c96afe1d5b43ca37768907f7388696c6009e7bbe3b548a87878688604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050505050565b64e8d4a5100081565b601c5481565b60148060000154908060010154908060020154908060030154905084565b611c80614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b85600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260098190555081600b8190555080600c81905550505050505050565b60095481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600e8381548110611e5b57fe5b906000526020600020906008020190506000600f8481548110611e7a57fe5b906000526020600020906009020190503373ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f776974686472617754656e427950726f6a6563743a206e6f7420676f6f64000081525060200191505060405180910390fd5b8282600501541015611fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f776974686472617754656e427950726f6a6563743a206e6f7420676f6f64000081525060200191505060405180910390fd5b6000600d541415611fed57611fde6010614aed565b611fe782614e42565b506120b0565b8060050154826000015410156120af57600061201a8360070154836003015461512490919063ffffffff16565b11156120ae576120ad8160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120638460070154846003015461512490919063ffffffff16565b8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b5b5b60008311156120c6576120c582846002615210565b5b60013373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa848560008060006040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612164614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6122ea614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b6000600d541461240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111612468576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615f1e6023913960400191505060405180910390fd5b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506124b56014614aed565b60008060006124c43385614d61565b925092509250612519333087600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b61252d601460010154858484896001614d92565b6125458560146003015461450d90919063ffffffff16565b60146003018190555060023373ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b0140878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461267f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6465763a207775743f000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6018602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154905086565b600b5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b61276f614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461282f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a8190555080601c81905550505050565b60196020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b601a6020528060005260406000206000915054906101000a900460ff1681565b60065481565b6000811161293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615d5d6024913960400191505060405180910390fd5b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081816000015410156129fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f776974686472617754656e4279557365723a206e6f7420676f6f64000000000081525060200191505060405180910390fd5b6000600d541415612aa957612a106014614aed565b6000806000612a1f3385614d61565b925092509250612a39601460010154858484896002614d92565b60023373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa84878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050612b37565b612ac56014600101548283600401548460050154866002614d92565b60023373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa84846000856005015486600401546040518085815260200184815260200183815260200182815260200194505050505060405180910390a35b612b4f8260146003015461512490919063ffffffff16565b601460030181905550612ba53383600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5050565b600954431015612c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64657657697468647261773a20737461727420426c6f636b20696e76616c696481525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64657657697468647261773a206465766164647220696e76616c69640000000081525060200191505060405180910390fd5b806005541015612d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f64657657697468647261773a20616d6f756e7420696e76616c6964000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612e1157600080fd5b505af1158015612e25573d6000803e3d6000fd5b50505050612e3e8160055461512490919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167f050d1c64cc22ce461b9bc14f6b73852566da02b03c155242bc63169d1fec42aa826040518082815260200191505060405180910390a250565b600a81565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600c5481565b612ed4614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f9e6010614aed565b612fa86014614aed565b826010600201819055508160146002018190555080600681905550612fd6828461450d90919063ffffffff16565b600881905550600060085411613037576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615db06023913960400191505060405180910390fd5b505050565b600d5481565b6000600d541461309d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b600081116130f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615e3b6027913960400191505060405180910390fd5b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506131436014614aed565b60008060006131528685614d61565b9250925092506131a7333087600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6131bb601460010154858484896001614d92565b6131d38560146003015461450d90919063ffffffff16565b60146003018190555060028673ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b0140878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050505050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146132f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615e836026913960400191505060405180910390fd5b60008111156133d757600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506133d06133bf600a8361461b90919063ffffffff16565b60055461450d90919063ffffffff16565b6005819055505b5050565b60008111613434576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615e196022913960400191505060405180910390fd5b6000600e838154811061344357fe5b9060005260206000209060080201905060006018600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f85815481106134b657fe5b906000526020600020906009020190508382600001541015613540576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f77697468647261774c50546f6b656e3a206e6f7420676f6f640000000000000081525060200191505060405180910390fd5b6000600d5414156135ff576135558382614665565b600080600080613567338888886148f2565b9350935093509350613587876002015488600301548885858d6002614a98565b883373ffffffffffffffffffffffffffffffffffffffff167f194c8d0132d20112211dfa71bb87a92766fde4f4318e08efd2cc4a6e188e509d8a87878688604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a350505050613698565b61361f836002015484600301548485600401548660050154896002614a98565b843373ffffffffffffffffffffffffffffffffffffffff167f194c8d0132d20112211dfa71bb87a92766fde4f4318e08efd2cc4a6e188e509d8660008087600501548860040154604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a35b6136e733858360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b6136fe84846001015461512490919063ffffffff16565b8360010181905550600a826000015410156137345761372b6001846004015461512490919063ffffffff16565b83600401819055505b5050505050565b60108060000154908060010154908060020154908060030154905084565b613761614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d376026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b6000600d54146139c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008614156139d2574395505b85431115613a48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6164643a207374617274426c6f636b20696e76616c696400000000000000000081525060200191505060405180910390fd5b82851015613abe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6164643a20626f6e7573456e64426c6f636b4f666673657420696e76616c696481525060200191505060405180910390fd5b86613bd585600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf777d918a613b158b8d61450d90919063ffffffff16565b613b288c8e61450d90919063ffffffff16565b613b3b8b8f61450d90919063ffffffff16565b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015613b8c57600080fd5b505afa158015613ba0573d6000803e3d6000fd5b505050506040513d6020811015613bb657600080fd5b810190808051906020019092919050505061459590919063ffffffff16565b1115613c49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6164643a20746f6b656e20616d6f756e7420696e76616c69640000000000000081525060200191505060405180910390fd5b60008711613cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6164643a20746f6b656e416d6f756e7420696e76616c6964000000000000000081525060200191505060405180910390fd5b613cec3330898b73ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6000600a541115613f9657613d483330600a54600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6000601c541115613ee757613dec601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613da4612710613d96601c54600a5461459590919063ffffffff16565b61461b90919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b612710601c541015613ee257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30613e76613e65612710613e57601c54600a5461459590919063ffffffff16565b61461b90919063ffffffff16565b600a5461512490919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ec957600080fd5b505af1158015613edd573d6000803e3d6000fd5b505050505b613f95565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30600a546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b5b6000600e805490509050600f6040518061012001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001614021898b61450d90919063ffffffff16565b815260200187815260200161403f878b61450d90919063ffffffff16565b815260200185815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801555050600e6040518061010001604052808943116141a057896141a2565b435b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701555050600a82106142645761426381836142c7565b5b803373ffffffffffffffffffffffffffffffffffffffff167f5d3abca7d5bce1389e59f104ee516f35bed07b6f9644b96b0d87cb844b3be1eb8a85604051808381526020018281526020019250505060405180910390a350505050505050505050565b6000600d5414614322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6000811161437b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615ef86026913960400191505060405180910390fd5b6000600e838154811061438a57fe5b906000526020600020906008020190506000600f84815481106143a957fe5b906000526020600020906009020190503373ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461447e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6465706f73697454656e427950726f6a6563743a206e6f7420676f6f6400000081525060200191505060405180910390fd5b6144886010614aed565b61449182614e42565b5061449e82846001615210565b60013373ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b01408560008060006040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008082840190508381101561458b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156145a85760009050614615565b60008284029050828482816145b957fe5b0414614610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615e626021913960400191505060405180910390fd5b809150505b92915050565b600061465d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615385565b905092915050565b81600001544311614675576148ee565b600a8260010154106147f6576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf777d918460000154438560050154866007015487600801546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561472657600080fd5b505afa15801561473a573d6000803e3d6000fd5b505050506040513d602081101561475057600080fd5b8101908080519060200190929190505050905060008111156147f457600061478583600601548361459590919063ffffffff16565b905061479e81856007015461450d90919063ffffffff16565b84600701819055506147ea6147d785600101546147c964e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b856002015461450d90919063ffffffff16565b8460020181905550505b505b8060050154826000015410156148c457806005015443106148c357600061482e8360070154836003015461512490919063ffffffff16565b11156148c2576148c18160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166148778460070154846003015461512490919063ffffffff16565b8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b5b5b4382600001819055506148d76010614aed565b6148e082614e42565b506148ed82600080615210565b5b5050565b600080600080600a8660000154106149cc5761494c866001015461493e64e8d4a510006149308b600201548b6000015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b935060008411156149a7576149a688858760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b6149b586886003015461544b565b8093508194508295505050506149cb88846157cd565b5b945094509450949050565b614a92846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615956565b50505050565b614aa6868686868686614d92565b614ad464e8d4a51000614ac689886000015461459590919063ffffffff16565b61461b90919063ffffffff16565b856001018190555050505050505050565b600033905090565b80600001544311614afd57614d5e565b600a81600301541015614b1857438160000181905550614d5e565b6000600d541115614b3157438160000181905550614d5e565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c03c81078360000154436040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015614bb257600080fd5b505afa158015614bc6573d6000803e3d6000fd5b505050506040513d6020811015614bdc57600080fd5b810190808051906020019092919050505090506000811115614d4b57614c23600854614c1584600201548461459590919063ffffffff16565b61461b90919063ffffffff16565b9050614c4d614c3c600a8361461b90919063ffffffff16565b60055461450d90919063ffffffff16565b600581905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614ce657600080fd5b505af1158015614cfa573d6000803e3d6000fd5b50505050614d42614d2f8360030154614d2164e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b836001015461450d90919063ffffffff16565b82600101819055505b438260000181905550614d5c610e48565b505b50565b6000806000614d758460146001015461544b565b809350819450829550505050614d8b85846157cd565b9250925092565b6001811415614dbf57614db282866000015461450d90919063ffffffff16565b8560000181905550614de9565b6002811415614de857614ddf82866000015461512490919063ffffffff16565b85600001819055505b5b614e1764e8d4a51000614e0988886000015461459590919063ffffffff16565b61461b90919063ffffffff16565b8560020181905550438560030181905550838560040181905550828560050181905550505050505050565b6000600a82600501541061511f57614e998260060154614e8b64e8d4a51000614e7d601060010154876005015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b9050600081111561511e57600082600401541415614f6557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614f4457600080fd5b505af1158015614f58573d6000803e3d6000fd5b505050506000905061511d565b600c54826004015410156150d0576000614ff0614f8f612710600b5461450d90919063ffffffff16565b614fe2614fd3612710614fc5600c54614fb78a60040154600b5461459590919063ffffffff16565b61461b90919063ffffffff16565b61450d90919063ffffffff16565b8561459590919063ffffffff16565b61461b90919063ffffffff16565b90506000615007828461512490919063ffffffff16565b11156150cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac3061505f848661512490919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150b257600080fd5b505af11580156150c6573d6000803e3d6000fd5b505050505b809150505b61511461510183600101546150f364e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b836003015461450d90919063ffffffff16565b82600301819055505b5b5b919050565b600061516683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a45565b905092915050565b61520b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615956565b505050565b60018114156152ad57615268333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6152808260106003015461450d90919063ffffffff16565b6010600301819055506152a082846005015461450d90919063ffffffff16565b8360050181905550615345565b6002811415615344576152cd82846005015461512490919063ffffffff16565b83600501819055506153223383600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b61533a8260106003015461512490919063ffffffff16565b6010600301819055505b5b61537864e8d4a5100061536a601060010154866005015461459590919063ffffffff16565b61461b90919063ffffffff16565b8360060181905550505050565b60008083118290615431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156153f65780820151818401526020810190506153db565b50505050905090810190601f1680156154235780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161543d57fe5b049050809150509392505050565b6000806000615494856002015461548664e8d4a51000615478888a6000015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b925060008084111561562957600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b15801561550857600080fd5b505afa15801561551c573d6000803e3d6000fd5b505050506040513d602081101561553257600080fd5b81019080805190602001909291905050508660030154101561560a57615603600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b1580156155b957600080fd5b505afa1580156155cd573d6000803e3d6000fd5b505050506040513d60208110156155e357600080fd5b81019080805190602001909291905050504361512490919063ffffffff16565b9050615624565b61562186600301544361512490919063ffffffff16565b90505b615651565b6000866005015411156156505761564d86600301544361512490919063ffffffff16565b90505b5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630cb1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b1580156156bb57600080fd5b505afa1580156156cf573d6000803e3d6000fd5b505050506040513d60208110156156e557600080fd5b8101908080519060200190929190505050905061570f87600401548361450d90919063ffffffff16565b935080841161573a5761572f87600501548661450d90919063ffffffff16565b9250600094506157c4565b6000851415615757576000935060009250866005015494506157c3565b61579284615784836157768b600501548a61450d90919063ffffffff16565b61459590919063ffffffff16565b61461b90919063ffffffff16565b92506157bd836157af89600501548861450d90919063ffffffff16565b61512490919063ffffffff16565b94508093505b5b50509250925092565b6000811115615952576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561586157600080fd5b505afa158015615875573d6000803e3d6000fd5b505050506040513d602081101561588b57600080fd5b81019080805190602001909291905050509050808211156159025760008111156158fd576158fc8382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b615950565b61594f8383600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b505b5050565b60606159b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615b059092919063ffffffff16565b9050600081511115615a40578080602001905160208110156159d957600080fd5b8101908080519060200190929190505050615a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615ea9602a913960400191505060405180910390fd5b5b505050565b6000838311158290615af2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ab7578082015181840152602081019050615a9c565b50505050905090810190601f168015615ae45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060615b148484600085615b1d565b90509392505050565b6060615b2885615d23565b615b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615bea5780518252602082019150602081019050602083039250615bc7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615c4c576040519150601f19603f3d011682016040523d82523d6000602084013e615c51565b606091505b50915091508115615c66578092505050615d1b565b600081511115615c795780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ce0578082015181840152602081019050615cc5565b50505050905090810190601f168015615d0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373776974686472617754656e4279557365723a206c70616d6f756e74206e6f7420676f6f646f6e6c794e6f74456d657267656e637957697468647261773a20656d657267656e63795769746864726177206e6f777365745f616c6c6f63506f696e743a20416c6c6f6320506f696e7420696e76616c6964757064617465416c6c6f63506f696e743a20416c6c6f6320506f696e7420696e76616c69646465706f7369744c50546f6b656e3a206c70616d6f756e74206e6f7420676f6f6477697468647261774c50546f6b656e3a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e42795573657246726f6d3a206c70616d6f756e74206e6f7420676f6f64536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776f6e6c794d696e7465723a2063616c6c6572206973206e6f20726967687420746f206d696e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646465706f7369744c50546f6b656e46726f6d3a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e427950726f6a6563743a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e4279557365723a206c70616d6f756e74206e6f7420676f6f64a26469706673582212202206c4276f5b99a9dc169eeeded7b150d24339668251da274d0e20ccb5eda5d564736f6c634300060c003300000000000000000000000074159651a992952e2bf340d7628459aa4593fc05000000000000000000000000e1bb8da14c98f4dbca5504ca59168c41af1e36de00000000000000000000000054f7cd0b73d2a55815f2e35a7e2cd223ea7d3ca10000000000000000000000005a3403617a387ea54030a36f71c195e22a0d76af000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638da5cb5b11610182578063d49e77cd116100e9578063e3b24a74116100a2578063f2fde38b1161007c578063f2fde38b14610d03578063fac6ae0614610d47578063faf7444a14610d65578063ff168bd514610e10576102bb565b8063e3b24a7414610c4a578063e9dabb0114610c98578063ef0fe55d14610cd0576102bb565b8063d49e77cd14610b2c578063d676a34914610b60578063d694b36114610b7e578063d97763c714610b9c578063db2e21bc14610bde578063e1e3bf1714610bfc576102bb565b8063b53c183f1161013b578063b53c183f146109bf578063bafc355314610a3a578063bd54948a14610a94578063c00ec00614610ab2578063c543c92214610ae0578063c5f7624314610b0e576102bb565b80638da5cb5b1461083e57806393f1a40b14610872578063a14bab3a146108f7578063aa1bc31c14610915578063aba4d2dc14610949578063b4bbde6e14610967576102bb565b80634b6578c0116102265780635d916b0b116101df5780635d916b0b14610728578063643ceff914610760578063715018a6146107945780637dc10fde1461079e578063897bcc2b146107cc5780638d88a90e146107fa576102bb565b80634b6578c0146105c557806350e991d0146105e357806352316db014610601578063576f6f0314610634578063593f33d6146106d65780635c9f6bab146106f4576102bb565b80631e154ecb116102785780631e154ecb1461040557806322c4c7b9146104c15780632b065273146104ef57806330a7c4201461053f5780633ee7eead14610583578063475884c21461058d576102bb565b80630340c465146102c0578063081e3eda146102ca5780630f42f8fc146102e857806313eaabb8146103405780631526fe271461037457806317caf6f1146103e7575b600080fd5b6102c8610e48565b005b6102d261104f565b6040518082815260200191505060405180910390f35b61033e600480360360608110156102fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061105c565b005b610348611315565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103a06004803603602081101561038a57600080fd5b810190808035906020019092919050505061133b565b604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6103ef611390565b6040518082815260200191505060405180910390f35b6104316004803603602081101561041b57600080fd5b8101908080359060200190929190505050611396565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b6104ed600480360360208110156104d757600080fd5b8101908080359060200190929190505050611451565b005b61053d6004803603604081101561050557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506115eb565b005b6105816004803603602081101561055557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061170e565b005b61058b61187c565b005b6105c3600480360360408110156105a357600080fd5b8101908080359060200190929190803590602001909291905050506119b1565b005b6105cd611c4b565b6040518082815260200191505060405180910390f35b6105eb611c54565b6040518082815260200191505060405180910390f35b610609611c5a565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6106d4600480360360c081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611c78565b005b6106de611e20565b6040518082815260200191505060405180910390f35b6106fc611e26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61075e6004803603604081101561073e57600080fd5b810190808035906020019092919080359060200190929190505050611e4c565b005b610768612136565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61079c61215c565b005b6107ca600480360360208110156107b457600080fd5b81019080803590602001909291905050506122e2565b005b6107f8600480360360208110156107e257600080fd5b81019080803590602001909291905050506123b4565b005b61083c6004803603602081101561081057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125bc565b005b6108466126c3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108be6004803603604081101561088857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ec565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108ff612735565b6040518082815260200191505060405180910390f35b61091d61273b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610951612761565b6040518082815260200191505060405180910390f35b6109bd6004803603606081101561097d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612767565b005b610a01600480360360208110156109d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612883565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610a7c60048036036020811015610a5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128bf565b60405180821515815260200191505060405180910390f35b610a9c6128df565b6040518082815260200191505060405180910390f35b610ade60048036036020811015610ac857600080fd5b81019080803590602001909291905050506128e5565b005b610b0c60048036036020811015610af657600080fd5b8101908080359060200190929190505050612ba9565b005b610b16612e95565b6040518082815260200191505060405180910390f35b610b34612e9a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b68612ec0565b6040518082815260200191505060405180910390f35b610b86612ec6565b6040518082815260200191505060405180910390f35b610bdc60048036036060811015610bb257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612ecc565b005b610be661303c565b6040518082815260200191505060405180910390f35b610c4860048036036040811015610c1257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613042565b005b610c9660048036036040811015610c6057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061324b565b005b610cce60048036036040811015610cae57600080fd5b8101908080359060200190929190803590602001909291905050506133db565b005b610cd861373b565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610d4560048036036020811015610d1957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613759565b005b610d4f613964565b6040518082815260200191505060405180910390f35b610e0e6004803603610120811015610d7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061396a565b005b610e4660048036036040811015610e2657600080fd5b8101908080359060200190929190803590602001909291905050506142c7565b005b43610e6060065460075461450d90919063ffffffff16565b1161104d576000610ec0601460030154610eb2612710610ea4610e90612710600b5461450d90919063ffffffff16565b60106003015461459590919063ffffffff16565b61461b90919063ffffffff16565b61450d90919063ffffffff16565b9050600081111561104b57610f5d6002610f4f610f3b84610f2d612710610f1f610ef7612710600b5461450d90919063ffffffff16565b610f1161271060106003015461459590919063ffffffff16565b61459590919063ffffffff16565b61461b90919063ffffffff16565b61461b90919063ffffffff16565b60106002015461450d90919063ffffffff16565b61461b90919063ffffffff16565b601060020181905550610fbc6002610fae610f9a84610f8c61271060146003015461459590919063ffffffff16565b61461b90919063ffffffff16565b60146002015461450d90919063ffffffff16565b61461b90919063ffffffff16565b601460020181905550610fe260146002015460106002015461450d90919063ffffffff16565b6008819055504360078190555060006008541161104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615dd36025913960400191505060405180910390fd5b5b505b565b6000600e80549050905090565b6000600d54146110b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ed36025913960400191505060405180910390fd5b6000600e838154811061111f57fe5b9060005260206000209060080201905060006018600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f858154811061119257fe5b906000526020600020906009020190506111ac8382614665565b6000806000806111be8a8888886148f2565b9350935093509350600a866000015410156111f4576111eb6001886004015461450d90919063ffffffff16565b87600401819055505b61124533308a8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b61125c88886001015461450d90919063ffffffff16565b876001018190555061127c876002015488600301548885858d6001614a98565b888a73ffffffffffffffffffffffffffffffffffffffff167f5123213d56c2aca6c740277a20b098eb37d6d821e54eebbca222c75c011812f38a3388888789604051808781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e818154811061134857fe5b90600052602060002090600802016000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b60085481565b600f81815481106113a357fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b6000600d54146114ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6000600e82815481106114bb57fe5b9060005260206000209060080201905060006018600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f848154811061152e57fe5b906000526020600020906009020190506115488382614665565b60008060008061155a338888886148f2565b935093509350935061157a87600201548860030154888585600080614a98565b873373ffffffffffffffffffffffffffffffffffffffff167f6147d8823b466ffe24571f4e6bdaa09dc9ad6b50ae8fe9d14b245fa5a030b0b3868685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050565b6115f3614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611716614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561186157600080fd5b505af1158015611875573d6000803e3d6000fd5b5050505050565b6000600d54146118d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6118e16014614aed565b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008060006119333385614d61565b92509250925061194d601460010154858484600080614d92565b3373ffffffffffffffffffffffffffffffffffffffff167f316b921f9fa222f5c27be723155725de2e54d321016ab4d8c1bfec7d9e02d96c84838560405180848152602001838152602001828152602001935050505060405180910390a250505050565b6000600d5414611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615df86021913960400191505060405180910390fd5b6000600e8381548110611a7457fe5b906000526020600020906008020190506000600f8481548110611a9357fe5b9060005260206000209060090201905060006018600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b018383614665565b600080600080611b13338887896148f2565b9350935093509350600a85600001541015611b4957611b406001886004015461450d90919063ffffffff16565b87600401819055505b611b9a33308a8960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b611bb188886001015461450d90919063ffffffff16565b8760010181905550611bd1876002015488600301548785858d6001614a98565b883373ffffffffffffffffffffffffffffffffffffffff167f55e1b84deec6eefe49c2c96afe1d5b43ca37768907f7388696c6009e7bbe3b548a87878688604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a3505050505050505050565b64e8d4a5100081565b601c5481565b60148060000154908060010154908060020154908060030154905084565b611c80614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b85600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260098190555081600b8190555080600c81905550505050505050565b60095481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600e8381548110611e5b57fe5b906000526020600020906008020190506000600f8481548110611e7a57fe5b906000526020600020906009020190503373ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f776974686472617754656e427950726f6a6563743a206e6f7420676f6f64000081525060200191505060405180910390fd5b8282600501541015611fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f776974686472617754656e427950726f6a6563743a206e6f7420676f6f64000081525060200191505060405180910390fd5b6000600d541415611fed57611fde6010614aed565b611fe782614e42565b506120b0565b8060050154826000015410156120af57600061201a8360070154836003015461512490919063ffffffff16565b11156120ae576120ad8160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120638460070154846003015461512490919063ffffffff16565b8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b5b5b60008311156120c6576120c582846002615210565b5b60013373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa848560008060006040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612164614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6122ea614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b6000600d541461240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008111612468576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615f1e6023913960400191505060405180910390fd5b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506124b56014614aed565b60008060006124c43385614d61565b925092509250612519333087600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b61252d601460010154858484896001614d92565b6125458560146003015461450d90919063ffffffff16565b60146003018190555060023373ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b0140878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461267f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6465763a207775743f000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6018602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154905086565b600b5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b61276f614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461282f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a8190555080601c81905550505050565b60196020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b601a6020528060005260406000206000915054906101000a900460ff1681565b60065481565b6000811161293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615d5d6024913960400191505060405180910390fd5b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081816000015410156129fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f776974686472617754656e4279557365723a206e6f7420676f6f64000000000081525060200191505060405180910390fd5b6000600d541415612aa957612a106014614aed565b6000806000612a1f3385614d61565b925092509250612a39601460010154858484896002614d92565b60023373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa84878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050612b37565b612ac56014600101548283600401548460050154866002614d92565b60023373ffffffffffffffffffffffffffffffffffffffff167faca32ecb02d9937675988f3c1923b37ba920abe0220cfc8a6dcc2baed197aa84846000856005015486600401546040518085815260200184815260200183815260200182815260200194505050505060405180910390a35b612b4f8260146003015461512490919063ffffffff16565b601460030181905550612ba53383600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5050565b600954431015612c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64657657697468647261773a20737461727420426c6f636b20696e76616c696481525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64657657697468647261773a206465766164647220696e76616c69640000000081525060200191505060405180910390fd5b806005541015612d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f64657657697468647261773a20616d6f756e7420696e76616c6964000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612e1157600080fd5b505af1158015612e25573d6000803e3d6000fd5b50505050612e3e8160055461512490919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167f050d1c64cc22ce461b9bc14f6b73852566da02b03c155242bc63169d1fec42aa826040518082815260200191505060405180910390a250565b600a81565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600c5481565b612ed4614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f9e6010614aed565b612fa86014614aed565b826010600201819055508160146002018190555080600681905550612fd6828461450d90919063ffffffff16565b600881905550600060085411613037576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615db06023913960400191505060405180910390fd5b505050565b600d5481565b6000600d541461309d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b600081116130f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615e3b6027913960400191505060405180910390fd5b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506131436014614aed565b60008060006131528685614d61565b9250925092506131a7333087600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6131bb601460010154858484896001614d92565b6131d38560146003015461450d90919063ffffffff16565b60146003018190555060028673ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b0140878685876040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050505050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146132f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615e836026913960400191505060405180910390fd5b60008111156133d757600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561339057600080fd5b505af11580156133a4573d6000803e3d6000fd5b505050506133d06133bf600a8361461b90919063ffffffff16565b60055461450d90919063ffffffff16565b6005819055505b5050565b60008111613434576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615e196022913960400191505060405180910390fd5b6000600e838154811061344357fe5b9060005260206000209060080201905060006018600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f85815481106134b657fe5b906000526020600020906009020190508382600001541015613540576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f77697468647261774c50546f6b656e3a206e6f7420676f6f640000000000000081525060200191505060405180910390fd5b6000600d5414156135ff576135558382614665565b600080600080613567338888886148f2565b9350935093509350613587876002015488600301548885858d6002614a98565b883373ffffffffffffffffffffffffffffffffffffffff167f194c8d0132d20112211dfa71bb87a92766fde4f4318e08efd2cc4a6e188e509d8a87878688604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a350505050613698565b61361f836002015484600301548485600401548660050154896002614a98565b843373ffffffffffffffffffffffffffffffffffffffff167f194c8d0132d20112211dfa71bb87a92766fde4f4318e08efd2cc4a6e188e509d8660008087600501548860040154604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a35b6136e733858360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b6136fe84846001015461512490919063ffffffff16565b8360010181905550600a826000015410156137345761372b6001846004015461512490919063ffffffff16565b83600401819055505b5050505050565b60108060000154908060010154908060020154908060030154905084565b613761614ae5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156138a7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d376026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b6000600d54146139c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b60008614156139d2574395505b85431115613a48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6164643a207374617274426c6f636b20696e76616c696400000000000000000081525060200191505060405180910390fd5b82851015613abe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6164643a20626f6e7573456e64426c6f636b4f666673657420696e76616c696481525060200191505060405180910390fd5b86613bd585600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf777d918a613b158b8d61450d90919063ffffffff16565b613b288c8e61450d90919063ffffffff16565b613b3b8b8f61450d90919063ffffffff16565b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015613b8c57600080fd5b505afa158015613ba0573d6000803e3d6000fd5b505050506040513d6020811015613bb657600080fd5b810190808051906020019092919050505061459590919063ffffffff16565b1115613c49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6164643a20746f6b656e20616d6f756e7420696e76616c69640000000000000081525060200191505060405180910390fd5b60008711613cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6164643a20746f6b656e416d6f756e7420696e76616c6964000000000000000081525060200191505060405180910390fd5b613cec3330898b73ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6000600a541115613f9657613d483330600a54600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6000601c541115613ee757613dec601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613da4612710613d96601c54600a5461459590919063ffffffff16565b61461b90919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b612710601c541015613ee257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30613e76613e65612710613e57601c54600a5461459590919063ffffffff16565b61461b90919063ffffffff16565b600a5461512490919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ec957600080fd5b505af1158015613edd573d6000803e3d6000fd5b505050505b613f95565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30600a546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b5b6000600e805490509050600f6040518061012001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001614021898b61450d90919063ffffffff16565b815260200187815260200161403f878b61450d90919063ffffffff16565b815260200185815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801555050600e6040518061010001604052808943116141a057896141a2565b435b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701555050600a82106142645761426381836142c7565b5b803373ffffffffffffffffffffffffffffffffffffffff167f5d3abca7d5bce1389e59f104ee516f35bed07b6f9644b96b0d87cb844b3be1eb8a85604051808381526020018281526020019250505060405180910390a350505050505050505050565b6000600d5414614322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615d81602f913960400191505060405180910390fd5b6000811161437b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615ef86026913960400191505060405180910390fd5b6000600e838154811061438a57fe5b906000526020600020906008020190506000600f84815481106143a957fe5b906000526020600020906009020190503373ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461447e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6465706f73697454656e427950726f6a6563743a206e6f7420676f6f6400000081525060200191505060405180910390fd5b6144886010614aed565b61449182614e42565b5061449e82846001615210565b60013373ffffffffffffffffffffffffffffffffffffffff167e4f41e7136506583f7b302f76f82fb5c864f7d4455b4f1b1d58df251e8b01408560008060006040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008082840190508381101561458b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156145a85760009050614615565b60008284029050828482816145b957fe5b0414614610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615e626021913960400191505060405180910390fd5b809150505b92915050565b600061465d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615385565b905092915050565b81600001544311614675576148ee565b600a8260010154106147f6576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf777d918460000154438560050154866007015487600801546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561472657600080fd5b505afa15801561473a573d6000803e3d6000fd5b505050506040513d602081101561475057600080fd5b8101908080519060200190929190505050905060008111156147f457600061478583600601548361459590919063ffffffff16565b905061479e81856007015461450d90919063ffffffff16565b84600701819055506147ea6147d785600101546147c964e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b856002015461450d90919063ffffffff16565b8460020181905550505b505b8060050154826000015410156148c457806005015443106148c357600061482e8360070154836003015461512490919063ffffffff16565b11156148c2576148c18160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166148778460070154846003015461512490919063ffffffff16565b8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b5b5b4382600001819055506148d76010614aed565b6148e082614e42565b506148ed82600080615210565b5b5050565b600080600080600a8660000154106149cc5761494c866001015461493e64e8d4a510006149308b600201548b6000015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b935060008411156149a7576149a688858760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b6149b586886003015461544b565b8093508194508295505050506149cb88846157cd565b5b945094509450949050565b614a92846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615956565b50505050565b614aa6868686868686614d92565b614ad464e8d4a51000614ac689886000015461459590919063ffffffff16565b61461b90919063ffffffff16565b856001018190555050505050505050565b600033905090565b80600001544311614afd57614d5e565b600a81600301541015614b1857438160000181905550614d5e565b6000600d541115614b3157438160000181905550614d5e565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c03c81078360000154436040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015614bb257600080fd5b505afa158015614bc6573d6000803e3d6000fd5b505050506040513d6020811015614bdc57600080fd5b810190808051906020019092919050505090506000811115614d4b57614c23600854614c1584600201548461459590919063ffffffff16565b61461b90919063ffffffff16565b9050614c4d614c3c600a8361461b90919063ffffffff16565b60055461450d90919063ffffffff16565b600581905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614ce657600080fd5b505af1158015614cfa573d6000803e3d6000fd5b50505050614d42614d2f8360030154614d2164e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b836001015461450d90919063ffffffff16565b82600101819055505b438260000181905550614d5c610e48565b505b50565b6000806000614d758460146001015461544b565b809350819450829550505050614d8b85846157cd565b9250925092565b6001811415614dbf57614db282866000015461450d90919063ffffffff16565b8560000181905550614de9565b6002811415614de857614ddf82866000015461512490919063ffffffff16565b85600001819055505b5b614e1764e8d4a51000614e0988886000015461459590919063ffffffff16565b61461b90919063ffffffff16565b8560020181905550438560030181905550838560040181905550828560050181905550505050505050565b6000600a82600501541061511f57614e998260060154614e8b64e8d4a51000614e7d601060010154876005015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b9050600081111561511e57600082600401541415614f6557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614f4457600080fd5b505af1158015614f58573d6000803e3d6000fd5b505050506000905061511d565b600c54826004015410156150d0576000614ff0614f8f612710600b5461450d90919063ffffffff16565b614fe2614fd3612710614fc5600c54614fb78a60040154600b5461459590919063ffffffff16565b61461b90919063ffffffff16565b61450d90919063ffffffff16565b8561459590919063ffffffff16565b61461b90919063ffffffff16565b90506000615007828461512490919063ffffffff16565b11156150cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac3061505f848661512490919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150b257600080fd5b505af11580156150c6573d6000803e3d6000fd5b505050505b809150505b61511461510183600101546150f364e8d4a510008561459590919063ffffffff16565b61461b90919063ffffffff16565b836003015461450d90919063ffffffff16565b82600301819055505b5b5b919050565b600061516683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a45565b905092915050565b61520b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050615956565b505050565b60018114156152ad57615268333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166149d7909392919063ffffffff16565b6152808260106003015461450d90919063ffffffff16565b6010600301819055506152a082846005015461450d90919063ffffffff16565b8360050181905550615345565b6002811415615344576152cd82846005015461512490919063ffffffff16565b83600501819055506153223383600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b61533a8260106003015461512490919063ffffffff16565b6010600301819055505b5b61537864e8d4a5100061536a601060010154866005015461459590919063ffffffff16565b61461b90919063ffffffff16565b8360060181905550505050565b60008083118290615431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156153f65780820151818401526020810190506153db565b50505050905090810190601f1680156154235780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161543d57fe5b049050809150509392505050565b6000806000615494856002015461548664e8d4a51000615478888a6000015461459590919063ffffffff16565b61461b90919063ffffffff16565b61512490919063ffffffff16565b925060008084111561562957600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b15801561550857600080fd5b505afa15801561551c573d6000803e3d6000fd5b505050506040513d602081101561553257600080fd5b81019080805190602001909291905050508660030154101561560a57615603600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348cd4cb16040518163ffffffff1660e01b815260040160206040518083038186803b1580156155b957600080fd5b505afa1580156155cd573d6000803e3d6000fd5b505050506040513d60208110156155e357600080fd5b81019080805190602001909291905050504361512490919063ffffffff16565b9050615624565b61562186600301544361512490919063ffffffff16565b90505b615651565b6000866005015411156156505761564d86600301544361512490919063ffffffff16565b90505b5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630cb1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b1580156156bb57600080fd5b505afa1580156156cf573d6000803e3d6000fd5b505050506040513d60208110156156e557600080fd5b8101908080519060200190929190505050905061570f87600401548361450d90919063ffffffff16565b935080841161573a5761572f87600501548661450d90919063ffffffff16565b9250600094506157c4565b6000851415615757576000935060009250866005015494506157c3565b61579284615784836157768b600501548a61450d90919063ffffffff16565b61459590919063ffffffff16565b61461b90919063ffffffff16565b92506157bd836157af89600501548861450d90919063ffffffff16565b61512490919063ffffffff16565b94508093505b5b50509250925092565b6000811115615952576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561586157600080fd5b505afa158015615875573d6000803e3d6000fd5b505050506040513d602081101561588b57600080fd5b81019080805190602001909291905050509050808211156159025760008111156158fd576158fc8382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b615950565b61594f8383600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661516e9092919063ffffffff16565b5b505b5050565b60606159b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615b059092919063ffffffff16565b9050600081511115615a40578080602001905160208110156159d957600080fd5b8101908080519060200190929190505050615a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615ea9602a913960400191505060405180910390fd5b5b505050565b6000838311158290615af2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ab7578082015181840152602081019050615a9c565b50505050905090810190601f168015615ae45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060615b148484600085615b1d565b90509392505050565b6060615b2885615d23565b615b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310615bea5780518252602082019150602081019050602083039250615bc7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615c4c576040519150601f19603f3d011682016040523d82523d6000602084013e615c51565b606091505b50915091508115615c66578092505050615d1b565b600081511115615c795780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615ce0578082015181840152602081019050615cc5565b50505050905090810190601f168015615d0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373776974686472617754656e4279557365723a206c70616d6f756e74206e6f7420676f6f646f6e6c794e6f74456d657267656e637957697468647261773a20656d657267656e63795769746864726177206e6f777365745f616c6c6f63506f696e743a20416c6c6f6320506f696e7420696e76616c6964757064617465416c6c6f63506f696e743a20416c6c6f6320506f696e7420696e76616c69646465706f7369744c50546f6b656e3a206c70616d6f756e74206e6f7420676f6f6477697468647261774c50546f6b656e3a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e42795573657246726f6d3a206c70616d6f756e74206e6f7420676f6f64536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776f6e6c794d696e7465723a2063616c6c6572206973206e6f20726967687420746f206d696e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646465706f7369744c50546f6b656e46726f6d3a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e427950726f6a6563743a206c70616d6f756e74206e6f7420676f6f646465706f73697454656e4279557365723a206c70616d6f756e74206e6f7420676f6f64a26469706673582212202206c4276f5b99a9dc169eeeded7b150d24339668251da274d0e20ccb5eda5d564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000074159651a992952e2bf340d7628459aa4593fc05000000000000000000000000e1bb8da14c98f4dbca5504ca59168c41af1e36de00000000000000000000000054f7cd0b73d2a55815f2e35a7e2cd223ea7d3ca10000000000000000000000005a3403617a387ea54030a36f71c195e22a0d76af000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : _ten (address): 0x74159651A992952e2bF340D7628459aA4593fc05
Arg [1] : _tenMineCalc (address): 0xe1bb8Da14C98F4dBcA5504ca59168C41Af1e36de
Arg [2] : _lpTen (address): 0x54F7cd0B73d2a55815f2e35a7E2cD223eA7D3ca1
Arg [3] : _devaddr (address): 0x5A3403617a387eA54030A36F71C195e22A0d76AF
Arg [4] : _allocPointProject (uint256): 5000
Arg [5] : _allocPointUser (uint256): 5000
Arg [6] : _devWithdrawStartBlock (uint256): 0
Arg [7] : _modifyAllocPointPeriod (uint256): 80000
Arg [8] : _bonusAllocPointBlock (uint256): 2000
Arg [9] : _minProjectUserCount (uint256): 10
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000074159651a992952e2bf340d7628459aa4593fc05
Arg [1] : 000000000000000000000000e1bb8da14c98f4dbca5504ca59168c41af1e36de
Arg [2] : 00000000000000000000000054f7cd0b73d2a55815f2e35a7e2cd223ea7d3ca1
Arg [3] : 0000000000000000000000005a3403617a387ea54030a36f71c195e22a0d76af
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000013880
Arg [8] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode Sourcemap
54129:28727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64662:944;;;:::i;:::-;;59134:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80791:1039;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56329:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55981:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55633:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56014:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80140:643;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59931:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60397:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74158:425;;;:::i;:::-;;77746:1026;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55922:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56360:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56101:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59235:455;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55670:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55447:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;69104:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55384:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20504:148;;;:::i;:::-;;60756:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72396:716;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81839:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19862:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56138:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55745:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55412:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55507;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59696:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56211:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56271:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55542:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;73120:1032;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81976:439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55869:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55478:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55713:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55787:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61168:521;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55830:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;74589:723;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60072:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78780:1352;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56061:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20807:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55586:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62000:2656;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68524:572;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64662:944;64768:12;64711:53;64741:22;;64711:25;;:29;;:53;;;;:::i;:::-;:69;64708:886;;64796:26;64825:113;64907:11;:30;;;64825:77;64898:3;64825:68;64863:29;64888:3;64863:20;;:24;;:29;;;;:::i;:::-;64825:14;:33;;;:37;;:68;;;;:::i;:::-;:72;;:77;;;;:::i;:::-;:81;;:113;;;;:::i;:::-;64796:142;;64977:1;64956:18;:22;64953:630;;;65040:148;65186:1;65040:141;65070:110;65161:18;65070:86;65152:3;65070:77;65117:29;65142:3;65117:20;;:24;;:29;;;;:::i;:::-;65070:42;65108:3;65070:14;:33;;;:37;;:42;;;;:::i;:::-;:46;;:77;;;;:::i;:::-;:81;;:86;;;;:::i;:::-;:90;;:110;;;;:::i;:::-;65040:14;:25;;;:29;;:141;;;;:::i;:::-;:145;;:148;;;;:::i;:::-;65012:14;:25;;:176;;;;65232:98;65328:1;65232:91;65259:63;65303:18;65259:39;65294:3;65259:11;:30;;;:34;;:39;;;;:::i;:::-;:43;;:63;;;;:::i;:::-;65232:11;:22;;;:26;;:91;;;;:::i;:::-;:95;;:98;;;;:::i;:::-;65207:11;:22;;:123;;;;65367:53;65397:11;:22;;;65367:14;:25;;;:29;;:53;;;;:::i;:::-;65349:15;:71;;;;65467:12;65439:25;:40;;;;65524:1;65506:15;;:19;65498:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64953:630;64708:886;;64662:944::o;59134:95::-;59179:7;59206:8;:15;;;;59199:22;;59134:95;:::o;80791:1039::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80925:1:::1;80915:7;:11;80907:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80979:21;81003:8;81012:4;81003:14;;;;;;;;;;;;;;;;;;80979:38;;81028:21;81052:8;:14;81061:4;81052:14;;;;;;;;;;;:21;81067:5;81052:21;;;;;;;;;;;;;;;81028:45;;81084:35;81122:15;81138:4;81122:21;;;;;;;;;;;;;;;;;;81084:59;;81154:32;81169:4;81174:11;81154:14;:32::i;:::-;81198:20;81219:18:::0;81238:20:::1;81259:17:::0;81280:47:::1;81299:5;81305:4;81310;81315:11;81280:18;:47::i;:::-;81197:130;;;;;;;;55913:2;81342:4;:11;;;:31;81338:102;;;81407:21;81426:1;81407:4;:14;;;:18;;:21;;;;:::i;:::-;81390:4;:14;;:38;;;;81338:102;81450:80;81495:10;81515:4;81522:7;81457:11;:19;;;;;;;;;;;;81450:44;;;;:80;;;;;;:::i;:::-;81567:36;81595:7;81567:4;:23;;;:27;;:36;;;;:::i;:::-;81541:4;:23;;:62;;;;81614:101;81635:4;:21;;;81657:4;:19;;;81677:4;81682:12;81695:9;81705:7;81713:1;81614:20;:101::i;:::-;81750:4;81743:5;81731:91;;;81756:7;81764:10;81775:12;81788:10;81799:9;81809:12;81731:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;;;;80791:1039:::0;;;:::o;56329:24::-;;;;;;;;;;;;;:::o;55981:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55633:30::-;;;;:::o;56014:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80140:643::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80218:21:::1;80242:8;80251:4;80242:14;;;;;;;;;;;;;;;;;;80218:38;;80267:21;80291:8;:14;80300:4;80291:14;;;;;;;;;;;:26;80306:10;80291:26;;;;;;;;;;;;;;;80267:50;;80328:35;80366:15;80382:4;80366:21;;;;;;;;;;;;;;;;;;80328:59;;80398:32;80413:4;80418:11;80398:14;:32::i;:::-;80442:20;80463:18:::0;80482:20:::1;80503:17:::0;80524:52:::1;80543:10;80554:4;80559;80564:11;80524:18;:52::i;:::-;80441:135;;;;;;;;80587:95;80608:4;:21;;;80630:4;:19;;;80650:4;80655:12;80668:9;80678:1;80680::::0;80587:20:::1;:95::i;:::-;80722:4;80710:10;80698:77;;;80728:12;80741:10;80752:9;80762:12;80698:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;;;;80140:643:::0;:::o;59931:135::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60047:11:::1;60021:16;:23;60038:5;60021:23;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;59931:135:::0;;:::o;60397:118::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60472:3:::1;;;;;;;;;;;:21;;;60494:12;60472:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60397:118:::0;:::o;74158:425::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74222:25:::1;74235:11;74222:12;:25::i;:::-;74258:21;74282:16;:28;74299:10;74282:28;;;;;;;;;;;;;;;74258:52;;74322:15;74338:20:::0;74359:17:::1;74380:37;74401:10;74412:4;74380:20;:37::i;:::-;74321:96;;;;;;74428:79;74448:11;:26;;;74475:4;74480:12;74493:9;74503:1;74505::::0;74428:19:::1;:79::i;:::-;74533:10;74523:52;;;74544:7;74552:9;74562:12;74523:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;74158:425::o:0;77746:1026::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77862:1:::1;77852:7;:11;77844:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77912:21;77936:8;77945:4;77936:14;;;;;;;;;;;;;;;;;;77912:38;;77961:35;77999:15;78015:4;77999:21;;;;;;;;;;;;;;;;;;77961:59;;78031:21;78055:8;:14;78064:4;78055:14;;;;;;;;;;;:26;78070:10;78055:26;;;;;;;;;;;;;;;78031:50;;78092:32;78107:4;78112:11;78092:14;:32::i;:::-;78136:20;78157:18:::0;78176:20:::1;78197:17:::0;78218:52:::1;78237:10;78248:4;78253;78258:11;78218:18;:52::i;:::-;78135:135;;;;;;;;55913:2;78285:4;:11;;;:31;78281:102;;;78350:21;78369:1;78350:4;:14;;;:18;;:21;;;;:::i;:::-;78333:4;:14;;:38;;;;78281:102;78393:89;78446:10;78467:4;78474:7;78400:11;:19;;;;;;;;;;;;78393:44;;;;:89;;;;;;:::i;:::-;78519:36;78547:7;78519:4;:23;;;:27;;:36;;;;:::i;:::-;78493:4;:23;;:62;;;;78566:101;78587:4;:21;;;78609:4;:19;;;78629:4;78634:12;78647:9;78657:7;78665:1;78566:20;:101::i;:::-;78703:4;78691:10;78683:81;;;78709:7;78717:12;78730:10;78741:9;78751:12;78683:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;;;;77746:1026:::0;;:::o;55922:52::-;55961:13;55922:52;:::o;56360:31::-;;;;:::o;56101:30::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;59235:455::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59441:4:::1;59435:3;;:10;;;;;;;;;;;;;;;;;;59469:11;59456:10;;:24;;;;;;;;;;;;;;;;;;59505:12;59491:11;;:26;;;;;;;;;;;;;;;;;;59552:22;59528:21;:46;;;;59608:21;59585:20;:44;;;;59662:20;59640:19;:42;;;;59235:455:::0;;;;;;:::o;55670:36::-;;;;:::o;55447:24::-;;;;;;;;;;;;;:::o;69104:978::-;69182:21;69206:8;69215:4;69206:14;;;;;;;;;;;;;;;;;;69182:38;;69231:35;69269:15;69285:4;69269:21;;;;;;;;;;;;;;;;;;69231:59;;69336:10;69309:37;;:11;:23;;;;;;;;;;;;:37;;;69301:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69415:7;69400:4;:11;;;:22;;69392:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69492:1;69471:17;;:22;69468:453;;;69509:28;69522:14;69509:12;:28::i;:::-;69552:29;69576:4;69552:23;:29::i;:::-;;69468:453;;;69638:11;:20;;;69615:4;:20;;;:43;69612:298;;;69733:1;69681:49;69709:4;:20;;;69681:11;:23;;;:27;;:49;;;;:::i;:::-;:53;69678:217;;;69758:117;69801:11;:23;;;;;;;;;;;;69825:49;69853:4;:20;;;69825:11;:23;;;:27;;:49;;;;:::i;:::-;69765:11;:21;;;;;;;;;;;;69758:42;;;;:117;;;;;:::i;:::-;69678:217;69612:298;69468:453;69944:1;69934:7;:11;69931:85;;;69961:43;69989:4;69994:7;70002:1;69961:27;:43::i;:::-;69931:85;70057:1;70045:10;70031:43;;;70060:7;70068:1;70070;70072;70031:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69104:978;;;;:::o;55384:21::-;;;;;;;;;;;;;:::o;20504:148::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20611:1:::1;20574:40;;20595:6;::::0;::::1;;;;;;;;20574:40;;;;;;;;;;;;20642:1;20625:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;20504:148::o:0;60756:133::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60863:18:::1;60843:17;:38;;;;60756:133:::0;:::o;72396:716::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72500:1:::1;72490:7;:11;72482:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72552:21;72576:16;:28;72593:10;72576:28;;;;;;;;;;;;;;;72552:52;;72615:25;72628:11;72615:12;:25::i;:::-;72652:15;72668:20:::0;72689:17:::1;72710:37;72731:10;72742:4;72710:20;:37::i;:::-;72651:96;;;;;;72758:72;72794:10;72815:4;72822:7;72758:10;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;72841:85;72861:11;:26;;;72888:4;72893:12;72906:9;72916:7;72924:1;72841:19;:85::i;:::-;72970:43;73005:7;72970:11;:30;;;:34;;:43;;;;:::i;:::-;72937:11;:30;;:76;;;;73062:1;73050:10;73037:67;;;73065:7;73073;73081:9;73091:12;73037:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;72396:716:::0;:::o;81839:129::-;81910:7;;;;;;;;;;;81896:21;;:10;:21;;;81888:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81952:8;81942:7;;:18;;;;;;;;;;;;;;;;;;81839:129;:::o;19862:79::-;19900:7;19927:6;;;;;;;;;;;19920:13;;19862:79;:::o;56138:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55745:35::-;;;;:::o;55412:28::-;;;;;;;;;;;;;:::o;55507:::-;;;;:::o;59696:229::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59825:10:::1;59813:9;;:22;;;;;;;;;;;;;;;;;;59859:11;59846:10;:24;;;;59900:17;59881:16;:36;;;;59696:229:::0;;;:::o;56211:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56271:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;55542:37::-;;;;:::o;73120:1032::-;73200:1;73190:7;:11;73182:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73253:21;73277:16;:28;73294:10;73277:28;;;;;;;;;;;;;;;73253:52;;73339:7;73324:4;:11;;;:22;;73316:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73413:1;73392:17;;:22;73389:595;;;73430:25;73443:11;73430:12;:25::i;:::-;73471:15;73487:20;73508:17;73529:37;73550:10;73561:4;73529:20;:37::i;:::-;73470:96;;;;;;73581:85;73601:11;:26;;;73628:4;73633:12;73646:9;73656:7;73664:1;73581:19;:85::i;:::-;73712:1;73700:10;73686:68;;;73715:7;73723;73731:9;73741:12;73686:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73389:595;;;;;;73785:95;73805:11;:26;;;73832:4;73837;:17;;;73855:4;:14;;;73870:7;73878:1;73785:19;:95::i;:::-;73926:1;73914:10;73900:72;;;73929:7;73937:1;73939:4;:14;;;73954:4;:17;;;73900:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73389:595;74027:43;74062:7;74027:11;:30;;;:34;;:43;;;;:::i;:::-;73994:11;:30;;:76;;;;74091:53;74123:10;74136:7;74091:10;;;;;;;;;;;:23;;;;:53;;;;;:::i;:::-;73120:1032;;:::o;81976:439::-;82056:21;;82040:12;:37;;82032:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82147:7;;;;;;;;;;;82133:21;;:10;:21;;;82125:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82223:7;82206:13;;:24;;82198:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82281:3;;;;;;;;;;;:8;;;82290:7;;;;;;;;;;;82298;82281:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82333:26;82351:7;82333:13;;:17;;:26;;;;:::i;:::-;82317:13;:42;;;;82387:10;82375:32;;;82399:7;82375:32;;;;;;;;;;;;;;;;;;81976:439;:::o;55869:46::-;55913:2;55869:46;:::o;55478:22::-;;;;;;;;;;;;;:::o;55713:25::-;;;;:::o;55787:34::-;;;;:::o;61168:521::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61304:28:::1;61317:14;61304:12;:28::i;:::-;61343:25;61356:11;61343:12;:25::i;:::-;61407:18;61379:14;:25;;:46;;;;61461:15;61436:11;:22;;:40;;;;61512:23;61487:22;:48;;;;61564:39;61587:15;61564:18;:22;;:39;;;;:::i;:::-;61546:15;:57;;;;61640:1;61622:15;;:19;61614:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61168:521:::0;;;:::o;55830:32::-;;;;:::o;74589:723::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74711:1:::1;74701:7;:11;74693:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74767:21;74791:16;:23;74808:5;74791:23;;;;;;;;;;;;;;;74767:47;;74825:25;74838:11;74825:12;:25::i;:::-;74862:15;74878:20:::0;74899:17:::1;74920:32;74941:5;74947:4;74920:20;:32::i;:::-;74861:91;;;;;;74963:72;74999:10;75020:4;75027:7;74963:10;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;75046:85;75066:11;:26;;;75093:4;75098:12;75111:9;75121:7;75129:1;75046:19;:85::i;:::-;75175:43;75210:7;75175:11;:30;;;:34;;:43;;;;:::i;:::-;75142:11;:30;;:76;;;;75262:1;75255:5;75242:62;;;75265:7;75273;75281:9;75291:12;75242:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;;;74589:723:::0;;:::o;60072:218::-;58902:4;58870:36;;:16;:28;58887:10;58870:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;58862:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60164:1:::1;60154:7;:11;60151:132;;;60181:3;;;;;;;;;;;:8;;;60190:7;60198;60181:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60237:34;60255:15;60267:2;60255:7;:11;;:15;;;;:::i;:::-;60237:13;;:17;;:34;;;;:::i;:::-;60221:13;:50;;;;60151:132;60072:218:::0;;:::o;78780:1352::-;78872:1;78862:7;:11;78854:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78923:21;78947:8;78956:4;78947:14;;;;;;;;;;;;;;;;;;78923:38;;78972:21;78996:8;:14;79005:4;78996:14;;;;;;;;;;;:26;79011:10;78996:26;;;;;;;;;;;;;;;78972:50;;79033:35;79071:15;79087:4;79071:21;;;;;;;;;;;;;;;;;;79033:59;;79126:7;79111:4;:11;;;:22;;79103:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79198:1;79177:17;;:22;79174:687;;;79215:32;79230:4;79235:11;79215:14;:32::i;:::-;79263:20;79284:18;79303:20;79324:17;79345:52;79364:10;79375:4;79380;79385:11;79345:18;:52::i;:::-;79262:135;;;;;;;;79412:101;79433:4;:21;;;79455:4;:19;;;79475:4;79480:12;79493:9;79503:7;79511:1;79412:20;:101::i;:::-;79554:4;79542:10;79533:82;;;79560:7;79568:12;79581:10;79592:9;79602:12;79533:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79174:687;;;;;;;79646:111;79667:4;:21;;;79689:4;:19;;;79709:4;79714;:17;;;79732:4;:14;;;79747:7;79755:1;79646:20;:111::i;:::-;79798:4;79786:10;79777:72;;;79804:7;79812:1;79814;79816:4;:14;;;79831:4;:17;;;79777:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79174:687;79871:70;79920:10;79933:7;79878:11;:19;;;;;;;;;;;;79871:40;;;;:70;;;;;:::i;:::-;79978:36;80006:7;79978:4;:23;;;:27;;:36;;;;:::i;:::-;79952:4;:23;;:62;;;;55913:2;80028:4;:11;;;:31;80025:100;;;80092:21;80111:1;80092:4;:14;;;:18;;:21;;;;:::i;:::-;80075:4;:14;;:38;;;;80025:100;78780:1352;;;;;:::o;56061:33::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;20807:244::-;20084:12;:10;:12::i;:::-;20074:22;;:6;;;;;;;;;;:22;;;20066:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20916:1:::1;20896:22;;:8;:22;;;;20888:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21006:8;20977:38;;20998:6;::::0;::::1;;;;;;;;20977:38;;;;;;;;;;;;21035:8;21026:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20807:244:::0;:::o;55586:40::-;;;;:::o;62000:2656::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62395:1:::1;62380:11;:16;62377:73;;;62426:12;62412:26;;62377:73;62484:11;62468:12;:27;;62460:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;62561:25;62542:15;:44;;62534:89;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;62834:12;62642:188;62815:14;62642:11;;;;;;;;;;;:25;;;62668:11;62680:32;62696:15;62680:11;:15;;:32;;;;:::i;:::-;62713;62729:15;62713:11;:15;;:32;;;;:::i;:::-;62746:42;62762:25;62746:11;:15;;:42;;;;:::i;:::-;62789:20;62642:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:172;;:188;;;;:::i;:::-;:204;;62634:242;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;62910:1;62895:12;:16;62887:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;62951:75;62987:10;63006:4;63013:12;62958:10;62951:35;;;;:75;;;;;;:::i;:::-;63053:1;63040:10;;:14;63037:527;;;63070:75;63108:10;63127:4;63134:10;;63085:3;;;;;;;;;;;63070:37;;;;:75;;;;;;:::i;:::-;63182:1;63163:16;;:20;63160:393;;;63203:89;63237:9;;;;;;;;;;;63248:43;63285:5;63248:32;63263:16;;63248:10;;:14;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;63218:3;;;;;;;;;;;63203:33;;;;:89;;;;;:::i;:::-;63333:5;63314:16;;:24;63311:154;;;63362:3;;;;;;;;;;;:8;;;63379:4;63385:59;63400:43;63437:5;63400:32;63415:16;;63400:10;;:14;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;63385:10;;:14;;:59;;;;:::i;:::-;63362:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63311:154;63160:393;;;63503:3;;;;;;;;;;;:8;;;63520:4;63526:10;;63503:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63160:393;63037:527;63574:11;63588:8;:15;;;;63574:29;;63614:15;63635:485;;;;;;;;63679:8;63635:485;;;;;;63717:10;63635:485;;;;;;63759:10;63635:485;;;;;;63800:12;63635:485;;;;63843:11;63635:485;;;;63883:32;63899:15;63883:11;:15;;:32;;;;:::i;:::-;63635:485;;;;63949:14;63635:485;;;;64002:42;64018:25;64002:11;:15;;:42;;;;:::i;:::-;63635:485;;;;64084:20;63635:485;;::::0;63614:507:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64132:8;64146:325;;;;;;;;64202:11;64187:12;:26;:55;;64231:11;64187:55;;;64216:12;64187:55;64146:325;;;;64343:1;64146:325;;;;64275:1;64146:325;;;;64307:1;64146:325;;;;64370:1;64146:325;;;;64394:1;64146:325;;;;64425:1;64146:325;;;;64458:1;64146:325;;::::0;64132:340:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55913:2;64486:12;:31;64483:99;;64533:37;64553:3;64557:12;64533:19;:37::i;:::-;64483:99;64617:3;64605:10;64597:51;;;64622:12;64635;64597:51;;;;;;;;;;;;;;;;;;;;;;;;59115:1;62000:2656:::0;;;;;;;;;:::o;68524:572::-;59051:1;59030:17;;:22;59022:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68644:1:::1;68634:7;:11;68626:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68699:21;68723:8;68732:4;68723:14;;;;;;;;;;;;;;;;;;68699:38;;68748:35;68786:15;68802:4;68786:21;;;;;;;;;;;;;;;;;;68748:59;;68853:10;68826:37;;:11;:23;;;;;;;;;;;;:37;;;68818:79;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;68908:28;68921:14;68908:12;:28::i;:::-;68947:29;68971:4;68947:23;:29::i;:::-;;68987:43;69015:4;69020:7;69028:1;68987:27;:43::i;:::-;69071:1;69059:10;69046:42;;;69074:7;69082:1;69084::::0;69086::::1;69046:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59115:1;;68524:572:::0;;:::o;13405:181::-;13463:7;13483:9;13499:1;13495;:5;13483:17;;13524:1;13519;:6;;13511:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13577:1;13570:8;;;13405:181;;;;:::o;14759:471::-;14817:7;15067:1;15062;:6;15058:47;;;15092:1;15085:8;;;;15058:47;15117:9;15133:1;15129;:5;15117:17;;15162:1;15157;15153;:5;;;;;;:10;15145:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221:1;15214:8;;;14759:471;;;;;:::o;15706:132::-;15764:7;15791:39;15795:1;15798;15791:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;15784:46;;15706:132;;;;:::o;75319:1322::-;75442:4;:20;;;75426:12;:36;75422:75;;75479:7;;75422:75;55913:2;75511:4;:23;;;:44;75507:580;;75572:18;75593:11;;;;;;;;;;;:25;;;75619:4;:20;;;75641:12;75654:11;:20;;;75675:11;:30;;;75706:11;:31;;;75593:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75572:166;;75769:1;75756:10;:14;75753:323;;;75790:19;75812:41;75827:11;:25;;;75812:10;:14;;:41;;;;:::i;:::-;75790:63;;75895:37;75920:11;75895:4;:20;;;:24;;:37;;;;:::i;:::-;75872:4;:20;;:60;;;;75975:85;76001:58;76035:4;:23;;;76001:29;55961:13;76001:11;:15;;:29;;;;:::i;:::-;:33;;:58;;;;:::i;:::-;75975:4;:21;;;:25;;:85;;;;:::i;:::-;75951:4;:21;;:109;;;;75753:323;;75507:580;;76123:11;:20;;;76100:4;:20;;;:43;76097:364;;;76178:11;:20;;;76162:12;:36;76159:291;;76273:1;76221:49;76249:4;:20;;;76221:11;:23;;;:27;;:49;;;;:::i;:::-;:53;76218:217;;;76298:117;76341:11;:23;;;;;;;;;;;;76365:49;76393:4;:20;;;76365:11;:23;;;:27;;:49;;;;:::i;:::-;76305:11;:21;;;;;;;;;;;;76298:42;;;;:117;;;;;:::i;:::-;76218:217;76159:291;76097:364;76494:12;76471:4;:20;;:35;;;;76517:28;76530:14;76517:12;:28::i;:::-;76556:29;76580:4;76556:23;:29::i;:::-;;76596:37;76624:4;76629:1;76631;76596:27;:37::i;:::-;75319:1322;;;:::o;76647:697::-;76805:20;76826:18;76845:20;76866:17;55913:2;76899:4;:11;;;:32;76895:442;;76963:82;77024:4;:20;;;76963:56;55961:13;76963:38;76979:4;:21;;;76963:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:56;;;;:::i;:::-;:60;;:82;;;;:::i;:::-;76948:97;;77078:1;77063:12;:16;77060:121;;;77099:66;77142:8;77152:12;77106:11;:21;;;;;;;;;;;;77099:42;;;;:66;;;;;:::i;:::-;77060:121;77233:40;77248:4;77253;:19;;;77233:14;:40::i;:::-;77195:78;;;;;;;;;;;;77288:37;77304:8;77314:10;77288:15;:37::i;:::-;76895:442;76647:697;;;;;;;;;:::o;9648:205::-;9749:96;9769:5;9799:27;;;9828:4;9834:2;9838:5;9776:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9749:19;:96::i;:::-;9648:205;;;;:::o;77350:390::-;77562:85;77582:14;77597:4;77602:13;77616:10;77627:7;77635:11;77562:19;:85::i;:::-;77681:51;55961:13;77681:33;77697:16;77681:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:51;;;;:::i;:::-;77658:4;:20;;:74;;;;77350:390;;;;;;;:::o;18437:106::-;18490:15;18525:10;18518:17;;18437:106;:::o;65680:981::-;65771:7;:23;;;65755:12;:39;65751:78;;65811:7;;65751:78;55913:2;65843:7;:26;;;:46;65839:138;;;65932:12;65906:7;:23;;:38;;;;65959:7;;65839:138;66010:1;65990:17;;:21;65987:127;;;66053:12;66027:7;:23;;:38;;;;66080:7;;65987:127;66124:17;66144:11;;;;;;;;;;;:29;;;66174:7;:23;;;66199:12;66144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66124:88;;66238:1;66226:9;:13;66223:353;;;66267:54;66305:15;;66267:33;66281:7;:18;;;66267:9;:13;;:33;;;;:::i;:::-;:37;;:54;;;;:::i;:::-;66255:66;;66352:36;66370:17;66384:2;66370:9;:13;;:17;;;;:::i;:::-;66352:13;;:17;;:36;;;;:::i;:::-;66336:13;:52;;;;66403:3;;;;;;;;;;;:8;;;66420:4;66427:9;66403:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66477:87;66504:59;66536:7;:26;;;66504:27;55961:13;66504:9;:13;;:27;;;;:::i;:::-;:31;;:59;;;;:::i;:::-;66477:7;:22;;;:26;;:87;;;;:::i;:::-;66452:7;:22;;:112;;;;66223:353;66612:12;66586:7;:23;;:38;;;;66635:18;:16;:18::i;:::-;65680:981;;;:::o;72089:298::-;72177:18;72196:20;72217:17;72284:47;72299:4;72304:11;:26;;;72284:14;:47::i;:::-;72246:85;;;;;;;;;;;;72342:37;72358:8;72368:10;72342:15;:37::i;:::-;72089:298;;;;;:::o;70090:569::-;70280:1;70265:11;:16;70262:181;;;70311:24;70327:7;70311:4;:11;;;:15;;:24;;;;:::i;:::-;70297:4;:11;;:38;;;;70262:181;;;70370:1;70355:11;:16;70352:91;;;70401:24;70417:7;70401:4;:11;;;:15;;:24;;;;:::i;:::-;70387:4;:11;;:38;;;;70352:91;70262:181;70474:49;55961:13;70474:31;70490:14;70474:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:49;;;;:::i;:::-;70453:4;:18;;:70;;;;70557:12;70534:4;:20;;:35;;;;70600:13;70580:4;:17;;:33;;;;70641:10;70624:4;:14;;:27;;;;70090:569;;;;;;:::o;66667:1115::-;66741:15;55913:2;66772:4;:11;;;:32;66768:1007;;66831:88;66900:4;:18;;;66831:64;55961:13;66831:46;66847:14;:29;;;66831:4;:11;;;:15;;:46;;;;:::i;:::-;:50;;:64;;;;:::i;:::-;:68;;:88;;;;:::i;:::-;66821:98;;66947:1;66937:7;:11;66934:830;;;66989:1;66971:4;:14;;;:19;66968:781;;;67014:3;;;;;;;;;;;:8;;;67031:4;67037:7;67014:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67078:1;67068:11;;66968:781;;;67162:19;;67147:4;:14;;;:34;67144:442;;;67209:18;67230:122;67322:29;67347:3;67322:20;;:24;;:29;;;;:::i;:::-;67230:87;67242:74;67312:3;67242:65;67287:19;;67242:40;67267:4;:14;;;67242:20;;:24;;:40;;;;:::i;:::-;:44;;:65;;;;:::i;:::-;:69;;:74;;;;:::i;:::-;67230:7;:11;;:87;;;;:::i;:::-;:91;;:122;;;;:::i;:::-;67209:143;;67408:1;67382:23;67394:10;67382:7;:11;;:23;;;;:::i;:::-;:27;67379:137;;;67441:3;;;;;;;;;;;:8;;;67458:4;67464:23;67476:10;67464:7;:11;;:23;;;;:::i;:::-;67441:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67379:137;67552:10;67542:20;;67144:442;;67650:79;67674:54;67704:4;:23;;;67674:25;55961:13;67674:7;:11;;:25;;;;:::i;:::-;:29;;:54;;;;:::i;:::-;67650:4;:19;;;:23;;:79;;;;:::i;:::-;67628:4;:19;;:101;;;;66968:781;66934:830;66768:1007;66667:1115;;;:::o;13869:136::-;13927:7;13954:43;13958:1;13961;13954:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;13947:50;;13869:136;;;;:::o;9463:177::-;9546:86;9566:5;9596:23;;;9621:2;9625:5;9573:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9546:19;:86::i;:::-;9463:177;;;:::o;67788:730::-;67919:1;67905:10;:15;67902:513;;;67936:63;67964:10;67984:4;67991:7;67936:10;;;;;;;;;;;:27;;;;:63;;;;;;:::i;:::-;68050:46;68088:7;68050:14;:33;;;:37;;:46;;;;:::i;:::-;68014:14;:33;;:82;;;;68125:24;68141:7;68125:4;:11;;;:15;;:24;;;;:::i;:::-;68111:4;:11;;:38;;;;67902:513;;;68183:1;68169:10;:15;68166:249;;;68214:24;68230:7;68214:4;:11;;;:15;;:24;;;;:::i;:::-;68200:4;:11;;:38;;;;68253:53;68285:10;68298:7;68253:10;;;;;;;;;;;:23;;;;:53;;;;;:::i;:::-;68357:46;68395:7;68357:14;:33;;;:37;;:46;;;;:::i;:::-;68321:14;:33;;:82;;;;68166:249;67902:513;68446:64;55961:13;68446:46;68462:14;:29;;;68446:4;:11;;;:15;;:46;;;;:::i;:::-;:50;;:64;;;;:::i;:::-;68425:4;:18;;:85;;;;67788:730;;;:::o;16334:278::-;16420:7;16452:1;16448;:5;16455:12;16440:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16479:9;16495:1;16491;:5;;;;;;16479:17;;16603:1;16596:8;;;16334:278;;;;;:::o;70665:1418::-;70758:18;70777:20;70798:17;70840:73;70894:4;:18;;;70840:49;55961:13;70840:31;70856:14;70840:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:49;;;;:::i;:::-;:53;;:73;;;;:::i;:::-;70827:86;;70924:16;70969:1;70958:10;:12;70955:403;;;71010:11;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70989:4;:20;;;:45;70986:225;;;71065:42;71082:11;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71065:12;:16;;:42;;;;:::i;:::-;71054:53;;70986:225;;;71157:38;71174:4;:20;;;71157:12;:16;;:38;;;;:::i;:::-;71146:49;;70986:225;70955:403;;;71261:1;71244:4;:14;;;:18;71241:106;;;71293:38;71310:4;:20;;;71293:12;:16;;:38;;;;:::i;:::-;71282:49;;71241:106;70955:403;71368:24;71395:11;;;;;;;;;;;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71368:60;;71454:31;71467:4;:17;;;71454:8;:12;;:31;;;;:::i;:::-;71439:46;;71515:16;71499:12;:32;71496:572;;71559:30;71574:4;:14;;;71559:10;:14;;:30;;;;:::i;:::-;71547:42;;71617:1;71604:14;;71496:572;;;71666:1;71652:10;:15;71649:396;;;71702:1;71687:16;;71734:1;71722:13;;71767:4;:14;;;71754:27;;71649:396;;;71832:70;71889:12;71832:52;71867:16;71832:30;71847:4;:14;;;71832:10;:14;;:30;;;;:::i;:::-;:34;;:52;;;;:::i;:::-;:56;;:70;;;;:::i;:::-;71820:82;;71934:45;71969:9;71934:30;71949:4;:14;;;71934:10;:14;;:30;;;;:::i;:::-;:34;;:45;;;;:::i;:::-;71921:58;;72013:16;71998:31;;71649:396;71496:572;70665:1418;;;;;;;:::o;82427:418::-;82515:1;82505:7;:11;82502:336;;;82532:11;82546:3;;;;;;;;;;;:13;;;82568:4;82546:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82532:42;;82603:3;82593:7;:13;82589:238;;;82636:1;82630:3;:7;82627:97;;;82661:43;82695:3;82700;82676;;;;;;;;;;;82661:33;;;;:43;;;;;:::i;:::-;82627:97;82589:238;;;82764:47;82798:3;82803:7;82779:3;;;;;;;;;;;82764:33;;;;:47;;;;;:::i;:::-;82589:238;82502:336;;82427:418;;:::o;11768:761::-;12192:23;12218:69;12246:4;12218:69;;;;;;;;;;;;;;;;;12226:5;12218:27;;;;:69;;;;;:::i;:::-;12192:95;;12322:1;12302:10;:17;:21;12298:224;;;12444:10;12433:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12425:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12298:224;11768:761;;;:::o;14308:192::-;14394:7;14427:1;14422;:6;;14430:12;14414:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14454:9;14470:1;14466;:5;14454:17;;14491:1;14484:8;;;14308:192;;;;;:::o;6539:196::-;6642:12;6674:53;6697:6;6705:4;6711:1;6714:12;6674:22;:53::i;:::-;6667:60;;6539:196;;;;;:::o;7916:979::-;8046:12;8079:18;8090:6;8079:10;:18::i;:::-;8071:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8205:12;8219:23;8246:6;:11;;8266:8;8277:4;8246:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8204:78;;;;8297:7;8293:595;;;8328:10;8321:17;;;;;;8293:595;8462:1;8442:10;:17;:21;8438:439;;;8705:10;8699:17;8766:15;8753:10;8749:2;8745:19;8738:44;8653:148;8848:12;8841:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7916:979;;;;;;;:::o;3621:422::-;3681:4;3889:12;4000:7;3988:20;3980:28;;4034:1;4027:4;:8;4020:15;;;3621:422;;;:::o
Swarm Source
ipfs://2206c4276f5b99a9dc169eeeded7b150d24339668251da274d0e20ccb5eda5d5
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.