More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 11,967 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 38898680 | 674 days ago | IN | 0 FTM | 0.02006627 | ||||
Deposit | 38768062 | 676 days ago | IN | 0 FTM | 0.00393993 | ||||
Deposit | 38767951 | 676 days ago | IN | 0 FTM | 0.00868456 | ||||
Deposit | 38676590 | 677 days ago | IN | 0 FTM | 0.01839141 | ||||
Withdraw | 38676069 | 677 days ago | IN | 0 FTM | 0.03053431 | ||||
Withdraw | 37918534 | 689 days ago | IN | 0 FTM | 0.05645803 | ||||
Withdraw | 36695396 | 706 days ago | IN | 0 FTM | 0.01120147 | ||||
Deposit | 36662071 | 706 days ago | IN | 0 FTM | 0.03108124 | ||||
Withdraw | 36422181 | 709 days ago | IN | 0 FTM | 0.01593677 | ||||
Withdraw | 35971213 | 714 days ago | IN | 0 FTM | 0.02893839 | ||||
Withdraw | 35967619 | 715 days ago | IN | 0 FTM | 0.05790433 | ||||
Deposit | 35560625 | 719 days ago | IN | 0 FTM | 0.04486528 | ||||
Withdraw | 35479405 | 720 days ago | IN | 0 FTM | 0.02296238 | ||||
Withdraw | 35479372 | 720 days ago | IN | 0 FTM | 0.02371995 | ||||
Withdraw | 35453646 | 721 days ago | IN | 0 FTM | 0.05675505 | ||||
Deposit | 35396666 | 721 days ago | IN | 0 FTM | 0.09212943 | ||||
Deposit | 35347175 | 722 days ago | IN | 0 FTM | 0.05377458 | ||||
Deposit | 35317403 | 722 days ago | IN | 0 FTM | 0.02480486 | ||||
Deposit | 35317396 | 722 days ago | IN | 0 FTM | 0.02480223 | ||||
Withdraw | 35207578 | 724 days ago | IN | 0 FTM | 0.01232186 | ||||
Deposit | 35207498 | 724 days ago | IN | 0 FTM | 0.01298954 | ||||
Withdraw | 35184807 | 724 days ago | IN | 0 FTM | 0.01424398 | ||||
Deposit | 35184800 | 724 days ago | IN | 0 FTM | 0.0176616 | ||||
Deposit | 35159408 | 724 days ago | IN | 0 FTM | 0.02933741 | ||||
Deposit | 35159272 | 724 days ago | IN | 0 FTM | 0.03717534 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
31202274 | 770 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-02-17 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: MushroomCoin.sol pragma solidity 0.8.10; contract MushroomCoin is ERC20 { using SafeMath for uint256; // Transfer tax rate in basis points. (default 5%) uint16 public transferTaxRate = 0; // Max transfer tax rate: 20%. uint16 public constant maxTaxRate = 2000; // Burn address address public constant burnAddr = 0x000000000000000000000000000000000000dEaD; // Contract address is excluded from tax. mapping(address => bool) public noTaxRecipient; // Contract address is excluded from tax. mapping(address => bool) public noTaxSender; // The operator can call all functions except of minting MushroomCoin address private _operator; //Token properties address public masterchef; address public presaleContract; uint256 public maxSupply = 0; uint256 public initialSupply = 0; // Events event OperatorTransferred(address indexed previousOperator, address indexed newOperator); event TransferTaxRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); event SetNoTaxSenderAddr(address indexed operator, address indexed noTaxSenderAddr, bool _value); event SetNoTaxRecipientAddr(address indexed operator, address indexed noTaxRecipientAddr, bool _value); event InitialSupplyMint(address indexed user, uint256 amount); event MasterchefInitialized(address indexed masterchef); event UpdatedTokenCap(uint256 amount); modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } modifier onlyMasterchef() { require(msg.sender == masterchef, "Caller is not the Masterchef"); _; } /** * @notice Constructs the MarioBros Token contract. */ constructor(address _to, uint256 _initialSupply, uint256 _maxSupply) ERC20("Mushroom Coin", "COIN") { _operator = _msgSender(); initialSupply = _initialSupply; maxSupply = _maxSupply; _mint(_to, initialSupply); emit OperatorTransferred(address(0), _operator); emit InitialSupplyMint(_to, initialSupply); } // This function initializes the masterchef address into the token address. This can only be called ONCE. function initializeMC(address _masterchef) external onlyOperator { require( masterchef == address(0) && _masterchef != address(0) && _masterchef != address(this), "ERROR: Masterchef cannot be the zero address." ); masterchef = _masterchef; noTaxSender[masterchef] = true; noTaxRecipient[masterchef] = true; emit MasterchefInitialized(masterchef); } // This function initializes the presale contract address for whitelisting in the token transfer tax. function initializePresaleContract (address _presaleContract) external onlyOperator { require(presaleContract == address(0), "Presale contract already whitelisted."); presaleContract = _presaleContract; noTaxSender[presaleContract] = true; noTaxRecipient[presaleContract] = true; } /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyMasterchef { _mint(_to, _amount); } /// @dev overrides transfer function to meet tokenomics of COIN function _transfer(address sender, address recipient, uint256 amount) internal virtual override { if (recipient == burnAddr || sender == _operator || noTaxRecipient[recipient] || noTaxSender[sender] || transferTaxRate == 0 ) { super._transfer(sender, recipient, amount); // transfer with no Tax } else { // default tax is 5% of every transfer uint256 taxAmount = amount.mul(transferTaxRate).div(10000); // default 95% of transfer sent to recipient uint256 sendAmount = amount.sub(taxAmount); require(amount == sendAmount + taxAmount, "COIN::transfer: Tax value invalid"); super._transfer(sender, burnAddr, taxAmount); super._transfer(sender, recipient, sendAmount); } } /** * @dev Update the transfer tax rate. * Can only be called by the current operator. */ function updateTransferTaxRate(uint16 _transferTaxRate) external onlyOperator { require(_transferTaxRate <= maxTaxRate, "COIN::updateTransferTaxRate: Transfer tax rate must not exceed the maximum rate."); emit TransferTaxRateUpdated(msg.sender, transferTaxRate, _transferTaxRate); transferTaxRate = _transferTaxRate; } /** * @dev Update the token soft cap. * Can only be called by the current operator. */ function updateMaxSupply(uint256 _newMaxSupply) external onlyOperator { require(_newMaxSupply > maxSupply, "Cannot be lower than current maximum."); maxSupply = _newMaxSupply; } /** * @dev Update the no Tax Contract Address. * Can only be called by the current operator. */ function setNoTaxSenderAddr(address _noTaxSenderAddr, bool _value) external onlyOperator { noTaxSender[_noTaxSenderAddr] = _value; emit SetNoTaxSenderAddr(msg.sender, _noTaxSenderAddr, _value); } function setNoTaxRecipientAddr(address _noTaxRecipientAddr, bool _value) external onlyOperator { noTaxRecipient[_noTaxRecipientAddr] = _value; emit SetNoTaxRecipientAddr(msg.sender, _noTaxRecipientAddr, _value); } /** * @dev Returns the address of the current operator. */ function operator() public view returns (address) { return _operator; } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) external onlyOperator { require(newOperator != address(0), "COIN::transferOperator: new operator is the zero address"); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Masterchef.sol pragma solidity 0.8.10; contract MasterChef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. COINs to distribute per second. uint256 lastRewardSecond; // Last second that COINs distribution occurs. uint256 accCoinPerShare; // Accumulated COINs per share, times 1e18. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 lpSupply; bool isNative; } // The COIN! MushroomCoin public immutable coin; // Dev address. address public devaddr; // COIN tokens created per second. uint256 public CoinPerSecond; // Deposit Fee address address public feeAddress; // Max emission rate. uint256 public constant MAX_EMISSION_RATE = 10 ether; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block timestamp when coin mining starts. uint256 public startTime; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event SetFeeAddress(address indexed user, address indexed newAddress); event SetDevAddress(address indexed user, address indexed newAddress); event UpdateEmissionRate(address indexed user, uint256 CoinPerSecond); event addPool( uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 depositFeeBP ); event setPool( uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 depositFeeBP ); event UpdateStartTime(uint256 newStartTime); constructor( MushroomCoin _coin, address _devaddr, address _feeAddress, uint256 _CoinPerSecond, uint256 _startTime ) { coin = _coin; devaddr = _devaddr; feeAddress = _feeAddress; CoinPerSecond = _CoinPerSecond; startTime = _startTime; } function poolLength() external view returns (uint256) { return poolInfo.length; } mapping(IERC20 => bool) public poolExistence; modifier nonDuplicated(IERC20 _lpToken) { require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated"); _; } // Add a new lp to the pool. Can only be called by the owner. function add( uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, bool _isNative, bool _withUpdate ) public onlyOwner nonDuplicated(_lpToken) { // valid ERC20 token _lpToken.balanceOf(address(this)); require(_depositFeeBP <= 400, "add: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardSecond = block.timestamp > startTime ? block.timestamp : startTime; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolExistence[_lpToken] = true; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardSecond: lastRewardSecond, accCoinPerShare: 0, depositFeeBP: _depositFeeBP, lpSupply: 0, isNative: _isNative }) ); emit addPool( poolInfo.length - 1, address(_lpToken), _allocPoint, _depositFeeBP ); } // Update the given pool's coin allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate ) external onlyOwner { require(_depositFeeBP <= 400, "set: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; emit setPool( _pid, address(poolInfo[_pid].lpToken), _allocPoint, _depositFeeBP ); } // Initializes the set of pools for the project. Can only be called by owner. function initializePools(address _nativeLP) external onlyOwner { require(poolInfo.length == 0, "Pools are already existing."); add(150, IERC20(_nativeLP), 0, true, false); // COIN LP add(140, IERC20(coin), 0, true, false); // COIN add(25, IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83), 400, false, false); // wFTM pool add(20, IERC20(0x74b23882a30290451A17c44f4F05243b6b58C76d), 400, false, false); // wETH pool add(20, IERC20(0x321162Cd933E2Be498Cd2267a90534A804051b11), 400, false, false); // wBTC pool add(20, IERC20(0x04068DA6C83AFCFA0e13ba15A6696662335D5B75), 400, false, false); // USDC pool add(20, IERC20(0x049d68029688eAbF473097a2fC38ef61633A3C7A), 400, false, false); // USDT pool add(20, IERC20(0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E), 400, false, false); // DAI pool add(5, IERC20(0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE), 400, false, false); // BOO pool } // Sets the deposit fee of all non natives in the farm. function setGlobalDepositFee(uint16 _globalDepositFeeBP) external onlyOwner { require(_globalDepositFeeBP <= 400, "set: invalid deposit fee basis points"); for (uint256 pid = 0; pid < poolInfo.length; ++pid) { if (poolInfo[pid].isNative == false) { updatePool(pid); poolInfo[pid].depositFeeBP = _globalDepositFeeBP; emit setPool(pid, address(poolInfo[pid].lpToken), poolInfo[pid].allocPoint, _globalDepositFeeBP); } } } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } // View function to see pending coin on frontend. function pendingCoin (uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accCoinPerShare = pool.accCoinPerShare; if ( block.timestamp > pool.lastRewardSecond && pool.lpSupply != 0 && totalAllocPoint > 0 ) { uint256 multiplier = getMultiplier( pool.lastRewardSecond, block.timestamp ); uint256 coinReward = multiplier .mul(CoinPerSecond) .mul(pool.allocPoint) .div(totalAllocPoint); uint256 devReward = coinReward.div(10); uint256 totalRewards = coin.totalSupply().add(devReward).add( coinReward ); if (totalRewards > coin.maxSupply()) { coinReward = coin.maxSupply().sub(coin.totalSupply()); } accCoinPerShare = accCoinPerShare.add( coinReward.mul(1e18).div(pool.lpSupply) ); } return user.amount.mul(accCoinPerShare).div(1e18).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardSecond) { return; } if (pool.lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardSecond = block.timestamp; return; } uint256 multiplier = getMultiplier( pool.lastRewardSecond, block.timestamp ); uint256 coinReward = multiplier .mul(CoinPerSecond) .mul(pool.allocPoint) .div(totalAllocPoint); uint256 devReward = coinReward.div(10); uint256 totalRewards = coin.totalSupply().add(devReward).add( coinReward ); if (totalRewards <= coin.maxSupply()) { // mint as normal as not at maxSupply coin.mint(devaddr, coinReward.div(10)); coin.mint(address(this), coinReward); } else { // mint the difference only to MC, update coinReward coinReward = coin.maxSupply().sub(coin.totalSupply()); coin.mint(address(this), coinReward); } if (coinReward != 0) { // only calculate and update if coinReward is non 0 pool.accCoinPerShare = pool.accCoinPerShare.add( coinReward.mul(1e18).div(pool.lpSupply) ); } pool.lastRewardSecond = block.timestamp; } // Deposit LP tokens to MasterChef for coin allocation. function deposit(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accCoinPerShare) .div(1e18) .sub(user.rewardDebt); if (pending > 0) { safeCoinTransfer(msg.sender, pending); } } if (_amount > 0) { uint256 balanceBefore = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); _amount = pool.lpToken.balanceOf(address(this)).sub(balanceBefore); if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(feeAddress, depositFee); user.amount = user.amount.add(_amount).sub(depositFee); pool.lpSupply = pool.lpSupply.add(_amount).sub(depositFee); } else { user.amount = user.amount.add(_amount); pool.lpSupply = pool.lpSupply.add(_amount); } } user.rewardDebt = user.amount.mul(pool.accCoinPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accCoinPerShare).div(1e18).sub( user.rewardDebt ); if (pending > 0) { safeCoinTransfer(msg.sender, pending); } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); pool.lpSupply = pool.lpSupply.sub(_amount); } user.rewardDebt = user.amount.mul(pool.accCoinPerShare).div(1e18); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.lpToken.safeTransfer(address(msg.sender), amount); if (pool.lpSupply >= amount) { pool.lpSupply = pool.lpSupply.sub(amount); } else { pool.lpSupply = 0; } emit EmergencyWithdraw(msg.sender, _pid, amount); } // Safe coin transfer function, just in case if rounding error causes pool to not have enough coins. function safeCoinTransfer(address _to, uint256 _amount) internal { uint256 coinBal = coin.balanceOf(address(this)); bool transferSuccess = false; if (_amount > coinBal) { transferSuccess = coin.transfer(_to, coinBal); } else { transferSuccess = coin.transfer(_to, _amount); } require(transferSuccess, "safeCoinTransfer: transfer failed"); } // Update dev address. function setDevAddress(address _devaddr) external { require(_devaddr != address(0), "!nonzero"); require(msg.sender == devaddr, "dev: wut?"); devaddr = _devaddr; emit SetDevAddress(msg.sender, _devaddr); } function setFeeAddress(address _feeAddress) external { require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN"); require(_feeAddress != address(0), "!nonzero"); feeAddress = _feeAddress; emit SetFeeAddress(msg.sender, _feeAddress); } //Pancake has to add hidden dummy pools inorder to alter the emission, here we make it simple and transparent to all. function updateEmissionRate(uint256 _CoinPerSecond) external onlyOwner { require(_CoinPerSecond <= MAX_EMISSION_RATE, "Emission too high"); massUpdatePools(); CoinPerSecond = _CoinPerSecond; emit UpdateEmissionRate(msg.sender, _CoinPerSecond); } // Only update before start of farm function updateStartTime(uint256 _newStartTime) external onlyOwner { require( block.timestamp < startTime, "cannot change start time if farm has already started" ); require( block.timestamp < _newStartTime, "cannot set start time in the past" ); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardSecond = _newStartTime; } startTime = _newStartTime; emit UpdateStartTime(startTime); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract MushroomCoin","name":"_coin","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_CoinPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","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":"amount","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"}],"name":"EmergencyWithdraw","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":"address","name":"newAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"CoinPerSecond","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"UpdateStartTime","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":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFeeBP","type":"uint256"}],"name":"addPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFeeBP","type":"uint256"}],"name":"setPool","type":"event"},{"inputs":[],"name":"CoinPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_isNative","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"coin","outputs":[{"internalType":"contract MushroomCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeLP","type":"address"}],"name":"initializePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardSecond","type":"uint256"},{"internalType":"uint256","name":"accCoinPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"lpSupply","type":"uint256"},{"internalType":"bool","name":"isNative","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_globalDepositFeeBP","type":"uint16"}],"name":"setGlobalDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"uint256","name":"_CoinPerSecond","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"updateStartTime","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":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405260006007553480156200001657600080fd5b50604051620049893803806200498983398181016040528101906200003c9190620002e8565b6200005c620000506200013260201b60201c565b6200013a60201b60201c565b600180819055508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160038190555080600881905550505050505062000370565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002308262000203565b9050919050565b6000620002448262000223565b9050919050565b620002568162000237565b81146200026257600080fd5b50565b60008151905062000276816200024b565b92915050565b620002878162000223565b81146200029357600080fd5b50565b600081519050620002a7816200027c565b92915050565b6000819050919050565b620002c281620002ad565b8114620002ce57600080fd5b50565b600081519050620002e281620002b7565b92915050565b600080600080600060a08688031215620003075762000306620001fe565b5b6000620003178882890162000265565b95505060206200032a8882890162000296565b94505060406200033d8882890162000296565b93505060606200035088828901620002d1565b92505060806200036388828901620002d1565b9150509295509295909350565b608051614594620003f56000396000818161082c01528181610c9a01528181610d4701528181610ddc01528181610e9e01528181610f3301528181610fc20152818161106101528181612417015281816124c40152818161255d015281816125ec01528181612b1301528181612c9101528181612d370152612ddc01526145946000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638705fcd411610104578063d49e77cd116100a2578063e9a52b6711610071578063e9a52b67146104d5578063ecb1ab5414610505578063f2fde38b14610521578063f70a29a01461053d576101cf565b8063d49e77cd14610463578063d963842214610481578063dc9464b91461049d578063e2bbb158146104b9576101cf565b806393f1a40b116100de57806393f1a40b146103c85780639e1d12ab146103f9578063cbd258b514610417578063d0d41fe114610447576101cf565b80638705fcd41461035e5780638da5cb5b1461037a5780638dbb1e3a14610398576101cf565b8063436cc3d6116101715780635312ea8e1161014b5780635312ea8e14610310578063630b5ba11461032c578063715018a61461033657806378e9792514610340576101cf565b8063436cc3d6146102ba578063441a3e70146102d857806351eb05a6146102f4576101cf565b806311df9995116101ad57806311df99951461022a5780631526fe271461024857806317caf6f11461027e578063412753581461029c576101cf565b806306bcf02f146101d4578063081e3eda146101f05780630ba84cd21461020e575b600080fd5b6101ee60048036038101906101e99190613362565b610559565b005b6101f86106f6565b604051610205919061339e565b60405180910390f35b61022860048036038101906102239190613362565b610703565b005b61023261082a565b60405161023f9190613438565b60405180910390f35b610262600480360381019061025d9190613362565b61084e565b60405161027597969594939291906134ac565b60405180910390f35b6102866108db565b604051610293919061339e565b60405180910390f35b6102a46108e1565b6040516102b1919061353c565b60405180910390f35b6102c2610907565b6040516102cf919061339e565b60405180910390f35b6102f260048036038101906102ed9190613557565b610913565b005b61030e60048036038101906103099190613362565b610bbf565b005b61032a60048036038101906103259190613362565b611157565b005b610334611321565b005b61033e611354565b005b6103486113dc565b604051610355919061339e565b60405180910390f35b610378600480360381019061037391906135c3565b6113e2565b005b610382611580565b60405161038f919061353c565b60405180910390f35b6103b260048036038101906103ad9190613557565b6115a9565b6040516103bf919061339e565b60405180910390f35b6103e260048036038101906103dd91906135f0565b6115c6565b6040516103f0929190613630565b60405180910390f35b6104016115f7565b60405161040e919061339e565b60405180910390f35b610431600480360381019061042c9190613697565b6115fd565b60405161043e91906136c4565b60405180910390f35b610461600480360381019061045c91906135c3565b61161d565b005b61046b6117bb565b604051610478919061353c565b60405180910390f35b61049b60048036038101906104969190613737565b6117e1565b005b6104b760048036038101906104b2919061379e565b6119f8565b005b6104d360048036038101906104ce9190613557565b611deb565b005b6104ef60048036038101906104ea91906135f0565b6122ef565b6040516104fc919061339e565b60405180910390f35b61051f600480360381019061051a9190613819565b612726565b005b61053b600480360381019061053691906135c3565b61293f565b005b610557600480360381019061055291906135c3565b612a37565b005b610561612c43565b73ffffffffffffffffffffffffffffffffffffffff1661057f611580565b73ffffffffffffffffffffffffffffffffffffffff16146105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc906138a3565b60405180910390fd5b6008544210610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061090613935565b60405180910390fd5b80421061065b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610652906139c7565b60405180910390fd5b6000600580549050905060005b818110156106b157600060058281548110610686576106856139e7565b5b9060005260206000209060070201905083816002018190555050806106aa90613a45565b9050610668565b50816008819055507fa09018266c541576eb124551c9c57c82a8129add3ba6777a5974b1d0e6252e996008546040516106ea919061339e565b60405180910390a15050565b6000600580549050905090565b61070b612c43565b73ffffffffffffffffffffffffffffffffffffffff16610729611580565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610776906138a3565b60405180910390fd5b678ac7230489e800008111156107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190613ada565b60405180910390fd5b6107d2611321565b806003819055503373ffffffffffffffffffffffffffffffffffffffff167fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c40538260405161081f919061339e565b60405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005818154811061085e57600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16908060050154908060060160009054906101000a900460ff16905087565b60075481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b678ac7230489e8000081565b60026001541415610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090613b46565b60405180910390fd5b6002600181905550600060058381548110610977576109766139e7565b5b9060005260206000209060070201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1990613bb2565b60405180910390fd5b610a2b84610bbf565b6000610a788260010154610a6a670de0b6b3a7640000610a5c87600301548760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b90506000811115610a8e57610a8d3382612c8d565b5b6000841115610b2557610aae848360000154612c7790919063ffffffff16565b8260000181905550610b0533858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b610b1c848460050154612c7790919063ffffffff16565b83600501819055505b610b5a670de0b6b3a7640000610b4c85600301548560000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610ba9919061339e565b60405180910390a3505050600180819055505050565b600060058281548110610bd557610bd46139e7565b5b9060005260206000209060070201905080600201544211610bf65750611154565b600081600501541480610c0d575060008160010154145b15610c215742816002018190555050611154565b6000610c318260020154426115a9565b90506000610c74600754610c668560010154610c5860035487612c4b90919063ffffffff16565b612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506000610c8c600a83612c6190919063ffffffff16565b90506000610d4383610d35847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d279190613be7565b612f4790919063ffffffff16565b612f4790919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd49190613be7565b8111610f2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f19600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e4d600a87612c6190919063ffffffff16565b6040518363ffffffff1660e01b8152600401610e6a929190613c14565b600060405180830381600087803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff1660e01b8152600401610ef7929190613c14565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b505050506110ed565b61105d7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc09190613be7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104f9190613be7565b612c7790919063ffffffff16565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff1660e01b81526004016110ba929190613c14565b600060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050505b600083146111455761113c611129866005015461111b670de0b6b3a764000087612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8660030154612f4790919063ffffffff16565b85600301819055505b42856002018190555050505050505b50565b6002600154141561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490613b46565b60405180910390fd5b60026001819055506000600582815481106111bb576111ba6139e7565b5b9060005260206000209060070201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555061128b33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b808360050154106112ba576112ad818460050154612c7790919063ffffffff16565b83600501819055506112c5565b600083600501819055505b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958360405161130c919061339e565b60405180910390a35050506001808190555050565b6000600580549050905060005b818110156113505761133f81610bbf565b8061134990613a45565b905061132e565b5050565b61135c612c43565b73ffffffffffffffffffffffffffffffffffffffff1661137a611580565b73ffffffffffffffffffffffffffffffffffffffff16146113d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c7906138a3565b60405180910390fd5b6113da6000612f5d565b565b60085481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613c89565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613cf5565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f760405160405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006115be8383612c7790919063ffffffff16565b905092915050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60035481565b60096020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613cf5565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490613d61565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e760405160405180910390a350565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117e9612c43565b73ffffffffffffffffffffffffffffffffffffffff16611807611580565b73ffffffffffffffffffffffffffffffffffffffff161461185d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611854906138a3565b60405180910390fd5b6101908261ffff1611156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613df3565b60405180910390fd5b80156118b5576118b4611321565b5b611901836118f3600587815481106118d0576118cf6139e7565b5b906000526020600020906007020160010154600754612c7790919063ffffffff16565b612f4790919063ffffffff16565b600781905550826005858154811061191c5761191b6139e7565b5b9060005260206000209060070201600101819055508160058581548110611946576119456139e7565b5b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff160217905550837f39f0c3d078af018954b4fa56832a05a2b511afaa999b133ea3f1c487c21ed287600586815481106119a7576119a66139e7565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856040516119ea93929190613e44565b60405180910390a250505050565b611a00612c43565b73ffffffffffffffffffffffffffffffffffffffff16611a1e611580565b73ffffffffffffffffffffffffffffffffffffffff1614611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906138a3565b60405180910390fd5b8360001515600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613ec7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b41919061353c565b602060405180830381865afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613be7565b506101908461ffff161115611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390613f59565b60405180910390fd5b8115611bdb57611bda611321565b5b60006008544211611bee57600854611bf0565b425b9050611c0787600754612f4790919063ffffffff16565b6007819055506001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056040518060e001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff16815260200160008152602001861515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555060a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050506001600580549050611da79190613f79565b7faa6642278d4bbef86d8990c37355d5d4dfe365c194106bdf7a65162268606f07878988604051611dda93929190613e44565b60405180910390a250505050505050565b60026001541415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613b46565b60405180910390fd5b6002600181905550600060058381548110611e4f57611e4e6139e7565b5b9060005260206000209060070201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ebc84610bbf565b600081600001541115611f2e576000611f168260010154611f08670de0b6b3a7640000611efa87600301548760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b90506000811115611f2c57611f2b3382612c8d565b5b505b60008311156122565760008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f96919061353c565b602060405180830381865afa158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190613be7565b905061202a3330868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613021909392919063ffffffff16565b6120da818460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161208b919061353c565b602060405180830381865afa1580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc9190613be7565b612c7790919063ffffffff16565b935060008360040160009054906101000a900461ffff1661ffff16111561221557600061213a61271061212c8660040160009054906101000a900461ffff1661ffff1688612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506121ad600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b6121d6816121c8878660000154612f4790919063ffffffff16565b612c7790919063ffffffff16565b8360000181905550612207816121f9878760050154612f4790919063ffffffff16565b612c7790919063ffffffff16565b846005018190555050612254565b61222c848360000154612f4790919063ffffffff16565b826000018190555061224b848460050154612f4790919063ffffffff16565b83600501819055505b505b61228b670de0b6b3a764000061227d84600301548460000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516122da919061339e565b60405180910390a35050600180819055505050565b60008060058481548110612306576123056139e7565b5b9060005260206000209060070201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905082600201544211801561238b57506000836005015414155b801561239957506000600754115b156126d45760006123ae8460020154426115a9565b905060006123f16007546123e387600101546123d560035487612c4b90919063ffffffff16565b612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506000612409600a83612c6190919063ffffffff16565b905060006124c0836124b2847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a49190613be7565b612f4790919063ffffffff16565b612f4790919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125519190613be7565b81111561268a576126877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190613be7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015612655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126799190613be7565b612c7790919063ffffffff16565b92505b6126cd6126be88600501546126b0670de0b6b3a764000087612c4b90919063ffffffff16565b612c6190919063ffffffff16565b86612f4790919063ffffffff16565b9450505050505b61271b826001015461270d670de0b6b3a76400006126ff858760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b935050505092915050565b61272e612c43565b73ffffffffffffffffffffffffffffffffffffffff1661274c611580565b73ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906138a3565b60405180910390fd5b6101908161ffff1611156127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613df3565b60405180910390fd5b60005b60058054905081101561293b576000151560058281548110612813576128126139e7565b5b906000526020600020906007020160060160009054906101000a900460ff161515141561292a5761284381610bbf565b8160058281548110612858576128576139e7565b5b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff160217905550807f39f0c3d078af018954b4fa56832a05a2b511afaa999b133ea3f1c487c21ed287600583815481106128b9576128b86139e7565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600584815481106128ff576128fe6139e7565b5b9060005260206000209060070201600101548560405161292193929190613e44565b60405180910390a25b8061293490613a45565b90506127ee565b5050565b612947612c43565b73ffffffffffffffffffffffffffffffffffffffff16612965611580565b73ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b2906138a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061401f565b60405180910390fd5b612a3481612f5d565b50565b612a3f612c43565b73ffffffffffffffffffffffffffffffffffffffff16612a5d611580565b73ffffffffffffffffffffffffffffffffffffffff1614612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa906138a3565b60405180910390fd5b600060058054905014612afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af29061408b565b60405180910390fd5b612b0c6096826000600160006119f8565b612b3d608c7f00000000000000000000000000000000000000000000000000000000000000006000600160006119f8565b612b6260197321be370d5312f44cb42ce377bc9b8a0cef1a4c836101906000806119f8565b612b8760147374b23882a30290451a17c44f4f05243b6b58c76d6101906000806119f8565b612bac601473321162cd933e2be498cd2267a90534a804051b116101906000806119f8565b612bd160147304068da6c83afcfa0e13ba15a6696662335d5b756101906000806119f8565b612bf6601473049d68029688eabf473097a2fc38ef61633a3c7a6101906000806119f8565b612c1b6014738d11ec38a3eb5e956b052f67da8bdc9bef8abf3e6101906000806119f8565b612c40600573841fad6eae12c286d1fd18d1d525dffa75c7effe6101906000806119f8565b50565b600033905090565b60008183612c5991906140ab565b905092915050565b60008183612c6f9190614134565b905092915050565b60008183612c859190613f79565b905092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612ce8919061353c565b602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d299190613be7565b9050600081831115612dda577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401612d90929190613c14565b6020604051808303816000875af1158015612daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd3919061417a565b9050612e7b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401612e35929190613c14565b6020604051808303816000875af1158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e78919061417a565b90505b80612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb290614219565b60405180910390fd5b50505050565b612f428363a9059cbb60e01b8484604051602401612ee0929190613c14565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130aa565b505050565b60008183612f559190614239565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130a4846323b872dd60e01b8585856040516024016130429392919061428f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130aa565b50505050565b600061310c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131719092919063ffffffff16565b905060008151111561316c578080602001905181019061312c919061417a565b61316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316290614338565b60405180910390fd5b5b505050565b60606131808484600085613189565b90509392505050565b6060824710156131ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c5906143ca565b60405180910390fd5b6131d78561329d565b613216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320d90614436565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323f91906144d0565b60006040518083038185875af1925050503d806000811461327c576040519150601f19603f3d011682016040523d82523d6000602084013e613281565b606091505b50915091506132918282866132c0565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156132d057829050613320565b6000835111156132e35782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613317919061453c565b60405180910390fd5b9392505050565b600080fd5b6000819050919050565b61333f8161332c565b811461334a57600080fd5b50565b60008135905061335c81613336565b92915050565b60006020828403121561337857613377613327565b5b60006133868482850161334d565b91505092915050565b6133988161332c565b82525050565b60006020820190506133b3600083018461338f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006133fe6133f96133f4846133b9565b6133d9565b6133b9565b9050919050565b6000613410826133e3565b9050919050565b600061342282613405565b9050919050565b61343281613417565b82525050565b600060208201905061344d6000830184613429565b92915050565b600061345e82613405565b9050919050565b61346e81613453565b82525050565b600061ffff82169050919050565b61348b81613474565b82525050565b60008115159050919050565b6134a681613491565b82525050565b600060e0820190506134c1600083018a613465565b6134ce602083018961338f565b6134db604083018861338f565b6134e8606083018761338f565b6134f56080830186613482565b61350260a083018561338f565b61350f60c083018461349d565b98975050505050505050565b6000613526826133b9565b9050919050565b6135368161351b565b82525050565b6000602082019050613551600083018461352d565b92915050565b6000806040838503121561356e5761356d613327565b5b600061357c8582860161334d565b925050602061358d8582860161334d565b9150509250929050565b6135a08161351b565b81146135ab57600080fd5b50565b6000813590506135bd81613597565b92915050565b6000602082840312156135d9576135d8613327565b5b60006135e7848285016135ae565b91505092915050565b6000806040838503121561360757613606613327565b5b60006136158582860161334d565b9250506020613626858286016135ae565b9150509250929050565b6000604082019050613645600083018561338f565b613652602083018461338f565b9392505050565b60006136648261351b565b9050919050565b61367481613659565b811461367f57600080fd5b50565b6000813590506136918161366b565b92915050565b6000602082840312156136ad576136ac613327565b5b60006136bb84828501613682565b91505092915050565b60006020820190506136d9600083018461349d565b92915050565b6136e881613474565b81146136f357600080fd5b50565b600081359050613705816136df565b92915050565b61371481613491565b811461371f57600080fd5b50565b6000813590506137318161370b565b92915050565b6000806000806080858703121561375157613750613327565b5b600061375f8782880161334d565b94505060206137708782880161334d565b9350506040613781878288016136f6565b925050606061379287828801613722565b91505092959194509250565b600080600080600060a086880312156137ba576137b9613327565b5b60006137c88882890161334d565b95505060206137d988828901613682565b94505060406137ea888289016136f6565b93505060606137fb88828901613722565b925050608061380c88828901613722565b9150509295509295909350565b60006020828403121561382f5761382e613327565b5b600061383d848285016136f6565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061388d602083613846565b915061389882613857565b602082019050919050565b600060208201905081810360008301526138bc81613880565b9050919050565b7f63616e6e6f74206368616e67652073746172742074696d65206966206661726d60008201527f2068617320616c72656164792073746172746564000000000000000000000000602082015250565b600061391f603483613846565b915061392a826138c3565b604082019050919050565b6000602082019050818103600083015261394e81613912565b9050919050565b7f63616e6e6f74207365742073746172742074696d6520696e207468652070617360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b1602183613846565b91506139bc82613955565b604082019050919050565b600060208201905081810360008301526139e0816139a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a508261332c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a8357613a82613a16565b5b600182019050919050565b7f456d697373696f6e20746f6f2068696768000000000000000000000000000000600082015250565b6000613ac4601183613846565b9150613acf82613a8e565b602082019050919050565b60006020820190508181036000830152613af381613ab7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b30601f83613846565b9150613b3b82613afa565b602082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b6000613b9c601283613846565b9150613ba782613b66565b602082019050919050565b60006020820190508181036000830152613bcb81613b8f565b9050919050565b600081519050613be181613336565b92915050565b600060208284031215613bfd57613bfc613327565b5b6000613c0b84828501613bd2565b91505092915050565b6000604082019050613c29600083018561352d565b613c36602083018461338f565b9392505050565b7f736574466565416464726573733a20464f5242494444454e0000000000000000600082015250565b6000613c73601883613846565b9150613c7e82613c3d565b602082019050919050565b60006020820190508181036000830152613ca281613c66565b9050919050565b7f216e6f6e7a65726f000000000000000000000000000000000000000000000000600082015250565b6000613cdf600883613846565b9150613cea82613ca9565b602082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f6465763a207775743f0000000000000000000000000000000000000000000000600082015250565b6000613d4b600983613846565b9150613d5682613d15565b602082019050919050565b60006020820190508181036000830152613d7a81613d3e565b9050919050565b7f7365743a20696e76616c6964206465706f73697420666565206261736973207060008201527f6f696e7473000000000000000000000000000000000000000000000000000000602082015250565b6000613ddd602583613846565b9150613de882613d81565b604082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b6000613e2e613e29613e2484613474565b6133d9565b61332c565b9050919050565b613e3e81613e13565b82525050565b6000606082019050613e59600083018661352d565b613e66602083018561338f565b613e736040830184613e35565b949350505050565b7f6e6f6e4475706c6963617465643a206475706c69636174656400000000000000600082015250565b6000613eb1601983613846565b9150613ebc82613e7b565b602082019050919050565b60006020820190508181036000830152613ee081613ea4565b9050919050565b7f6164643a20696e76616c6964206465706f73697420666565206261736973207060008201527f6f696e7473000000000000000000000000000000000000000000000000000000602082015250565b6000613f43602583613846565b9150613f4e82613ee7565b604082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b6000613f848261332c565b9150613f8f8361332c565b925082821015613fa257613fa1613a16565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614009602683613846565b915061401482613fad565b604082019050919050565b6000602082019050818103600083015261403881613ffc565b9050919050565b7f506f6f6c732061726520616c7265616479206578697374696e672e0000000000600082015250565b6000614075601b83613846565b91506140808261403f565b602082019050919050565b600060208201905081810360008301526140a481614068565b9050919050565b60006140b68261332c565b91506140c18361332c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140fa576140f9613a16565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061413f8261332c565b915061414a8361332c565b92508261415a57614159614105565b5b828204905092915050565b6000815190506141748161370b565b92915050565b6000602082840312156141905761418f613327565b5b600061419e84828501614165565b91505092915050565b7f73616665436f696e5472616e736665723a207472616e73666572206661696c6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614203602183613846565b915061420e826141a7565b604082019050919050565b60006020820190508181036000830152614232816141f6565b9050919050565b60006142448261332c565b915061424f8361332c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428457614283613a16565b5b828201905092915050565b60006060820190506142a4600083018661352d565b6142b1602083018561352d565b6142be604083018461338f565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614322602a83613846565b915061432d826142c6565b604082019050919050565b6000602082019050818103600083015261435181614315565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143b4602683613846565b91506143bf82614358565b604082019050919050565b600060208201905081810360008301526143e3816143a7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614420601d83613846565b915061442b826143ea565b602082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561448a57808201518184015260208101905061446f565b83811115614499576000848401525b50505050565b60006144aa82614456565b6144b48185614461565b93506144c481856020860161446c565b80840191505092915050565b60006144dc828461449f565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061450e826144e7565b6145188185613846565b935061452881856020860161446c565b614531816144f2565b840191505092915050565b600060208201905081810360008301526145568184614503565b90509291505056fea2646970667358221220191c54fa2ed2a66e27e1655e6b85a575bb5e68a1808e80f55f519cd75ff5574d64736f6c634300080a0033000000000000000000000000b4559681514867b6db1e7e805118cfad16949d370000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec903070000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec90307000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000621ba000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638705fcd411610104578063d49e77cd116100a2578063e9a52b6711610071578063e9a52b67146104d5578063ecb1ab5414610505578063f2fde38b14610521578063f70a29a01461053d576101cf565b8063d49e77cd14610463578063d963842214610481578063dc9464b91461049d578063e2bbb158146104b9576101cf565b806393f1a40b116100de57806393f1a40b146103c85780639e1d12ab146103f9578063cbd258b514610417578063d0d41fe114610447576101cf565b80638705fcd41461035e5780638da5cb5b1461037a5780638dbb1e3a14610398576101cf565b8063436cc3d6116101715780635312ea8e1161014b5780635312ea8e14610310578063630b5ba11461032c578063715018a61461033657806378e9792514610340576101cf565b8063436cc3d6146102ba578063441a3e70146102d857806351eb05a6146102f4576101cf565b806311df9995116101ad57806311df99951461022a5780631526fe271461024857806317caf6f11461027e578063412753581461029c576101cf565b806306bcf02f146101d4578063081e3eda146101f05780630ba84cd21461020e575b600080fd5b6101ee60048036038101906101e99190613362565b610559565b005b6101f86106f6565b604051610205919061339e565b60405180910390f35b61022860048036038101906102239190613362565b610703565b005b61023261082a565b60405161023f9190613438565b60405180910390f35b610262600480360381019061025d9190613362565b61084e565b60405161027597969594939291906134ac565b60405180910390f35b6102866108db565b604051610293919061339e565b60405180910390f35b6102a46108e1565b6040516102b1919061353c565b60405180910390f35b6102c2610907565b6040516102cf919061339e565b60405180910390f35b6102f260048036038101906102ed9190613557565b610913565b005b61030e60048036038101906103099190613362565b610bbf565b005b61032a60048036038101906103259190613362565b611157565b005b610334611321565b005b61033e611354565b005b6103486113dc565b604051610355919061339e565b60405180910390f35b610378600480360381019061037391906135c3565b6113e2565b005b610382611580565b60405161038f919061353c565b60405180910390f35b6103b260048036038101906103ad9190613557565b6115a9565b6040516103bf919061339e565b60405180910390f35b6103e260048036038101906103dd91906135f0565b6115c6565b6040516103f0929190613630565b60405180910390f35b6104016115f7565b60405161040e919061339e565b60405180910390f35b610431600480360381019061042c9190613697565b6115fd565b60405161043e91906136c4565b60405180910390f35b610461600480360381019061045c91906135c3565b61161d565b005b61046b6117bb565b604051610478919061353c565b60405180910390f35b61049b60048036038101906104969190613737565b6117e1565b005b6104b760048036038101906104b2919061379e565b6119f8565b005b6104d360048036038101906104ce9190613557565b611deb565b005b6104ef60048036038101906104ea91906135f0565b6122ef565b6040516104fc919061339e565b60405180910390f35b61051f600480360381019061051a9190613819565b612726565b005b61053b600480360381019061053691906135c3565b61293f565b005b610557600480360381019061055291906135c3565b612a37565b005b610561612c43565b73ffffffffffffffffffffffffffffffffffffffff1661057f611580565b73ffffffffffffffffffffffffffffffffffffffff16146105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc906138a3565b60405180910390fd5b6008544210610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061090613935565b60405180910390fd5b80421061065b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610652906139c7565b60405180910390fd5b6000600580549050905060005b818110156106b157600060058281548110610686576106856139e7565b5b9060005260206000209060070201905083816002018190555050806106aa90613a45565b9050610668565b50816008819055507fa09018266c541576eb124551c9c57c82a8129add3ba6777a5974b1d0e6252e996008546040516106ea919061339e565b60405180910390a15050565b6000600580549050905090565b61070b612c43565b73ffffffffffffffffffffffffffffffffffffffff16610729611580565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610776906138a3565b60405180910390fd5b678ac7230489e800008111156107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190613ada565b60405180910390fd5b6107d2611321565b806003819055503373ffffffffffffffffffffffffffffffffffffffff167fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c40538260405161081f919061339e565b60405180910390a250565b7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3781565b6005818154811061085e57600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16908060050154908060060160009054906101000a900460ff16905087565b60075481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b678ac7230489e8000081565b60026001541415610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090613b46565b60405180910390fd5b6002600181905550600060058381548110610977576109766139e7565b5b9060005260206000209060070201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1990613bb2565b60405180910390fd5b610a2b84610bbf565b6000610a788260010154610a6a670de0b6b3a7640000610a5c87600301548760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b90506000811115610a8e57610a8d3382612c8d565b5b6000841115610b2557610aae848360000154612c7790919063ffffffff16565b8260000181905550610b0533858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b610b1c848460050154612c7790919063ffffffff16565b83600501819055505b610b5a670de0b6b3a7640000610b4c85600301548560000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610ba9919061339e565b60405180910390a3505050600180819055505050565b600060058281548110610bd557610bd46139e7565b5b9060005260206000209060070201905080600201544211610bf65750611154565b600081600501541480610c0d575060008160010154145b15610c215742816002018190555050611154565b6000610c318260020154426115a9565b90506000610c74600754610c668560010154610c5860035487612c4b90919063ffffffff16565b612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506000610c8c600a83612c6190919063ffffffff16565b90506000610d4383610d35847f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d279190613be7565b612f4790919063ffffffff16565b612f4790919063ffffffff16565b90507f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd49190613be7565b8111610f2e577f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166340c10f19600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e4d600a87612c6190919063ffffffff16565b6040518363ffffffff1660e01b8152600401610e6a929190613c14565b600060405180830381600087803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b505050507f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff1660e01b8152600401610ef7929190613c14565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b505050506110ed565b61105d7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc09190613be7565b7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104f9190613be7565b612c7790919063ffffffff16565b92507f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff1660e01b81526004016110ba929190613c14565b600060405180830381600087803b1580156110d457600080fd5b505af11580156110e8573d6000803e3d6000fd5b505050505b600083146111455761113c611129866005015461111b670de0b6b3a764000087612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8660030154612f4790919063ffffffff16565b85600301819055505b42856002018190555050505050505b50565b6002600154141561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490613b46565b60405180910390fd5b60026001819055506000600582815481106111bb576111ba6139e7565b5b9060005260206000209060070201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555061128b33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b808360050154106112ba576112ad818460050154612c7790919063ffffffff16565b83600501819055506112c5565b600083600501819055505b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958360405161130c919061339e565b60405180910390a35050506001808190555050565b6000600580549050905060005b818110156113505761133f81610bbf565b8061134990613a45565b905061132e565b5050565b61135c612c43565b73ffffffffffffffffffffffffffffffffffffffff1661137a611580565b73ffffffffffffffffffffffffffffffffffffffff16146113d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c7906138a3565b60405180910390fd5b6113da6000612f5d565b565b60085481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613c89565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613cf5565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f760405160405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006115be8383612c7790919063ffffffff16565b905092915050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60035481565b60096020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613cf5565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490613d61565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e760405160405180910390a350565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117e9612c43565b73ffffffffffffffffffffffffffffffffffffffff16611807611580565b73ffffffffffffffffffffffffffffffffffffffff161461185d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611854906138a3565b60405180910390fd5b6101908261ffff1611156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613df3565b60405180910390fd5b80156118b5576118b4611321565b5b611901836118f3600587815481106118d0576118cf6139e7565b5b906000526020600020906007020160010154600754612c7790919063ffffffff16565b612f4790919063ffffffff16565b600781905550826005858154811061191c5761191b6139e7565b5b9060005260206000209060070201600101819055508160058581548110611946576119456139e7565b5b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff160217905550837f39f0c3d078af018954b4fa56832a05a2b511afaa999b133ea3f1c487c21ed287600586815481106119a7576119a66139e7565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856040516119ea93929190613e44565b60405180910390a250505050565b611a00612c43565b73ffffffffffffffffffffffffffffffffffffffff16611a1e611580565b73ffffffffffffffffffffffffffffffffffffffff1614611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906138a3565b60405180910390fd5b8360001515600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613ec7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b41919061353c565b602060405180830381865afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613be7565b506101908461ffff161115611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390613f59565b60405180910390fd5b8115611bdb57611bda611321565b5b60006008544211611bee57600854611bf0565b425b9050611c0787600754612f4790919063ffffffff16565b6007819055506001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056040518060e001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff16815260200160008152602001861515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555060a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050506001600580549050611da79190613f79565b7faa6642278d4bbef86d8990c37355d5d4dfe365c194106bdf7a65162268606f07878988604051611dda93929190613e44565b60405180910390a250505050505050565b60026001541415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613b46565b60405180910390fd5b6002600181905550600060058381548110611e4f57611e4e6139e7565b5b9060005260206000209060070201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611ebc84610bbf565b600081600001541115611f2e576000611f168260010154611f08670de0b6b3a7640000611efa87600301548760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b90506000811115611f2c57611f2b3382612c8d565b5b505b60008311156122565760008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f96919061353c565b602060405180830381865afa158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190613be7565b905061202a3330868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613021909392919063ffffffff16565b6120da818460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161208b919061353c565b602060405180830381865afa1580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc9190613be7565b612c7790919063ffffffff16565b935060008360040160009054906101000a900461ffff1661ffff16111561221557600061213a61271061212c8660040160009054906101000a900461ffff1661ffff1688612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506121ad600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612ec19092919063ffffffff16565b6121d6816121c8878660000154612f4790919063ffffffff16565b612c7790919063ffffffff16565b8360000181905550612207816121f9878760050154612f4790919063ffffffff16565b612c7790919063ffffffff16565b846005018190555050612254565b61222c848360000154612f4790919063ffffffff16565b826000018190555061224b848460050154612f4790919063ffffffff16565b83600501819055505b505b61228b670de0b6b3a764000061227d84600301548460000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516122da919061339e565b60405180910390a35050600180819055505050565b60008060058481548110612306576123056139e7565b5b9060005260206000209060070201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905082600201544211801561238b57506000836005015414155b801561239957506000600754115b156126d45760006123ae8460020154426115a9565b905060006123f16007546123e387600101546123d560035487612c4b90919063ffffffff16565b612c4b90919063ffffffff16565b612c6190919063ffffffff16565b90506000612409600a83612c6190919063ffffffff16565b905060006124c0836124b2847f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a49190613be7565b612f4790919063ffffffff16565b612f4790919063ffffffff16565b90507f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125519190613be7565b81111561268a576126877f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190613be7565b7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015612655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126799190613be7565b612c7790919063ffffffff16565b92505b6126cd6126be88600501546126b0670de0b6b3a764000087612c4b90919063ffffffff16565b612c6190919063ffffffff16565b86612f4790919063ffffffff16565b9450505050505b61271b826001015461270d670de0b6b3a76400006126ff858760000154612c4b90919063ffffffff16565b612c6190919063ffffffff16565b612c7790919063ffffffff16565b935050505092915050565b61272e612c43565b73ffffffffffffffffffffffffffffffffffffffff1661274c611580565b73ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906138a3565b60405180910390fd5b6101908161ffff1611156127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613df3565b60405180910390fd5b60005b60058054905081101561293b576000151560058281548110612813576128126139e7565b5b906000526020600020906007020160060160009054906101000a900460ff161515141561292a5761284381610bbf565b8160058281548110612858576128576139e7565b5b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff160217905550807f39f0c3d078af018954b4fa56832a05a2b511afaa999b133ea3f1c487c21ed287600583815481106128b9576128b86139e7565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600584815481106128ff576128fe6139e7565b5b9060005260206000209060070201600101548560405161292193929190613e44565b60405180910390a25b8061293490613a45565b90506127ee565b5050565b612947612c43565b73ffffffffffffffffffffffffffffffffffffffff16612965611580565b73ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b2906138a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061401f565b60405180910390fd5b612a3481612f5d565b50565b612a3f612c43565b73ffffffffffffffffffffffffffffffffffffffff16612a5d611580565b73ffffffffffffffffffffffffffffffffffffffff1614612ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaa906138a3565b60405180910390fd5b600060058054905014612afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af29061408b565b60405180910390fd5b612b0c6096826000600160006119f8565b612b3d608c7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d376000600160006119f8565b612b6260197321be370d5312f44cb42ce377bc9b8a0cef1a4c836101906000806119f8565b612b8760147374b23882a30290451a17c44f4f05243b6b58c76d6101906000806119f8565b612bac601473321162cd933e2be498cd2267a90534a804051b116101906000806119f8565b612bd160147304068da6c83afcfa0e13ba15a6696662335d5b756101906000806119f8565b612bf6601473049d68029688eabf473097a2fc38ef61633a3c7a6101906000806119f8565b612c1b6014738d11ec38a3eb5e956b052f67da8bdc9bef8abf3e6101906000806119f8565b612c40600573841fad6eae12c286d1fd18d1d525dffa75c7effe6101906000806119f8565b50565b600033905090565b60008183612c5991906140ab565b905092915050565b60008183612c6f9190614134565b905092915050565b60008183612c859190613f79565b905092915050565b60007f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612ce8919061353c565b602060405180830381865afa158015612d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d299190613be7565b9050600081831115612dda577f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401612d90929190613c14565b6020604051808303816000875af1158015612daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd3919061417a565b9050612e7b565b7f000000000000000000000000b4559681514867b6db1e7e805118cfad16949d3773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401612e35929190613c14565b6020604051808303816000875af1158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e78919061417a565b90505b80612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb290614219565b60405180910390fd5b50505050565b612f428363a9059cbb60e01b8484604051602401612ee0929190613c14565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130aa565b505050565b60008183612f559190614239565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130a4846323b872dd60e01b8585856040516024016130429392919061428f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130aa565b50505050565b600061310c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131719092919063ffffffff16565b905060008151111561316c578080602001905181019061312c919061417a565b61316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316290614338565b60405180910390fd5b5b505050565b60606131808484600085613189565b90509392505050565b6060824710156131ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c5906143ca565b60405180910390fd5b6131d78561329d565b613216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320d90614436565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161323f91906144d0565b60006040518083038185875af1925050503d806000811461327c576040519150601f19603f3d011682016040523d82523d6000602084013e613281565b606091505b50915091506132918282866132c0565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156132d057829050613320565b6000835111156132e35782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613317919061453c565b60405180910390fd5b9392505050565b600080fd5b6000819050919050565b61333f8161332c565b811461334a57600080fd5b50565b60008135905061335c81613336565b92915050565b60006020828403121561337857613377613327565b5b60006133868482850161334d565b91505092915050565b6133988161332c565b82525050565b60006020820190506133b3600083018461338f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006133fe6133f96133f4846133b9565b6133d9565b6133b9565b9050919050565b6000613410826133e3565b9050919050565b600061342282613405565b9050919050565b61343281613417565b82525050565b600060208201905061344d6000830184613429565b92915050565b600061345e82613405565b9050919050565b61346e81613453565b82525050565b600061ffff82169050919050565b61348b81613474565b82525050565b60008115159050919050565b6134a681613491565b82525050565b600060e0820190506134c1600083018a613465565b6134ce602083018961338f565b6134db604083018861338f565b6134e8606083018761338f565b6134f56080830186613482565b61350260a083018561338f565b61350f60c083018461349d565b98975050505050505050565b6000613526826133b9565b9050919050565b6135368161351b565b82525050565b6000602082019050613551600083018461352d565b92915050565b6000806040838503121561356e5761356d613327565b5b600061357c8582860161334d565b925050602061358d8582860161334d565b9150509250929050565b6135a08161351b565b81146135ab57600080fd5b50565b6000813590506135bd81613597565b92915050565b6000602082840312156135d9576135d8613327565b5b60006135e7848285016135ae565b91505092915050565b6000806040838503121561360757613606613327565b5b60006136158582860161334d565b9250506020613626858286016135ae565b9150509250929050565b6000604082019050613645600083018561338f565b613652602083018461338f565b9392505050565b60006136648261351b565b9050919050565b61367481613659565b811461367f57600080fd5b50565b6000813590506136918161366b565b92915050565b6000602082840312156136ad576136ac613327565b5b60006136bb84828501613682565b91505092915050565b60006020820190506136d9600083018461349d565b92915050565b6136e881613474565b81146136f357600080fd5b50565b600081359050613705816136df565b92915050565b61371481613491565b811461371f57600080fd5b50565b6000813590506137318161370b565b92915050565b6000806000806080858703121561375157613750613327565b5b600061375f8782880161334d565b94505060206137708782880161334d565b9350506040613781878288016136f6565b925050606061379287828801613722565b91505092959194509250565b600080600080600060a086880312156137ba576137b9613327565b5b60006137c88882890161334d565b95505060206137d988828901613682565b94505060406137ea888289016136f6565b93505060606137fb88828901613722565b925050608061380c88828901613722565b9150509295509295909350565b60006020828403121561382f5761382e613327565b5b600061383d848285016136f6565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061388d602083613846565b915061389882613857565b602082019050919050565b600060208201905081810360008301526138bc81613880565b9050919050565b7f63616e6e6f74206368616e67652073746172742074696d65206966206661726d60008201527f2068617320616c72656164792073746172746564000000000000000000000000602082015250565b600061391f603483613846565b915061392a826138c3565b604082019050919050565b6000602082019050818103600083015261394e81613912565b9050919050565b7f63616e6e6f74207365742073746172742074696d6520696e207468652070617360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b1602183613846565b91506139bc82613955565b604082019050919050565b600060208201905081810360008301526139e0816139a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a508261332c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a8357613a82613a16565b5b600182019050919050565b7f456d697373696f6e20746f6f2068696768000000000000000000000000000000600082015250565b6000613ac4601183613846565b9150613acf82613a8e565b602082019050919050565b60006020820190508181036000830152613af381613ab7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b30601f83613846565b9150613b3b82613afa565b602082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b6000613b9c601283613846565b9150613ba782613b66565b602082019050919050565b60006020820190508181036000830152613bcb81613b8f565b9050919050565b600081519050613be181613336565b92915050565b600060208284031215613bfd57613bfc613327565b5b6000613c0b84828501613bd2565b91505092915050565b6000604082019050613c29600083018561352d565b613c36602083018461338f565b9392505050565b7f736574466565416464726573733a20464f5242494444454e0000000000000000600082015250565b6000613c73601883613846565b9150613c7e82613c3d565b602082019050919050565b60006020820190508181036000830152613ca281613c66565b9050919050565b7f216e6f6e7a65726f000000000000000000000000000000000000000000000000600082015250565b6000613cdf600883613846565b9150613cea82613ca9565b602082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f6465763a207775743f0000000000000000000000000000000000000000000000600082015250565b6000613d4b600983613846565b9150613d5682613d15565b602082019050919050565b60006020820190508181036000830152613d7a81613d3e565b9050919050565b7f7365743a20696e76616c6964206465706f73697420666565206261736973207060008201527f6f696e7473000000000000000000000000000000000000000000000000000000602082015250565b6000613ddd602583613846565b9150613de882613d81565b604082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b6000613e2e613e29613e2484613474565b6133d9565b61332c565b9050919050565b613e3e81613e13565b82525050565b6000606082019050613e59600083018661352d565b613e66602083018561338f565b613e736040830184613e35565b949350505050565b7f6e6f6e4475706c6963617465643a206475706c69636174656400000000000000600082015250565b6000613eb1601983613846565b9150613ebc82613e7b565b602082019050919050565b60006020820190508181036000830152613ee081613ea4565b9050919050565b7f6164643a20696e76616c6964206465706f73697420666565206261736973207060008201527f6f696e7473000000000000000000000000000000000000000000000000000000602082015250565b6000613f43602583613846565b9150613f4e82613ee7565b604082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b6000613f848261332c565b9150613f8f8361332c565b925082821015613fa257613fa1613a16565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614009602683613846565b915061401482613fad565b604082019050919050565b6000602082019050818103600083015261403881613ffc565b9050919050565b7f506f6f6c732061726520616c7265616479206578697374696e672e0000000000600082015250565b6000614075601b83613846565b91506140808261403f565b602082019050919050565b600060208201905081810360008301526140a481614068565b9050919050565b60006140b68261332c565b91506140c18361332c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140fa576140f9613a16565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061413f8261332c565b915061414a8361332c565b92508261415a57614159614105565b5b828204905092915050565b6000815190506141748161370b565b92915050565b6000602082840312156141905761418f613327565b5b600061419e84828501614165565b91505092915050565b7f73616665436f696e5472616e736665723a207472616e73666572206661696c6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614203602183613846565b915061420e826141a7565b604082019050919050565b60006020820190508181036000830152614232816141f6565b9050919050565b60006142448261332c565b915061424f8361332c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428457614283613a16565b5b828201905092915050565b60006060820190506142a4600083018661352d565b6142b1602083018561352d565b6142be604083018461338f565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614322602a83613846565b915061432d826142c6565b604082019050919050565b6000602082019050818103600083015261435181614315565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143b4602683613846565b91506143bf82614358565b604082019050919050565b600060208201905081810360008301526143e3816143a7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614420601d83613846565b915061442b826143ea565b602082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561448a57808201518184015260208101905061446f565b83811115614499576000848401525b50505050565b60006144aa82614456565b6144b48185614461565b93506144c481856020860161446c565b80840191505092915050565b60006144dc828461449f565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061450e826144e7565b6145188185613846565b935061452881856020860161446c565b614531816144f2565b840191505092915050565b600060208201905081810360008301526145568184614503565b90509291505056fea2646970667358221220191c54fa2ed2a66e27e1655e6b85a575bb5e68a1808e80f55f519cd75ff5574d64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b4559681514867b6db1e7e805118cfad16949d370000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec903070000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec90307000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000621ba000
-----Decoded View---------------
Arg [0] : _coin (address): 0xB4559681514867B6Db1e7e805118Cfad16949D37
Arg [1] : _devaddr (address): 0x9Bd84A1e5d71403b877913f163B0fB05AEc90307
Arg [2] : _feeAddress (address): 0x9Bd84A1e5d71403b877913f163B0fB05AEc90307
Arg [3] : _CoinPerSecond (uint256): 40000000000000000
Arg [4] : _startTime (uint256): 1645977600
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4559681514867b6db1e7e805118cfad16949d37
Arg [1] : 0000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec90307
Arg [2] : 0000000000000000000000009bd84a1e5d71403b877913f163b0fb05aec90307
Arg [3] : 000000000000000000000000000000000000000000000000008e1bc9bf040000
Arg [4] : 00000000000000000000000000000000000000000000000000000000621ba000
Deployed Bytecode Sourcemap
48692:15583:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63640:632;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51422:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63305:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49521:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49862:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;50103:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49715:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49774:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60596:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57494:1474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61505:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57238:180;;;:::i;:::-;;47809:103;;;:::i;:::-;;50197:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62895:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47158:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55664:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49944:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;49652:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51525:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62641:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49583:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53076:685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51792:1172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59037:1507;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55880:1275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55010:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48067:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53852:1089;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63640:632;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63758:9:::1;;63740:15;:27;63718:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;63898:13;63880:15;:31;63858:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;63983:14;64000:8;:15;;;;63983:32;;64031:11;64026:159;64054:6;64048:3;:12;64026:159;;;64084:21;64108:8;64117:3;64108:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64084:37;;64160:13;64136:4;:21;;:37;;;;64069:116;64062:5;;;;:::i;:::-;;;64026:159;;;;64207:13;64195:9;:25;;;;64238:26;64254:9;;64238:26;;;;;;:::i;:::-;;;;;;;;63707:565;63640:632:::0;:::o;51422:95::-;51467:7;51494:8;:15;;;;51487:22;;51422:95;:::o;63305:286::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49818:8:::1;63395:14;:35;;63387:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63463:17;:15;:17::i;:::-;63507:14;63491:13;:30;;;;63556:10;63537:46;;;63568:14;63537:46;;;;;;:::i;:::-;;;;;;;;63305:286:::0;:::o;49521:34::-;;;:::o;49862:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50103:34::-;;;;:::o;49715:25::-;;;;;;;;;;;;;:::o;49774:52::-;49818:8;49774:52;:::o;60596:838::-;24949:1;25547:7;;:19;;25539:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24949:1;25680:7;:18;;;;60678:21:::1;60702:8;60711:4;60702:14;;;;;;;;:::i;:::-;;;;;;;;;;;;60678:38;;60727:21;60751:8;:14;60760:4;60751:14;;;;;;;;;;;:26;60766:10;60751:26;;;;;;;;;;;;;;;60727:50;;60811:7;60796:4;:11;;;:22;;60788:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60852:16;60863:4;60852:10;:16::i;:::-;60879:15;60897:92;60963:4;:15;;;60897:47;60939:4;60897:37;60913:4;:20;;;60897:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;:51;;:92;;;;:::i;:::-;60879:110;;61014:1;61004:7;:11;61000:81;;;61032:37;61049:10;61061:7;61032:16;:37::i;:::-;61000:81;61105:1;61095:7;:11;61091:209;;;61137:24;61153:7;61137:4;:11;;;:15;;:24;;;;:::i;:::-;61123:4;:11;;:38;;;;61176:55;61210:10;61223:7;61176:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;61262:26;61280:7;61262:4;:13;;;:17;;:26;;;;:::i;:::-;61246:4;:13;;:42;;;;61091:209;61328:47;61370:4;61328:37;61344:4;:20;;;61328:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;61310:4;:15;;:65;;;;61412:4;61400:10;61391:35;;;61418:7;61391:35;;;;;;:::i;:::-;;;;;;;;60667:767;;;24905:1:::0;25859:7;:22;;;;60596:838;;:::o;57494:1474::-;57546:21;57570:8;57579:4;57570:14;;;;;;;;:::i;:::-;;;;;;;;;;;;57546:38;;57618:4;:21;;;57599:15;:40;57595:79;;57656:7;;;57595:79;57705:1;57688:4;:13;;;:18;:42;;;;57729:1;57710:4;:15;;;:20;57688:42;57684:135;;;57771:15;57747:4;:21;;:39;;;;57801:7;;;57684:135;57829:18;57850:90;57878:4;:21;;;57914:15;57850:13;:90::i;:::-;57829:111;;57951:18;57972:113;58069:15;;57972:78;58034:4;:15;;;57972:43;58001:13;;57972:10;:28;;:43;;;;:::i;:::-;:61;;:78;;;;:::i;:::-;:96;;:113;;;;:::i;:::-;57951:134;;58098:17;58118:18;58133:2;58118:10;:14;;:18;;;;:::i;:::-;58098:38;;58147:20;58170:73;58222:10;58170:33;58193:9;58170:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;:33;;;;:::i;:::-;:37;;:73;;;;:::i;:::-;58147:96;;58276:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58260:12;:32;58256:408;;58360:4;:9;;;58370:7;;;;;;;;;;;58379:18;58394:2;58379:10;:14;;:18;;;;:::i;:::-;58360:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58413:4;:9;;;58431:4;58438:10;58413:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58256:408;;;58561:40;58582:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58561:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:20;;:40;;;;:::i;:::-;58548:53;;58616:4;:9;;;58634:4;58641:10;58616:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58256:408;58694:1;58680:10;:15;58676:233;;58800:97;58843:39;58868:4;:13;;;58843:20;58858:4;58843:10;:14;;:20;;;;:::i;:::-;:24;;:39;;;;:::i;:::-;58800:4;:20;;;:24;;:97;;;;:::i;:::-;58777:4;:20;;:120;;;;58676:233;58945:15;58921:4;:21;;:39;;;;57535:1433;;;;;57494:1474;;:::o;61505:561::-;24949:1;25547:7;;:19;;25539:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24949:1;25680:7;:18;;;;61579:21:::1;61603:8;61612:4;61603:14;;;;;;;;:::i;:::-;;;;;;;;;;;;61579:38;;61628:21;61652:8;:14;61661:4;61652:14;;;;;;;;;;;:26;61667:10;61652:26;;;;;;;;;;;;;;;61628:50;;61689:14;61706:4;:11;;;61689:28;;61742:1;61728:4;:11;;:15;;;;61772:1;61754:4;:15;;:19;;;;61784:54;61818:10;61831:6;61784:4;:12;;;;;;;;;;;;:25;;;;:54;;;;;:::i;:::-;61872:6;61855:4;:13;;;:23;61851:147;;61911:25;61929:6;61911:4;:13;;;:17;;:25;;;;:::i;:::-;61895:4;:13;;:41;;;;61851:147;;;61985:1;61969:4;:13;;:17;;;;61851:147;62045:4;62033:10;62015:43;;;62051:6;62015:43;;;;;;:::i;:::-;;;;;;;;61568:498;;;24905:1:::0;25859:7;:22;;;;61505:561;:::o;57238:180::-;57283:14;57300:8;:15;;;;57283:32;;57331:11;57326:85;57354:6;57348:3;:12;57326:85;;;57384:15;57395:3;57384:10;:15::i;:::-;57362:5;;;;:::i;:::-;;;57326:85;;;;57272:146;57238:180::o;47809:103::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47874:30:::1;47901:1;47874:18;:30::i;:::-;47809:103::o:0;50197:24::-;;;;:::o;62895:279::-;62981:10;;;;;;;;;;;62967:24;;:10;:24;;;62959:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63062:1;63039:25;;:11;:25;;;;63031:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63101:11;63088:10;;:24;;;;;;;;;;;;;;;;;;63154:11;63128:38;;63142:10;63128:38;;;;;;;;;;;;62895:279;:::o;47158:87::-;47204:7;47231:6;;;;;;;;;;;47224:13;;47158:87;:::o;55664:153::-;55763:7;55795:14;55803:5;55795:3;:7;;:14;;;;:::i;:::-;55788:21;;55664:153;;;;:::o;49944:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49652:28::-;;;;:::o;51525:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;62641:246::-;62730:1;62710:22;;:8;:22;;;;62702:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;62778:7;;;;;;;;;;;62764:21;;:10;:21;;;62756:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;62820:8;62810:7;;:18;;;;;;;;;;;;;;;;;;62870:8;62844:35;;62858:10;62844:35;;;;;;;;;;;;62641:246;:::o;49583:22::-;;;;;;;;;;;;;:::o;53076:685::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53262:3:::1;53245:13;:20;;;;53237:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53322:11;53318:61;;;53350:17;:15;:17::i;:::-;53318:61;53407:87;53472:11;53407:46;53427:8;53436:4;53427:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;53407:15;;:19;;:46;;;;:::i;:::-;:50;;:87;;;;:::i;:::-;53389:15;:105;;;;53533:11;53505:8;53514:4;53505:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;:39;;;;53585:13;53555:8;53564:4;53555:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;53638:4;53616:137;53665:8;53674:4;53665:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:22;;;;;;;;;;;;53703:11;53729:13;53616:137;;;;;;;;:::i;:::-;;;;;;;;53076:685:::0;;;;:::o;51792:1172::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51982:8:::1;51662:5;51635:32;;:13;:23;51649:8;51635:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;51627:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52033:8:::2;:18;;;52060:4;52033:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52104:3;52087:13;:20;;;;52079:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52164:11;52160:61;;;52192:17;:15;:17::i;:::-;52160:61;52231:24;52276:9;;52258:15;:27;:83;;52332:9;;52258:83;;;52301:15;52258:83;52231:110;;52370:32;52390:11;52370:15;;:19;;:32;;;;:::i;:::-;52352:15;:50;;;;52439:4;52413:13;:23;52427:8;52413:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;52454:8;52482:307;;;;;;;;52519:8;52482:307;;;;;;52558:11;52482:307;;;;52606:16;52482:307;;;;52658:1;52482:307;;;;52692:13;52482:307;;;;;;52734:1;52482:307;;;;52764:9;52482:307;;;;::::0;52454:346:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52858:1;52840:8;:15;;;;:19;;;;:::i;:::-;52818:138;52882:8;52906:11;52932:13;52818:138;;;;;;;;:::i;:::-;;;;;;;;51992:972;47449:1:::1;51792:1172:::0;;;;;:::o;59037:1507::-;24949:1;25547:7;;:19;;25539:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24949:1;25680:7;:18;;;;59118:21:::1;59142:8;59151:4;59142:14;;;;;;;;:::i;:::-;;;;;;;;;;;;59118:38;;59167:21;59191:8;:14;59200:4;59191:14;;;;;;;;;;;:26;59206:10;59191:26;;;;;;;;;;;;;;;59167:50;;59228:16;59239:4;59228:10;:16::i;:::-;59273:1;59259:4;:11;;;:15;59255:309;;;59291:15;59309:140;59433:4;:15;;;59309:101;59405:4;59309:73;59361:4;:20;;;59309:4;:29;;;:51;;:73;;;;:::i;:::-;:95;;:101;;;;:::i;:::-;:123;;:140;;;;:::i;:::-;59291:158;;59478:1;59468:7;:11;59464:89;;;59500:37;59517:10;59529:7;59500:16;:37::i;:::-;59464:89;59276:288;59255:309;59588:1;59578:7;:11;59574:837;;;59606:21;59630:4;:12;;;;;;;;;;;;:22;;;59661:4;59630:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59606:61;;59682:140;59738:10;59776:4;59800:7;59682:4;:12;;;;;;;;;;;;:29;;;;:140;;;;;;:::i;:::-;59847:56;59889:13;59847:4;:12;;;;;;;;;;;;:22;;;59878:4;59847:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:56;;;;:::i;:::-;59837:66;;59942:1;59922:4;:17;;;;;;;;;;;;:21;;;59918:482;;;59964:18;59985:41;60020:5;59985:30;59997:4;:17;;;;;;;;;;;;59985:30;;:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;59964:62;;60045:49;60071:10;;;;;;;;;;;60083;60045:4;:12;;;;;;;;;;;;:25;;;;:49;;;;;:::i;:::-;60127:40;60156:10;60127:24;60143:7;60127:4;:11;;;:15;;:24;;;;:::i;:::-;:28;;:40;;;;:::i;:::-;60113:4;:11;;:54;;;;60202:42;60233:10;60202:26;60220:7;60202:4;:13;;;:17;;:26;;;;:::i;:::-;:30;;:42;;;;:::i;:::-;60186:4;:13;;:58;;;;59945:315;59918:482;;;60299:24;60315:7;60299:4;:11;;;:15;;:24;;;;:::i;:::-;60285:4;:11;;:38;;;;60358:26;60376:7;60358:4;:13;;;:17;;:26;;;;:::i;:::-;60342:4;:13;;:42;;;;59918:482;59591:820;59574:837;60439:47;60481:4;60439:37;60455:4;:20;;;60439:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;60421:4;:15;;:65;;;;60522:4;60510:10;60502:34;;;60528:7;60502:34;;;;;;:::i;:::-;;;;;;;;59107:1437;;24905:1:::0;25859:7;:22;;;;59037:1507;;:::o;55880:1275::-;55981:7;56006:21;56030:8;56039:4;56030:14;;;;;;;;:::i;:::-;;;;;;;;;;;;56006:38;;56055:21;56079:8;:14;56088:4;56079:14;;;;;;;;;;;:21;56094:5;56079:21;;;;;;;;;;;;;;;56055:45;;56111:23;56137:4;:20;;;56111:46;;56204:4;:21;;;56186:15;:39;:74;;;;;56259:1;56242:4;:13;;;:18;;56186:74;:110;;;;;56295:1;56277:15;;:19;56186:110;56168:899;;;56323:18;56344:102;56376:4;:21;;;56416:15;56344:13;:102::i;:::-;56323:123;;56461:18;56482:125;56591:15;;56482:86;56552:4;:15;;;56482:47;56515:13;;56482:10;:32;;:47;;;;:::i;:::-;:69;;:86;;;;:::i;:::-;:108;;:125;;;;:::i;:::-;56461:146;;56626:17;56646:18;56661:2;56646:10;:14;;:18;;;;:::i;:::-;56626:38;;56683:20;56706:81;56762:10;56706:33;56729:9;56706:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;:33;;;;:::i;:::-;:37;;:81;;;;:::i;:::-;56683:104;;56825:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56810:12;:31;56806:125;;;56875:40;56896:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56875:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:20;;:40;;;;:::i;:::-;56862:53;;56806:125;56963:92;57001:39;57026:4;:13;;;57001:20;57016:4;57001:10;:14;;:20;;;;:::i;:::-;:24;;:39;;;;:::i;:::-;56963:15;:19;;:92;;;;:::i;:::-;56945:110;;56308:759;;;;56168:899;57084:63;57131:4;:15;;;57084:42;57121:4;57084:32;57100:15;57084:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;57077:70;;;;;55880:1275;;;;:::o;55010:578::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55128:3:::1;55105:19;:26;;;;55097:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55191:11;55186:395;55214:8;:15;;;;55208:3;:21;55186:395;;;55297:5;55271:31;;:8;55280:3;55271:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:22;;;;;;;;;;;;:31;;;55267:303;;;55323:15;55334:3;55323:10;:15::i;:::-;55386:19;55357:8;55366:3;55357:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;;:48;;;;;;;;;;;;;;;;;;55456:3;55448:91;55469:8;55478:3;55469:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;;;;;;;;;;55493:8;55502:3;55493:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;55519:19;55448:91;;;;;;;;:::i;:::-;;;;;;;;55267:303;55231:5;;;;:::i;:::-;;;55186:395;;;;55010:578:::0;:::o;48067:201::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48176:1:::1;48156:22;;:8;:22;;;;48148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48232:28;48251:8;48232:18;:28::i;:::-;48067:201:::0;:::o;53852:1089::-;47389:12;:10;:12::i;:::-;47378:23;;:7;:5;:7::i;:::-;:23;;;47370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53953:1:::1;53934:8;:15;;;;:20;53926:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53999:43;54003:3;54015:9;54027:1;54030:4;54036:5;53999:3;:43::i;:::-;54103:38;54107:3;54119:4;54126:1;54129:4;54135:5;54103:3;:38::i;:::-;54204:78;54208:2;54219:42;54264:3;54269:5;54276::::0;54204:3:::1;:78::i;:::-;54310;54314:2;54325:42;54370:3;54375:5;54382::::0;54310:3:::1;:78::i;:::-;54416;54420:2;54431:42;54476:3;54481:5;54488::::0;54416:3:::1;:78::i;:::-;54522;54526:2;54537:42;54582:3;54587:5;54594::::0;54522:3:::1;:78::i;:::-;54628;54632:2;54643:42;54688:3;54693:5;54700::::0;54628:3:::1;:78::i;:::-;54734;54738:2;54749:42;54794:3;54799:5;54806::::0;54734:3:::1;:78::i;:::-;54839:77;54843:1;54853:42;54898:3;54903:5;54910::::0;54839:3:::1;:77::i;:::-;53852:1089:::0;:::o;26575:98::-;26628:7;26655:10;26648:17;;26575:98;:::o;19710:::-;19768:7;19799:1;19795;:5;;;;:::i;:::-;19788:12;;19710:98;;;;:::o;20109:::-;20167:7;20198:1;20194;:5;;;;:::i;:::-;20187:12;;20109:98;;;;:::o;19353:::-;19411:7;19442:1;19438;:5;;;;:::i;:::-;19431:12;;19353:98;;;;:::o;62180:425::-;62256:15;62274:4;:14;;;62297:4;62274:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62256:47;;62314:20;62367:7;62357;:17;62353:173;;;62409:4;:13;;;62423:3;62428:7;62409:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62391:45;;62353:173;;;62487:4;:13;;;62501:3;62506:7;62487:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62469:45;;62353:173;62544:15;62536:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62245:360;;62180:425;;:::o;12814:211::-;12931:86;12951:5;12981:23;;;13006:2;13010:5;12958:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12931:19;:86::i;:::-;12814:211;;;:::o;18972:98::-;19030:7;19061:1;19057;:5;;;;:::i;:::-;19050:12;;18972:98;;;;:::o;48428:191::-;48502:16;48521:6;;;;;;;;;;;48502:25;;48547:8;48538:6;;:17;;;;;;;;;;;;;;;;;;48602:8;48571:40;;48592:8;48571:40;;;;;;;;;;;;48491:128;48428:191;:::o;13033:248::-;13177:96;13197:5;13227:27;;;13256:4;13262:2;13266:5;13204:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13177:19;:96::i;:::-;13033:248;;;;:::o;15387:716::-;15811:23;15837:69;15865:4;15837:69;;;;;;;;;;;;;;;;;15845:5;15837:27;;;;:69;;;;;:::i;:::-;15811:95;;15941:1;15921:10;:17;:21;15917:179;;;16018:10;16007:30;;;;;;;;;;;;:::i;:::-;15999:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;15917:179;15457:646;15387:716;;:::o;3978:229::-;4115:12;4147:52;4169:6;4177:4;4183:1;4186:12;4147:21;:52::i;:::-;4140:59;;3978:229;;;;;:::o;5098:510::-;5268:12;5326:5;5301:21;:30;;5293:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5393:18;5404:6;5393:10;:18::i;:::-;5385:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5459:12;5473:23;5500:6;:11;;5519:5;5526:4;5500:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5458:73;;;;5549:51;5566:7;5575:10;5587:12;5549:16;:51::i;:::-;5542:58;;;;5098:510;;;;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;7784:712::-;7934:12;7963:7;7959:530;;;7994:10;7987:17;;;;7959:530;8128:1;8108:10;:17;:21;8104:374;;;8306:10;8300:17;8367:15;8354:10;8350:2;8346:19;8339:44;8104:374;8449:12;8442:20;;;;;;;;;;;:::i;:::-;;;;;;;;7784:712;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:147::-;1926:9;1959:37;1990:5;1959:37;:::i;:::-;1946:50;;1855:147;;;:::o;2008:173::-;2116:58;2168:5;2116:58;:::i;:::-;2111:3;2104:71;2008:173;;:::o;2187:264::-;2301:4;2339:2;2328:9;2324:18;2316:26;;2352:92;2441:1;2430:9;2426:17;2417:6;2352:92;:::i;:::-;2187:264;;;;:::o;2457:140::-;2521:9;2554:37;2585:5;2554:37;:::i;:::-;2541:50;;2457:140;;;:::o;2603:159::-;2704:51;2749:5;2704:51;:::i;:::-;2699:3;2692:64;2603:159;;:::o;2768:89::-;2804:7;2844:6;2837:5;2833:18;2822:29;;2768:89;;;:::o;2863:115::-;2948:23;2965:5;2948:23;:::i;:::-;2943:3;2936:36;2863:115;;:::o;2984:90::-;3018:7;3061:5;3054:13;3047:21;3036:32;;2984:90;;;:::o;3080:109::-;3161:21;3176:5;3161:21;:::i;:::-;3156:3;3149:34;3080:109;;:::o;3195:898::-;3462:4;3500:3;3489:9;3485:19;3477:27;;3514:85;3596:1;3585:9;3581:17;3572:6;3514:85;:::i;:::-;3609:72;3677:2;3666:9;3662:18;3653:6;3609:72;:::i;:::-;3691;3759:2;3748:9;3744:18;3735:6;3691:72;:::i;:::-;3773;3841:2;3830:9;3826:18;3817:6;3773:72;:::i;:::-;3855:71;3921:3;3910:9;3906:19;3897:6;3855:71;:::i;:::-;3936:73;4004:3;3993:9;3989:19;3980:6;3936:73;:::i;:::-;4019:67;4081:3;4070:9;4066:19;4057:6;4019:67;:::i;:::-;3195:898;;;;;;;;;;:::o;4099:96::-;4136:7;4165:24;4183:5;4165:24;:::i;:::-;4154:35;;4099:96;;;:::o;4201:118::-;4288:24;4306:5;4288:24;:::i;:::-;4283:3;4276:37;4201:118;;:::o;4325:222::-;4418:4;4456:2;4445:9;4441:18;4433:26;;4469:71;4537:1;4526:9;4522:17;4513:6;4469:71;:::i;:::-;4325:222;;;;:::o;4553:474::-;4621:6;4629;4678:2;4666:9;4657:7;4653:23;4649:32;4646:119;;;4684:79;;:::i;:::-;4646:119;4804:1;4829:53;4874:7;4865:6;4854:9;4850:22;4829:53;:::i;:::-;4819:63;;4775:117;4931:2;4957:53;5002:7;4993:6;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4902:118;4553:474;;;;;:::o;5033:122::-;5106:24;5124:5;5106:24;:::i;:::-;5099:5;5096:35;5086:63;;5145:1;5142;5135:12;5086:63;5033:122;:::o;5161:139::-;5207:5;5245:6;5232:20;5223:29;;5261:33;5288:5;5261:33;:::i;:::-;5161:139;;;;:::o;5306:329::-;5365:6;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5306:329;;;;:::o;5641:474::-;5709:6;5717;5766:2;5754:9;5745:7;5741:23;5737:32;5734:119;;;5772:79;;:::i;:::-;5734:119;5892:1;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5863:117;6019:2;6045:53;6090:7;6081:6;6070:9;6066:22;6045:53;:::i;:::-;6035:63;;5990:118;5641:474;;;;;:::o;6121:332::-;6242:4;6280:2;6269:9;6265:18;6257:26;;6293:71;6361:1;6350:9;6346:17;6337:6;6293:71;:::i;:::-;6374:72;6442:2;6431:9;6427:18;6418:6;6374:72;:::i;:::-;6121:332;;;;;:::o;6459:110::-;6510:7;6539:24;6557:5;6539:24;:::i;:::-;6528:35;;6459:110;;;:::o;6575:150::-;6662:38;6694:5;6662:38;:::i;:::-;6655:5;6652:49;6642:77;;6715:1;6712;6705:12;6642:77;6575:150;:::o;6731:167::-;6791:5;6829:6;6816:20;6807:29;;6845:47;6886:5;6845:47;:::i;:::-;6731:167;;;;:::o;6904:357::-;6977:6;7026:2;7014:9;7005:7;7001:23;6997:32;6994:119;;;7032:79;;:::i;:::-;6994:119;7152:1;7177:67;7236:7;7227:6;7216:9;7212:22;7177:67;:::i;:::-;7167:77;;7123:131;6904:357;;;;:::o;7267:210::-;7354:4;7392:2;7381:9;7377:18;7369:26;;7405:65;7467:1;7456:9;7452:17;7443:6;7405:65;:::i;:::-;7267:210;;;;:::o;7483:120::-;7555:23;7572:5;7555:23;:::i;:::-;7548:5;7545:34;7535:62;;7593:1;7590;7583:12;7535:62;7483:120;:::o;7609:137::-;7654:5;7692:6;7679:20;7670:29;;7708:32;7734:5;7708:32;:::i;:::-;7609:137;;;;:::o;7752:116::-;7822:21;7837:5;7822:21;:::i;:::-;7815:5;7812:32;7802:60;;7858:1;7855;7848:12;7802:60;7752:116;:::o;7874:133::-;7917:5;7955:6;7942:20;7933:29;;7971:30;7995:5;7971:30;:::i;:::-;7874:133;;;;:::o;8013:757::-;8095:6;8103;8111;8119;8168:3;8156:9;8147:7;8143:23;8139:33;8136:120;;;8175:79;;:::i;:::-;8136:120;8295:1;8320:53;8365:7;8356:6;8345:9;8341:22;8320:53;:::i;:::-;8310:63;;8266:117;8422:2;8448:53;8493:7;8484:6;8473:9;8469:22;8448:53;:::i;:::-;8438:63;;8393:118;8550:2;8576:52;8620:7;8611:6;8600:9;8596:22;8576:52;:::i;:::-;8566:62;;8521:117;8677:2;8703:50;8745:7;8736:6;8725:9;8721:22;8703:50;:::i;:::-;8693:60;;8648:115;8013:757;;;;;;;:::o;8776:925::-;8878:6;8886;8894;8902;8910;8959:3;8947:9;8938:7;8934:23;8930:33;8927:120;;;8966:79;;:::i;:::-;8927:120;9086:1;9111:53;9156:7;9147:6;9136:9;9132:22;9111:53;:::i;:::-;9101:63;;9057:117;9213:2;9239:67;9298:7;9289:6;9278:9;9274:22;9239:67;:::i;:::-;9229:77;;9184:132;9355:2;9381:52;9425:7;9416:6;9405:9;9401:22;9381:52;:::i;:::-;9371:62;;9326:117;9482:2;9508:50;9550:7;9541:6;9530:9;9526:22;9508:50;:::i;:::-;9498:60;;9453:115;9607:3;9634:50;9676:7;9667:6;9656:9;9652:22;9634:50;:::i;:::-;9624:60;;9578:116;8776:925;;;;;;;;:::o;9707:327::-;9765:6;9814:2;9802:9;9793:7;9789:23;9785:32;9782:119;;;9820:79;;:::i;:::-;9782:119;9940:1;9965:52;10009:7;10000:6;9989:9;9985:22;9965:52;:::i;:::-;9955:62;;9911:116;9707:327;;;;:::o;10040:169::-;10124:11;10158:6;10153:3;10146:19;10198:4;10193:3;10189:14;10174:29;;10040:169;;;;:::o;10215:182::-;10355:34;10351:1;10343:6;10339:14;10332:58;10215:182;:::o;10403:366::-;10545:3;10566:67;10630:2;10625:3;10566:67;:::i;:::-;10559:74;;10642:93;10731:3;10642:93;:::i;:::-;10760:2;10755:3;10751:12;10744:19;;10403:366;;;:::o;10775:419::-;10941:4;10979:2;10968:9;10964:18;10956:26;;11028:9;11022:4;11018:20;11014:1;11003:9;10999:17;10992:47;11056:131;11182:4;11056:131;:::i;:::-;11048:139;;10775:419;;;:::o;11200:239::-;11340:34;11336:1;11328:6;11324:14;11317:58;11409:22;11404:2;11396:6;11392:15;11385:47;11200:239;:::o;11445:366::-;11587:3;11608:67;11672:2;11667:3;11608:67;:::i;:::-;11601:74;;11684:93;11773:3;11684:93;:::i;:::-;11802:2;11797:3;11793:12;11786:19;;11445:366;;;:::o;11817:419::-;11983:4;12021:2;12010:9;12006:18;11998:26;;12070:9;12064:4;12060:20;12056:1;12045:9;12041:17;12034:47;12098:131;12224:4;12098:131;:::i;:::-;12090:139;;11817:419;;;:::o;12242:220::-;12382:34;12378:1;12370:6;12366:14;12359:58;12451:3;12446:2;12438:6;12434:15;12427:28;12242:220;:::o;12468:366::-;12610:3;12631:67;12695:2;12690:3;12631:67;:::i;:::-;12624:74;;12707:93;12796:3;12707:93;:::i;:::-;12825:2;12820:3;12816:12;12809:19;;12468:366;;;:::o;12840:419::-;13006:4;13044:2;13033:9;13029:18;13021:26;;13093:9;13087:4;13083:20;13079:1;13068:9;13064:17;13057:47;13121:131;13247:4;13121:131;:::i;:::-;13113:139;;12840:419;;;:::o;13265:180::-;13313:77;13310:1;13303:88;13410:4;13407:1;13400:15;13434:4;13431:1;13424:15;13451:180;13499:77;13496:1;13489:88;13596:4;13593:1;13586:15;13620:4;13617:1;13610:15;13637:233;13676:3;13699:24;13717:5;13699:24;:::i;:::-;13690:33;;13745:66;13738:5;13735:77;13732:103;;;13815:18;;:::i;:::-;13732:103;13862:1;13855:5;13851:13;13844:20;;13637:233;;;:::o;13876:167::-;14016:19;14012:1;14004:6;14000:14;13993:43;13876:167;:::o;14049:366::-;14191:3;14212:67;14276:2;14271:3;14212:67;:::i;:::-;14205:74;;14288:93;14377:3;14288:93;:::i;:::-;14406:2;14401:3;14397:12;14390:19;;14049:366;;;:::o;14421:419::-;14587:4;14625:2;14614:9;14610:18;14602:26;;14674:9;14668:4;14664:20;14660:1;14649:9;14645:17;14638:47;14702:131;14828:4;14702:131;:::i;:::-;14694:139;;14421:419;;;:::o;14846:181::-;14986:33;14982:1;14974:6;14970:14;14963:57;14846:181;:::o;15033:366::-;15175:3;15196:67;15260:2;15255:3;15196:67;:::i;:::-;15189:74;;15272:93;15361:3;15272:93;:::i;:::-;15390:2;15385:3;15381:12;15374:19;;15033:366;;;:::o;15405:419::-;15571:4;15609:2;15598:9;15594:18;15586:26;;15658:9;15652:4;15648:20;15644:1;15633:9;15629:17;15622:47;15686:131;15812:4;15686:131;:::i;:::-;15678:139;;15405:419;;;:::o;15830:168::-;15970:20;15966:1;15958:6;15954:14;15947:44;15830:168;:::o;16004:366::-;16146:3;16167:67;16231:2;16226:3;16167:67;:::i;:::-;16160:74;;16243:93;16332:3;16243:93;:::i;:::-;16361:2;16356:3;16352:12;16345:19;;16004:366;;;:::o;16376:419::-;16542:4;16580:2;16569:9;16565:18;16557:26;;16629:9;16623:4;16619:20;16615:1;16604:9;16600:17;16593:47;16657:131;16783:4;16657:131;:::i;:::-;16649:139;;16376:419;;;:::o;16801:143::-;16858:5;16889:6;16883:13;16874:22;;16905:33;16932:5;16905:33;:::i;:::-;16801:143;;;;:::o;16950:351::-;17020:6;17069:2;17057:9;17048:7;17044:23;17040:32;17037:119;;;17075:79;;:::i;:::-;17037:119;17195:1;17220:64;17276:7;17267:6;17256:9;17252:22;17220:64;:::i;:::-;17210:74;;17166:128;16950:351;;;;:::o;17307:332::-;17428:4;17466:2;17455:9;17451:18;17443:26;;17479:71;17547:1;17536:9;17532:17;17523:6;17479:71;:::i;:::-;17560:72;17628:2;17617:9;17613:18;17604:6;17560:72;:::i;:::-;17307:332;;;;;:::o;17645:174::-;17785:26;17781:1;17773:6;17769:14;17762:50;17645:174;:::o;17825:366::-;17967:3;17988:67;18052:2;18047:3;17988:67;:::i;:::-;17981:74;;18064:93;18153:3;18064:93;:::i;:::-;18182:2;18177:3;18173:12;18166:19;;17825:366;;;:::o;18197:419::-;18363:4;18401:2;18390:9;18386:18;18378:26;;18450:9;18444:4;18440:20;18436:1;18425:9;18421:17;18414:47;18478:131;18604:4;18478:131;:::i;:::-;18470:139;;18197:419;;;:::o;18622:158::-;18762:10;18758:1;18750:6;18746:14;18739:34;18622:158;:::o;18786:365::-;18928:3;18949:66;19013:1;19008:3;18949:66;:::i;:::-;18942:73;;19024:93;19113:3;19024:93;:::i;:::-;19142:2;19137:3;19133:12;19126:19;;18786:365;;;:::o;19157:419::-;19323:4;19361:2;19350:9;19346:18;19338:26;;19410:9;19404:4;19400:20;19396:1;19385:9;19381:17;19374:47;19438:131;19564:4;19438:131;:::i;:::-;19430:139;;19157:419;;;:::o;19582:159::-;19722:11;19718:1;19710:6;19706:14;19699:35;19582:159;:::o;19747:365::-;19889:3;19910:66;19974:1;19969:3;19910:66;:::i;:::-;19903:73;;19985:93;20074:3;19985:93;:::i;:::-;20103:2;20098:3;20094:12;20087:19;;19747:365;;;:::o;20118:419::-;20284:4;20322:2;20311:9;20307:18;20299:26;;20371:9;20365:4;20361:20;20357:1;20346:9;20342:17;20335:47;20399:131;20525:4;20399:131;:::i;:::-;20391:139;;20118:419;;;:::o;20543:224::-;20683:34;20679:1;20671:6;20667:14;20660:58;20752:7;20747:2;20739:6;20735:15;20728:32;20543:224;:::o;20773:366::-;20915:3;20936:67;21000:2;20995:3;20936:67;:::i;:::-;20929:74;;21012:93;21101:3;21012:93;:::i;:::-;21130:2;21125:3;21121:12;21114:19;;20773:366;;;:::o;21145:419::-;21311:4;21349:2;21338:9;21334:18;21326:26;;21398:9;21392:4;21388:20;21384:1;21373:9;21369:17;21362:47;21426:131;21552:4;21426:131;:::i;:::-;21418:139;;21145:419;;;:::o;21570:140::-;21619:9;21652:52;21670:33;21679:23;21696:5;21679:23;:::i;:::-;21670:33;:::i;:::-;21652:52;:::i;:::-;21639:65;;21570:140;;;:::o;21716:129::-;21802:36;21832:5;21802:36;:::i;:::-;21797:3;21790:49;21716:129;;:::o;21851:440::-;21999:4;22037:2;22026:9;22022:18;22014:26;;22050:71;22118:1;22107:9;22103:17;22094:6;22050:71;:::i;:::-;22131:72;22199:2;22188:9;22184:18;22175:6;22131:72;:::i;:::-;22213:71;22280:2;22269:9;22265:18;22256:6;22213:71;:::i;:::-;21851:440;;;;;;:::o;22297:175::-;22437:27;22433:1;22425:6;22421:14;22414:51;22297:175;:::o;22478:366::-;22620:3;22641:67;22705:2;22700:3;22641:67;:::i;:::-;22634:74;;22717:93;22806:3;22717:93;:::i;:::-;22835:2;22830:3;22826:12;22819:19;;22478:366;;;:::o;22850:419::-;23016:4;23054:2;23043:9;23039:18;23031:26;;23103:9;23097:4;23093:20;23089:1;23078:9;23074:17;23067:47;23131:131;23257:4;23131:131;:::i;:::-;23123:139;;22850:419;;;:::o;23275:224::-;23415:34;23411:1;23403:6;23399:14;23392:58;23484:7;23479:2;23471:6;23467:15;23460:32;23275:224;:::o;23505:366::-;23647:3;23668:67;23732:2;23727:3;23668:67;:::i;:::-;23661:74;;23744:93;23833:3;23744:93;:::i;:::-;23862:2;23857:3;23853:12;23846:19;;23505:366;;;:::o;23877:419::-;24043:4;24081:2;24070:9;24066:18;24058:26;;24130:9;24124:4;24120:20;24116:1;24105:9;24101:17;24094:47;24158:131;24284:4;24158:131;:::i;:::-;24150:139;;23877:419;;;:::o;24302:191::-;24342:4;24362:20;24380:1;24362:20;:::i;:::-;24357:25;;24396:20;24414:1;24396:20;:::i;:::-;24391:25;;24435:1;24432;24429:8;24426:34;;;24440:18;;:::i;:::-;24426:34;24485:1;24482;24478:9;24470:17;;24302:191;;;;:::o;24499:225::-;24639:34;24635:1;24627:6;24623:14;24616:58;24708:8;24703:2;24695:6;24691:15;24684:33;24499:225;:::o;24730:366::-;24872:3;24893:67;24957:2;24952:3;24893:67;:::i;:::-;24886:74;;24969:93;25058:3;24969:93;:::i;:::-;25087:2;25082:3;25078:12;25071:19;;24730:366;;;:::o;25102:419::-;25268:4;25306:2;25295:9;25291:18;25283:26;;25355:9;25349:4;25345:20;25341:1;25330:9;25326:17;25319:47;25383:131;25509:4;25383:131;:::i;:::-;25375:139;;25102:419;;;:::o;25527:177::-;25667:29;25663:1;25655:6;25651:14;25644:53;25527:177;:::o;25710:366::-;25852:3;25873:67;25937:2;25932:3;25873:67;:::i;:::-;25866:74;;25949:93;26038:3;25949:93;:::i;:::-;26067:2;26062:3;26058:12;26051:19;;25710:366;;;:::o;26082:419::-;26248:4;26286:2;26275:9;26271:18;26263:26;;26335:9;26329:4;26325:20;26321:1;26310:9;26306:17;26299:47;26363:131;26489:4;26363:131;:::i;:::-;26355:139;;26082:419;;;:::o;26507:348::-;26547:7;26570:20;26588:1;26570:20;:::i;:::-;26565:25;;26604:20;26622:1;26604:20;:::i;:::-;26599:25;;26792:1;26724:66;26720:74;26717:1;26714:81;26709:1;26702:9;26695:17;26691:105;26688:131;;;26799:18;;:::i;:::-;26688:131;26847:1;26844;26840:9;26829:20;;26507:348;;;;:::o;26861:180::-;26909:77;26906:1;26899:88;27006:4;27003:1;26996:15;27030:4;27027:1;27020:15;27047:185;27087:1;27104:20;27122:1;27104:20;:::i;:::-;27099:25;;27138:20;27156:1;27138:20;:::i;:::-;27133:25;;27177:1;27167:35;;27182:18;;:::i;:::-;27167:35;27224:1;27221;27217:9;27212:14;;27047:185;;;;:::o;27238:137::-;27292:5;27323:6;27317:13;27308:22;;27339:30;27363:5;27339:30;:::i;:::-;27238:137;;;;:::o;27381:345::-;27448:6;27497:2;27485:9;27476:7;27472:23;27468:32;27465:119;;;27503:79;;:::i;:::-;27465:119;27623:1;27648:61;27701:7;27692:6;27681:9;27677:22;27648:61;:::i;:::-;27638:71;;27594:125;27381:345;;;;:::o;27732:220::-;27872:34;27868:1;27860:6;27856:14;27849:58;27941:3;27936:2;27928:6;27924:15;27917:28;27732:220;:::o;27958:366::-;28100:3;28121:67;28185:2;28180:3;28121:67;:::i;:::-;28114:74;;28197:93;28286:3;28197:93;:::i;:::-;28315:2;28310:3;28306:12;28299:19;;27958:366;;;:::o;28330:419::-;28496:4;28534:2;28523:9;28519:18;28511:26;;28583:9;28577:4;28573:20;28569:1;28558:9;28554:17;28547:47;28611:131;28737:4;28611:131;:::i;:::-;28603:139;;28330:419;;;:::o;28755:305::-;28795:3;28814:20;28832:1;28814:20;:::i;:::-;28809:25;;28848:20;28866:1;28848:20;:::i;:::-;28843:25;;29002:1;28934:66;28930:74;28927:1;28924:81;28921:107;;;29008:18;;:::i;:::-;28921:107;29052:1;29049;29045:9;29038:16;;28755:305;;;;:::o;29066:442::-;29215:4;29253:2;29242:9;29238:18;29230:26;;29266:71;29334:1;29323:9;29319:17;29310:6;29266:71;:::i;:::-;29347:72;29415:2;29404:9;29400:18;29391:6;29347:72;:::i;:::-;29429;29497:2;29486:9;29482:18;29473:6;29429:72;:::i;:::-;29066:442;;;;;;:::o;29514:229::-;29654:34;29650:1;29642:6;29638:14;29631:58;29723:12;29718:2;29710:6;29706:15;29699:37;29514:229;:::o;29749:366::-;29891:3;29912:67;29976:2;29971:3;29912:67;:::i;:::-;29905:74;;29988:93;30077:3;29988:93;:::i;:::-;30106:2;30101:3;30097:12;30090:19;;29749:366;;;:::o;30121:419::-;30287:4;30325:2;30314:9;30310:18;30302:26;;30374:9;30368:4;30364:20;30360:1;30349:9;30345:17;30338:47;30402:131;30528:4;30402:131;:::i;:::-;30394:139;;30121:419;;;:::o;30546:225::-;30686:34;30682:1;30674:6;30670:14;30663:58;30755:8;30750:2;30742:6;30738:15;30731:33;30546:225;:::o;30777:366::-;30919:3;30940:67;31004:2;30999:3;30940:67;:::i;:::-;30933:74;;31016:93;31105:3;31016:93;:::i;:::-;31134:2;31129:3;31125:12;31118:19;;30777:366;;;:::o;31149:419::-;31315:4;31353:2;31342:9;31338:18;31330:26;;31402:9;31396:4;31392:20;31388:1;31377:9;31373:17;31366:47;31430:131;31556:4;31430:131;:::i;:::-;31422:139;;31149:419;;;:::o;31574:179::-;31714:31;31710:1;31702:6;31698:14;31691:55;31574:179;:::o;31759:366::-;31901:3;31922:67;31986:2;31981:3;31922:67;:::i;:::-;31915:74;;31998:93;32087:3;31998:93;:::i;:::-;32116:2;32111:3;32107:12;32100:19;;31759:366;;;:::o;32131:419::-;32297:4;32335:2;32324:9;32320:18;32312:26;;32384:9;32378:4;32374:20;32370:1;32359:9;32355:17;32348:47;32412:131;32538:4;32412:131;:::i;:::-;32404:139;;32131:419;;;:::o;32556:98::-;32607:6;32641:5;32635:12;32625:22;;32556:98;;;:::o;32660:147::-;32761:11;32798:3;32783:18;;32660:147;;;;:::o;32813:307::-;32881:1;32891:113;32905:6;32902:1;32899:13;32891:113;;;32990:1;32985:3;32981:11;32975:18;32971:1;32966:3;32962:11;32955:39;32927:2;32924:1;32920:10;32915:15;;32891:113;;;33022:6;33019:1;33016:13;33013:101;;;33102:1;33093:6;33088:3;33084:16;33077:27;33013:101;32862:258;32813:307;;;:::o;33126:373::-;33230:3;33258:38;33290:5;33258:38;:::i;:::-;33312:88;33393:6;33388:3;33312:88;:::i;:::-;33305:95;;33409:52;33454:6;33449:3;33442:4;33435:5;33431:16;33409:52;:::i;:::-;33486:6;33481:3;33477:16;33470:23;;33234:265;33126:373;;;;:::o;33505:271::-;33635:3;33657:93;33746:3;33737:6;33657:93;:::i;:::-;33650:100;;33767:3;33760:10;;33505:271;;;;:::o;33782:99::-;33834:6;33868:5;33862:12;33852:22;;33782:99;;;:::o;33887:102::-;33928:6;33979:2;33975:7;33970:2;33963:5;33959:14;33955:28;33945:38;;33887:102;;;:::o;33995:364::-;34083:3;34111:39;34144:5;34111:39;:::i;:::-;34166:71;34230:6;34225:3;34166:71;:::i;:::-;34159:78;;34246:52;34291:6;34286:3;34279:4;34272:5;34268:16;34246:52;:::i;:::-;34323:29;34345:6;34323:29;:::i;:::-;34318:3;34314:39;34307:46;;34087:272;33995:364;;;;:::o;34365:313::-;34478:4;34516:2;34505:9;34501:18;34493:26;;34565:9;34559:4;34555:20;34551:1;34540:9;34536:17;34529:47;34593:78;34666:4;34657:6;34593:78;:::i;:::-;34585:86;;34365:313;;;;:::o
Swarm Source
ipfs://191c54fa2ed2a66e27e1655e6b85a575bb5e68a1808e80f55f519cd75ff5574d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.