More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x0baebd895c746ba06a2077ea17cd6b438d7197e2d521060629f90177156b8f0d | - | (pending) | 5 secs ago | IN | 0 POL | (Pending) | |||
Swap Exact EP Fo... | 65424603 | 27 mins ago | IN | 0 POL | 0.02381818 | ||||
Swap Exact EP Fo... | 65423756 | 58 mins ago | IN | 0 POL | 0.0288309 | ||||
Swap Exact EP Fo... | 65422913 | 1 hr ago | IN | 0 POL | 0.02665857 | ||||
Swap Exact EP Fo... | 65422080 | 1 hr ago | IN | 0 POL | 0.02605603 | ||||
Swap Exact EP Fo... | 65421233 | 2 hrs ago | IN | 0 POL | 0.02539635 | ||||
Swap Exact EP Fo... | 65419540 | 3 hrs ago | IN | 0 POL | 0.02823803 | ||||
Swap Exact EP Fo... | 65418694 | 3 hrs ago | IN | 0 POL | 0.03128399 | ||||
Swap Exact EP Fo... | 65417845 | 4 hrs ago | IN | 0 POL | 0.02851226 | ||||
Swap Exact EP Fo... | 65417001 | 4 hrs ago | IN | 0 POL | 0.02208823 | ||||
Swap Exact EP Fo... | 65416152 | 5 hrs ago | IN | 0 POL | 0.02420943 | ||||
Swap Exact EP Fo... | 65415309 | 5 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65414475 | 6 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65413654 | 6 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65412833 | 7 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65411996 | 7 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65411165 | 8 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65410337 | 8 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65409499 | 9 hrs ago | IN | 0 POL | 0.01729854 | ||||
Swap Exact EP Fo... | 65408651 | 9 hrs ago | IN | 0 POL | 0.01719364 | ||||
Swap Exact EP Fo... | 65407805 | 10 hrs ago | IN | 0 POL | 0.01719364 | ||||
Swap Exact EP Fo... | 65406978 | 10 hrs ago | IN | 0 POL | 0.01719364 | ||||
Swap Exact EP Fo... | 65406144 | 11 hrs ago | IN | 0 POL | 0.01719364 | ||||
Swap Exact EP Fo... | 65405297 | 11 hrs ago | IN | 0 POL | 0.01719364 | ||||
Swap Exact EP Fo... | 65404449 | 12 hrs ago | IN | 0 POL | 0.01729854 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FirePool
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2024-01-11 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction 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/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // 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/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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/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/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.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.openzeppelin.com/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, allowance(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 = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * 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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 Updates `owner` s allowance for `spender` based on spent `amount`. * * 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: contracts/FirePool.sol pragma solidity ^0.8.23; /* SPDX-License-Identifier: MIT ______ _ ____ _ | ____(_) | _ \ | | | |__ _ _ __ ___| |_) | ___ | |_ | __| | | '__/ _ \ _ < / _ \| __| | | | | | | __/ |_) | (_) | |_ |_| |_|_| \___|____/ \___/ \__| */ interface IEP is IERC20 { function claimRewards() external returns (uint256); function stakeEP(uint256 amountEP) external; function unstakeEP(uint256 amountEP) external; function userInfos(address account) external view returns (uint256 stakedEP, uint256 lastClaim, uint256 amountClaimed); function claimableRewards(address account) external view returns (uint256 totalRewards, uint256 teamRewards, uint256 userRewards); } interface IFIREFBX is IERC20 { function deposit(uint256 amountFBX) external returns (uint256 amountFireFBX); function withdraw(uint256 amountFireFBX) external returns (uint256 amountFBX); function withdrawalRate() external view returns (uint256); } contract FirePool is ERC20 { using SafeERC20 for IERC20; using SafeERC20 for IEP; IERC20 public constant FBX = IERC20(0xD125443F38A69d776177c2B9c041f462936F8218); IEP public constant EP = IEP(0x60Ed6aCEF3a96F8CDaF0c0D207BbAfA66e751af2); IFIREFBX public constant FIREFBX = IFIREFBX(0x960d43BE128585Ca45365CD74a7773B9d814dfBE); event AddLiquidity(address indexed account, uint256 amountInEP, uint256 amountInFBX, uint256 amountOutFPT, uint256 newPoolRate); event RemoveLiquidity(address indexed account, uint256 amountOutEP, uint256 amountOutFBX, uint256 amountInFPT, uint256 newPoolRate); event SwapExactFBXForEP(address indexed account, uint256 amountInFBX, uint256 amountOutEP, uint256 newPoolRate); event SwapExactEPForFBX(address indexed account, uint256 amountInEP, uint256 amountOutFBX, uint256 newPoolRate); constructor() ERC20("Fire Pool Token", "FPT") { _mint(msg.sender, 6 * 1e18 - 6 * 1e8); _mint(address(this), 6 * 1e8); // Then send 3 FBX and 0.01 EP to bootstrap the pool => 6 FPT = 3 FBX + 0.01 EP | 1 EP = 300 FBX | 1 FPT = 1 FBX } function reserveFBX() public view returns (uint256) { (,,uint256 rewards) = EP.claimableRewards(address(this)); return rewards + FBX.balanceOf(address(this)) + FIREFBX.balanceOf(address(this)) * FIREFBX.withdrawalRate() / 1e18; } function reserveEP() public view returns (uint256) { (uint256 stakedEP,,) = EP.userInfos(address(this)); return stakedEP + EP.balanceOf(address(this)); } function poolRate() public view returns (uint256) { return 1e18 * reserveFBX() / reserveEP(); } function claimRewards() public { EP.claimRewards(); } function stakePoolEP() public { uint256 balanceEP = EP.balanceOf(address(this)); if (balanceEP > 0) { EP.stakeEP(balanceEP); } } function depositPoolFBX() public { uint256 balanceFBX = FBX.balanceOf(address(this)); if (balanceFBX > 0) { FBX.approve(address(FIREFBX), balanceFBX); FIREFBX.deposit(balanceFBX); } } function addLiquidity(uint256 amountInEP, uint256 amountInFBX, uint256 minAmountOutFPT, uint256 deadline) external returns (uint256 amountOutFPT) { require(deadline >= block.timestamp, "Order expired"); uint256 poolShare = (1e18 * amountInEP / (reserveEP() + amountInEP) + 1e18 * amountInFBX / (reserveFBX() + amountInFBX)) / 2; amountOutFPT = poolShare * totalSupply() / (1e18 - poolShare); require(amountOutFPT >= minAmountOutFPT, "Slippage on FPT too low"); EP.safeTransferFrom(msg.sender, address(this), amountInEP); FBX.safeTransferFrom(msg.sender, address(this), amountInFBX); _mint(msg.sender, amountOutFPT); stakePoolEP(); depositPoolFBX(); emit AddLiquidity(msg.sender, amountInEP, amountInFBX, amountOutFPT, poolRate()); } function removeLiquidity(uint256 amountInFPT, uint256 minAmountOutEP, uint256 minAmountOutFBX, uint256 deadline) external returns (uint256 amountOutEP, uint256 amountOutFBX) { require(deadline >= block.timestamp, "Order expired"); amountOutEP = reserveEP() * amountInFPT / totalSupply(); require(amountOutEP >= minAmountOutEP, "Slippage on EP too low"); uint256 balanceEP = EP.balanceOf(address(this)); if (balanceEP < amountOutEP) { EP.unstakeEP(amountOutEP - balanceEP); } amountOutFBX = reserveFBX() * amountInFPT / totalSupply(); uint256 balanceFBX = FBX.balanceOf(address(this)); if (balanceFBX < amountOutFBX) { balanceFBX += FIREFBX.withdraw(1e18 * (amountOutFBX - balanceFBX) / FIREFBX.withdrawalRate()); if (balanceFBX < amountOutFBX) { amountOutFBX = balanceFBX; } } require(amountOutFBX >= minAmountOutFBX, "Slippage on FBX too low"); _burn(msg.sender, amountInFPT); EP.safeTransfer(msg.sender, amountOutEP); FBX.safeTransfer(msg.sender, amountOutFBX); stakePoolEP(); depositPoolFBX(); emit RemoveLiquidity(msg.sender, amountOutEP, amountOutFBX, amountInFPT, poolRate()); } function swapExactFBXForEP(uint256 amountInFBX, uint256 minAmountOutEP, uint256 deadline) external returns (uint256 amountOutEP) { require(deadline >= block.timestamp, "Order expired"); amountOutEP = amountInFBX * reserveEP() / (amountInFBX + reserveFBX()); require(amountOutEP >= minAmountOutEP, "Slippage on EP too low"); FBX.safeTransferFrom(msg.sender, address(this), amountInFBX); uint256 balanceEP = EP.balanceOf(address(this)); if (balanceEP < amountOutEP) { EP.unstakeEP(amountOutEP - balanceEP); } EP.safeTransfer(msg.sender, amountOutEP); stakePoolEP(); depositPoolFBX(); emit SwapExactFBXForEP(msg.sender, amountInFBX, amountOutEP, poolRate()); } function swapExactEPForFBX(uint256 amountInEP, uint256 minAmountOutFBX, uint256 deadline) external returns (uint256 amountOutFBX) { require(deadline >= block.timestamp, "Order expired"); amountOutFBX = amountInEP * reserveFBX() / (amountInEP + reserveEP()); EP.safeTransferFrom(msg.sender, address(this), amountInEP); stakePoolEP(); uint256 balanceFBX = FBX.balanceOf(address(this)); if (balanceFBX < amountOutFBX) { balanceFBX += FIREFBX.withdraw(1e18 * (amountOutFBX - balanceFBX) / FIREFBX.withdrawalRate()); if (balanceFBX < amountOutFBX) { amountOutFBX = balanceFBX; } } require(amountOutFBX >= minAmountOutFBX, "Slippage on FBX too low"); FBX.safeTransfer(msg.sender, amountOutFBX); depositPoolFBX(); emit SwapExactEPForFBX(msg.sender, amountInEP, amountOutFBX, poolRate()); } } // FirePool v1.8
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInEP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInFBX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutFPT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoolRate","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOutEP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutFBX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInFPT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoolRate","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInEP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutFBX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoolRate","type":"uint256"}],"name":"SwapExactEPForFBX","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInFBX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutEP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoolRate","type":"uint256"}],"name":"SwapExactFBXForEP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EP","outputs":[{"internalType":"contract IEP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBX","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIREFBX","outputs":[{"internalType":"contract IFIREFBX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInEP","type":"uint256"},{"internalType":"uint256","name":"amountInFBX","type":"uint256"},{"internalType":"uint256","name":"minAmountOutFPT","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountOutFPT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPoolFBX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInFPT","type":"uint256"},{"internalType":"uint256","name":"minAmountOutEP","type":"uint256"},{"internalType":"uint256","name":"minAmountOutFBX","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountOutEP","type":"uint256"},{"internalType":"uint256","name":"amountOutFBX","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveEP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveFBX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakePoolEP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInEP","type":"uint256"},{"internalType":"uint256","name":"minAmountOutFBX","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactEPForFBX","outputs":[{"internalType":"uint256","name":"amountOutFBX","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInFBX","type":"uint256"},{"internalType":"uint256","name":"minAmountOutEP","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactFBXForEP","outputs":[{"internalType":"uint256","name":"amountOutEP","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b506040518060400160405280600f81526020017f4669726520506f6f6c20546f6b656e00000000000000000000000000000000008152506040518060400160405280600381526020017f465054000000000000000000000000000000000000000000000000000000000081525081600390816200008e9190620004ac565b508060049081620000a09190620004ac565b505050620000bd336753444835c894ba00620000d960201b60201c565b620000d3306323c34600620000d960201b60201c565b620006a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200014a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014190620005ee565b60405180910390fd5b6200015d5f83836200023e60201b60201c565b8060025f8282546200017091906200063b565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200021f919062000686565b60405180910390a36200023a5f83836200024360201b60201c565b5050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620002c457607f821691505b602082108103620002da57620002d96200027f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200033e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000301565b6200034a868362000301565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003946200038e620003888462000362565b6200036b565b62000362565b9050919050565b5f819050919050565b620003af8362000374565b620003c7620003be826200039b565b8484546200030d565b825550505050565b5f90565b620003dd620003cf565b620003ea818484620003a4565b505050565b5b818110156200041157620004055f82620003d3565b600181019050620003f0565b5050565b601f82111562000460576200042a81620002e0565b6200043584620002f2565b8101602085101562000445578190505b6200045d6200045485620002f2565b830182620003ef565b50505b505050565b5f82821c905092915050565b5f620004825f198460080262000465565b1980831691505092915050565b5f6200049c838362000471565b9150826002028217905092915050565b620004b78262000248565b67ffffffffffffffff811115620004d357620004d262000252565b5b620004df8254620002ac565b620004ec82828562000415565b5f60209050601f83116001811462000522575f84156200050d578287015190505b6200051985826200048f565b86555062000588565b601f1984166200053286620002e0565b5f5b828110156200055b5784890151825560018201915060208501945060208101905062000534565b868310156200057b578489015162000577601f89168262000471565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f620005d6601f8362000590565b9150620005e382620005a0565b602082019050919050565b5f6020820190508181035f8301526200060781620005c8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620006478262000362565b9150620006548362000362565b92508282019050808211156200066f576200066e6200060e565b5b92915050565b620006808162000362565b82525050565b5f6020820190506200069b5f83018462000675565b92915050565b61393f80620006af5f395ff3fe608060405234801561000f575f80fd5b5060043610610156575f3560e01c806370a08231116100c1578063a9059cbb1161007a578063a9059cbb146103b8578063aebf3e41146103e8578063b10abe4414610418578063beba222b14610436578063dd62ed3e14610454578063f88bf15a1461048457610156565b806370a08231146102e057806385096edc146103105780638bf6f1101461032e5780638dce357d1461034c57806395d89b411461036a578063a457c2d71461038857610156565b8063372500ab11610113578063372500ab1461021e57806339509351146102285780633c90381414610258578063447989dc14610262578063649932dd1461028057806366457129146102b057610156565b806306fdde031461015a578063095ea7b31461017857806317f75c9b146101a857806318160ddd146101b257806323b872dd146101d0578063313ce56714610200575b5f80fd5b6101626104b5565b60405161016f91906128e5565b60405180910390f35b610192600480360381019061018d9190612996565b610545565b60405161019f91906129ee565b60405180910390f35b6101b0610567565b005b6101ba61067c565b6040516101c79190612a16565b60405180910390f35b6101ea60048036038101906101e59190612a2f565b610685565b6040516101f791906129ee565b60405180910390f35b6102086106b3565b6040516102159190612a9a565b60405180910390f35b6102266106bb565b005b610242600480360381019061023d9190612996565b610740565b60405161024f91906129ee565b60405180910390f35b610260610776565b005b61026a610943565b6040516102779190612b0e565b60405180910390f35b61029a60048036038101906102959190612b27565b61095b565b6040516102a79190612a16565b60405180910390f35b6102ca60048036038101906102c59190612b27565b610cec565b6040516102d79190612a16565b60405180910390f35b6102fa60048036038101906102f59190612b77565b610fb3565b6040516103079190612a16565b60405180910390f35b610318610ff8565b6040516103259190612a16565b60405180910390f35b61033661102b565b6040516103439190612a16565b60405180910390f35b61035461128e565b6040516103619190612a16565b60405180910390f35b6103726113bd565b60405161037f91906128e5565b60405180910390f35b6103a2600480360381019061039d9190612996565b61144d565b6040516103af91906129ee565b60405180910390f35b6103d260048036038101906103cd9190612996565b6114c2565b6040516103df91906129ee565b60405180910390f35b61040260048036038101906103fd9190612ba2565b6114e4565b60405161040f9190612a16565b60405180910390f35b610420611719565b60405161042d9190612c26565b60405180910390f35b61043e611731565b60405161044b9190612c5f565b60405180910390f35b61046e60048036038101906104699190612c78565b611749565b60405161047b9190612a16565b60405180910390f35b61049e60048036038101906104999190612ba2565b6117cb565b6040516104ac929190612cb6565b60405180910390f35b6060600380546104c490612d0a565b80601f01602080910402602001604051908101604052809291908181526020018280546104f090612d0a565b801561053b5780601f106105125761010080835404028352916020019161053b565b820191905f5260205f20905b81548152906001019060200180831161051e57829003601f168201915b5050505050905090565b5f8061054f611ce6565b905061055c818585611ced565b600191505092915050565b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105b59190612d49565b602060405180830381865afa1580156105d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f49190612d76565b90505f811115610679577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16630dd0b38c826040518263ffffffff1660e01b815260040161064b9190612a16565b5f604051808303815f87803b158015610662575f80fd5b505af1158015610674573d5f803e3d5ffd5b505050505b50565b5f600254905090565b5f8061068f611ce6565b905061069c858285611eb0565b6106a7858585611f3b565b60019150509392505050565b5f6012905090565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610719573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073d9190612d76565b50565b5f8061074a611ce6565b905061076b81858561075c8589611749565b6107669190612dce565b611ced565b600191505092915050565b5f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107c49190612d49565b602060405180830381865afa1580156107df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190612d76565b90505f8111156109405773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b373960d43be128585ca45365cd74a7773b9d814dfbe836040518363ffffffff1660e01b8152600401610870929190612e01565b6020604051808303815f875af115801561088c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b09190612e52565b5073960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b81526004016108fe9190612a16565b6020604051808303815f875af115801561091a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093e9190612d76565b505b50565b73960d43be128585ca45365cd74a7773b9d814dfbe81565b5f4282101561099f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099690612ec7565b60405180910390fd5b6109a761128e565b846109b29190612dce565b6109ba61102b565b856109c59190612ee5565b6109cf9190612f53565b9050610a123330867360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b610a1a610567565b5f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a689190612d49565b602060405180830381865afa158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190612d76565b905081811015610c015773960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190612d76565b8385610b6e9190612f83565b670de0b6b3a7640000610b819190612ee5565b610b8b9190612f53565b6040518263ffffffff1660e01b8152600401610ba79190612a16565b6020604051808303815f875af1158015610bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be79190612d76565b81610bf29190612dce565b905081811015610c00578091505b5b83821015610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90613000565b60405180910390fd5b610c83338373d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b610c8b610776565b3373ffffffffffffffffffffffffffffffffffffffff167f5e7f5411ff6af2491af6242f82e8c8954e3b9041ba793d1bc1dadbacf73cf8338684610ccd610ff8565b604051610cdc9392919061301e565b60405180910390a2509392505050565b5f42821015610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790612ec7565b60405180910390fd5b610d3861102b565b84610d439190612dce565b610d4b61128e565b85610d569190612ee5565b610d609190612f53565b905082811015610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c9061309d565b60405180910390fd5b610de633308673d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e349190612d49565b602060405180830381865afa158015610e4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e739190612d76565b905081811015610f03577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16639af5d0ab8284610eb99190612f83565b6040518263ffffffff1660e01b8152600401610ed59190612a16565b5f604051808303815f87803b158015610eec575f80fd5b505af1158015610efe573d5f803e3d5ffd5b505050505b610f4233837360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b610f4a610567565b610f52610776565b3373ffffffffffffffffffffffffffffffffffffffff167fd50bf5a2f80fc8a712120cb1a86e90034651fb452e72ee8bf726afeec20653588684610f94610ff8565b604051610fa39392919061301e565b60405180910390a2509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f61100161128e565b61100961102b565b670de0b6b3a764000061101c9190612ee5565b6110269190612f53565b905090565b5f807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663dc01f60d306040518263ffffffff1660e01b815260040161107a9190612d49565b606060405180830381865afa158015611095573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b991906130bb565b92505050670de0b6b3a764000073960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611123573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111479190612d76565b73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111949190612d49565b602060405180830381865afa1580156111af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d39190612d76565b6111dd9190612ee5565b6111e79190612f53565b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112349190612d49565b602060405180830381865afa15801561124f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112739190612d76565b8261127e9190612dce565b6112889190612dce565b91505090565b5f807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166343b0215f306040518263ffffffff1660e01b81526004016112dd9190612d49565b606060405180830381865afa1580156112f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131c91906130bb565b505090507360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161136d9190612d49565b602060405180830381865afa158015611388573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ac9190612d76565b816113b79190612dce565b91505090565b6060600480546113cc90612d0a565b80601f01602080910402602001604051908101604052809291908181526020018280546113f890612d0a565b80156114435780601f1061141a57610100808354040283529160200191611443565b820191905f5260205f20905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b5f80611457611ce6565b90505f6114648286611749565b9050838110156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a09061317b565b60405180910390fd5b6114b68286868403611ced565b60019250505092915050565b5f806114cc611ce6565b90506114d9818585611f3b565b600191505092915050565b5f42821015611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90612ec7565b60405180910390fd5b5f60028561153461102b565b61153e9190612dce565b86670de0b6b3a76400006115529190612ee5565b61155c9190612f53565b8761156561128e565b61156f9190612dce565b88670de0b6b3a76400006115839190612ee5565b61158d9190612f53565b6115979190612dce565b6115a19190612f53565b905080670de0b6b3a76400006115b79190612f83565b6115bf61067c565b826115ca9190612ee5565b6115d49190612f53565b915083821015611619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611610906131e3565b60405180910390fd5b61165a3330887360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b61169b33308773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b6116a533836122b6565b6116ad610567565b6116b5610776565b3373ffffffffffffffffffffffffffffffffffffffff167fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e502396098787856116f8610ff8565b6040516117089493929190613201565b60405180910390a250949350505050565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af281565b73d125443f38a69d776177c2b9c041f462936f821881565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f8042831015611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790612ec7565b60405180910390fd5b61181861067c565b8661182161128e565b61182b9190612ee5565b6118359190612f53565b91508482101561187a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118719061309d565b60405180910390fd5b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118c89190612d49565b602060405180830381865afa1580156118e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119079190612d76565b905082811015611997577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16639af5d0ab828561194d9190612f83565b6040518263ffffffff1660e01b81526004016119699190612a16565b5f604051808303815f87803b158015611980575f80fd5b505af1158015611992573d5f803e3d5ffd5b505050505b61199f61067c565b876119a861102b565b6119b29190612ee5565b6119bc9190612f53565b91505f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a0c9190612d49565b602060405180830381865afa158015611a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b9190612d76565b905082811015611ba55773960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b069190612d76565b8386611b129190612f83565b670de0b6b3a7640000611b259190612ee5565b611b2f9190612f53565b6040518263ffffffff1660e01b8152600401611b4b9190612a16565b6020604051808303815f875af1158015611b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8b9190612d76565b81611b969190612dce565b905082811015611ba4578092505b5b85831015611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf90613000565b60405180910390fd5b611bf23389612404565b611c3133857360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b611c70338473d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b611c78610567565b611c80610776565b3373ffffffffffffffffffffffffffffffffffffffff167f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb779385858b611cc3610ff8565b604051611cd39493929190613201565b60405180910390a2505094509492505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906132b4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc090613342565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ea39190612a16565b60405180910390a3505050565b5f611ebb8484611749565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f355781811015611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906133aa565b60405180910390fd5b611f348484848403611ced565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613438565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e906134c6565b60405180910390fd5b6120228383836125c7565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90613554565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161218e9190612a16565b60405180910390a36121a18484846125cc565b50505050565b61222a846323b872dd60e01b8585856040516024016121c893929190613572565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506125d1565b50505050565b6122b18363a9059cbb60e01b848460405160240161224f929190612e01565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506125d1565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b906135f1565b60405180910390fd5b61232f5f83836125c7565b8060025f8282546123409190612dce565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123ed9190612a16565b60405180910390a36124005f83836125cc565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061367f565b60405180910390fd5b61247d825f836125c7565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f79061370d565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125af9190612a16565b60405180910390a36125c2835f846125cc565b505050565b505050565b505050565b5f612632826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126969092919063ffffffff16565b90505f8151111561269157808060200190518101906126519190612e52565b612690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126879061379b565b60405180910390fd5b5b505050565b60606126a484845f856126ad565b90509392505050565b6060824710156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990613829565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161271a919061388b565b5f6040518083038185875af1925050503d805f8114612754576040519150601f19603f3d011682016040523d82523d5f602084013e612759565b606091505b509150915061276a87838387612776565b92505050949350505050565b606083156127d7575f8351036127cf5761278f856127ea565b6127ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c5906138eb565b60405180910390fd5b5b8290506127e2565b6127e1838361280c565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8251111561281e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285291906128e5565b60405180910390fd5b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612892578082015181840152602081019050612877565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128b78261285b565b6128c18185612865565b93506128d1818560208601612875565b6128da8161289d565b840191505092915050565b5f6020820190508181035f8301526128fd81846128ad565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61293282612909565b9050919050565b61294281612928565b811461294c575f80fd5b50565b5f8135905061295d81612939565b92915050565b5f819050919050565b61297581612963565b811461297f575f80fd5b50565b5f813590506129908161296c565b92915050565b5f80604083850312156129ac576129ab612905565b5b5f6129b98582860161294f565b92505060206129ca85828601612982565b9150509250929050565b5f8115159050919050565b6129e8816129d4565b82525050565b5f602082019050612a015f8301846129df565b92915050565b612a1081612963565b82525050565b5f602082019050612a295f830184612a07565b92915050565b5f805f60608486031215612a4657612a45612905565b5b5f612a538682870161294f565b9350506020612a648682870161294f565b9250506040612a7586828701612982565b9150509250925092565b5f60ff82169050919050565b612a9481612a7f565b82525050565b5f602082019050612aad5f830184612a8b565b92915050565b5f819050919050565b5f612ad6612ad1612acc84612909565b612ab3565b612909565b9050919050565b5f612ae782612abc565b9050919050565b5f612af882612add565b9050919050565b612b0881612aee565b82525050565b5f602082019050612b215f830184612aff565b92915050565b5f805f60608486031215612b3e57612b3d612905565b5b5f612b4b86828701612982565b9350506020612b5c86828701612982565b9250506040612b6d86828701612982565b9150509250925092565b5f60208284031215612b8c57612b8b612905565b5b5f612b998482850161294f565b91505092915050565b5f805f8060808587031215612bba57612bb9612905565b5b5f612bc787828801612982565b9450506020612bd887828801612982565b9350506040612be987828801612982565b9250506060612bfa87828801612982565b91505092959194509250565b5f612c1082612add565b9050919050565b612c2081612c06565b82525050565b5f602082019050612c395f830184612c17565b92915050565b5f612c4982612add565b9050919050565b612c5981612c3f565b82525050565b5f602082019050612c725f830184612c50565b92915050565b5f8060408385031215612c8e57612c8d612905565b5b5f612c9b8582860161294f565b9250506020612cac8582860161294f565b9150509250929050565b5f604082019050612cc95f830185612a07565b612cd66020830184612a07565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d2157607f821691505b602082108103612d3457612d33612cdd565b5b50919050565b612d4381612928565b82525050565b5f602082019050612d5c5f830184612d3a565b92915050565b5f81519050612d708161296c565b92915050565b5f60208284031215612d8b57612d8a612905565b5b5f612d9884828501612d62565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dd882612963565b9150612de383612963565b9250828201905080821115612dfb57612dfa612da1565b5b92915050565b5f604082019050612e145f830185612d3a565b612e216020830184612a07565b9392505050565b612e31816129d4565b8114612e3b575f80fd5b50565b5f81519050612e4c81612e28565b92915050565b5f60208284031215612e6757612e66612905565b5b5f612e7484828501612e3e565b91505092915050565b7f4f726465722065787069726564000000000000000000000000000000000000005f82015250565b5f612eb1600d83612865565b9150612ebc82612e7d565b602082019050919050565b5f6020820190508181035f830152612ede81612ea5565b9050919050565b5f612eef82612963565b9150612efa83612963565b9250828202612f0881612963565b91508282048414831517612f1f57612f1e612da1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f5d82612963565b9150612f6883612963565b925082612f7857612f77612f26565b5b828204905092915050565b5f612f8d82612963565b9150612f9883612963565b9250828203905081811115612fb057612faf612da1565b5b92915050565b7f536c697070616765206f6e2046425820746f6f206c6f770000000000000000005f82015250565b5f612fea601783612865565b9150612ff582612fb6565b602082019050919050565b5f6020820190508181035f83015261301781612fde565b9050919050565b5f6060820190506130315f830186612a07565b61303e6020830185612a07565b61304b6040830184612a07565b949350505050565b7f536c697070616765206f6e20455020746f6f206c6f77000000000000000000005f82015250565b5f613087601683612865565b915061309282613053565b602082019050919050565b5f6020820190508181035f8301526130b48161307b565b9050919050565b5f805f606084860312156130d2576130d1612905565b5b5f6130df86828701612d62565b93505060206130f086828701612d62565b925050604061310186828701612d62565b9150509250925092565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613165602583612865565b91506131708261310b565b604082019050919050565b5f6020820190508181035f83015261319281613159565b9050919050565b7f536c697070616765206f6e2046505420746f6f206c6f770000000000000000005f82015250565b5f6131cd601783612865565b91506131d882613199565b602082019050919050565b5f6020820190508181035f8301526131fa816131c1565b9050919050565b5f6080820190506132145f830187612a07565b6132216020830186612a07565b61322e6040830185612a07565b61323b6060830184612a07565b95945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61329e602483612865565b91506132a982613244565b604082019050919050565b5f6020820190508181035f8301526132cb81613292565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61332c602283612865565b9150613337826132d2565b604082019050919050565b5f6020820190508181035f83015261335981613320565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613394601d83612865565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613422602583612865565b915061342d826133c8565b604082019050919050565b5f6020820190508181035f83015261344f81613416565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6134b0602383612865565b91506134bb82613456565b604082019050919050565b5f6020820190508181035f8301526134dd816134a4565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61353e602683612865565b9150613549826134e4565b604082019050919050565b5f6020820190508181035f83015261356b81613532565b9050919050565b5f6060820190506135855f830186612d3a565b6135926020830185612d3a565b61359f6040830184612a07565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6135db601f83612865565b91506135e6826135a7565b602082019050919050565b5f6020820190508181035f830152613608816135cf565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613669602183612865565b91506136748261360f565b604082019050919050565b5f6020820190508181035f8301526136968161365d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6136f7602283612865565b91506137028261369d565b604082019050919050565b5f6020820190508181035f830152613724816136eb565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613785602a83612865565b91506137908261372b565b604082019050919050565b5f6020820190508181035f8301526137b281613779565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f613813602683612865565b915061381e826137b9565b604082019050919050565b5f6020820190508181035f83015261384081613807565b9050919050565b5f81519050919050565b5f81905092915050565b5f61386582613847565b61386f8185613851565b935061387f818560208601612875565b80840191505092915050565b5f613896828461385b565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6138d5601d83612865565b91506138e0826138a1565b602082019050919050565b5f6020820190508181035f830152613902816138c9565b905091905056fea26469706673582212205ba51f86265d6561257ea2f65dab7c626415ccb4c661be91f1942e8faed7c64f64736f6c63430008170033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610156575f3560e01c806370a08231116100c1578063a9059cbb1161007a578063a9059cbb146103b8578063aebf3e41146103e8578063b10abe4414610418578063beba222b14610436578063dd62ed3e14610454578063f88bf15a1461048457610156565b806370a08231146102e057806385096edc146103105780638bf6f1101461032e5780638dce357d1461034c57806395d89b411461036a578063a457c2d71461038857610156565b8063372500ab11610113578063372500ab1461021e57806339509351146102285780633c90381414610258578063447989dc14610262578063649932dd1461028057806366457129146102b057610156565b806306fdde031461015a578063095ea7b31461017857806317f75c9b146101a857806318160ddd146101b257806323b872dd146101d0578063313ce56714610200575b5f80fd5b6101626104b5565b60405161016f91906128e5565b60405180910390f35b610192600480360381019061018d9190612996565b610545565b60405161019f91906129ee565b60405180910390f35b6101b0610567565b005b6101ba61067c565b6040516101c79190612a16565b60405180910390f35b6101ea60048036038101906101e59190612a2f565b610685565b6040516101f791906129ee565b60405180910390f35b6102086106b3565b6040516102159190612a9a565b60405180910390f35b6102266106bb565b005b610242600480360381019061023d9190612996565b610740565b60405161024f91906129ee565b60405180910390f35b610260610776565b005b61026a610943565b6040516102779190612b0e565b60405180910390f35b61029a60048036038101906102959190612b27565b61095b565b6040516102a79190612a16565b60405180910390f35b6102ca60048036038101906102c59190612b27565b610cec565b6040516102d79190612a16565b60405180910390f35b6102fa60048036038101906102f59190612b77565b610fb3565b6040516103079190612a16565b60405180910390f35b610318610ff8565b6040516103259190612a16565b60405180910390f35b61033661102b565b6040516103439190612a16565b60405180910390f35b61035461128e565b6040516103619190612a16565b60405180910390f35b6103726113bd565b60405161037f91906128e5565b60405180910390f35b6103a2600480360381019061039d9190612996565b61144d565b6040516103af91906129ee565b60405180910390f35b6103d260048036038101906103cd9190612996565b6114c2565b6040516103df91906129ee565b60405180910390f35b61040260048036038101906103fd9190612ba2565b6114e4565b60405161040f9190612a16565b60405180910390f35b610420611719565b60405161042d9190612c26565b60405180910390f35b61043e611731565b60405161044b9190612c5f565b60405180910390f35b61046e60048036038101906104699190612c78565b611749565b60405161047b9190612a16565b60405180910390f35b61049e60048036038101906104999190612ba2565b6117cb565b6040516104ac929190612cb6565b60405180910390f35b6060600380546104c490612d0a565b80601f01602080910402602001604051908101604052809291908181526020018280546104f090612d0a565b801561053b5780601f106105125761010080835404028352916020019161053b565b820191905f5260205f20905b81548152906001019060200180831161051e57829003601f168201915b5050505050905090565b5f8061054f611ce6565b905061055c818585611ced565b600191505092915050565b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105b59190612d49565b602060405180830381865afa1580156105d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f49190612d76565b90505f811115610679577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16630dd0b38c826040518263ffffffff1660e01b815260040161064b9190612a16565b5f604051808303815f87803b158015610662575f80fd5b505af1158015610674573d5f803e3d5ffd5b505050505b50565b5f600254905090565b5f8061068f611ce6565b905061069c858285611eb0565b6106a7858585611f3b565b60019150509392505050565b5f6012905090565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610719573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073d9190612d76565b50565b5f8061074a611ce6565b905061076b81858561075c8589611749565b6107669190612dce565b611ced565b600191505092915050565b5f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107c49190612d49565b602060405180830381865afa1580156107df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190612d76565b90505f8111156109405773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b373960d43be128585ca45365cd74a7773b9d814dfbe836040518363ffffffff1660e01b8152600401610870929190612e01565b6020604051808303815f875af115801561088c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b09190612e52565b5073960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b81526004016108fe9190612a16565b6020604051808303815f875af115801561091a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093e9190612d76565b505b50565b73960d43be128585ca45365cd74a7773b9d814dfbe81565b5f4282101561099f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099690612ec7565b60405180910390fd5b6109a761128e565b846109b29190612dce565b6109ba61102b565b856109c59190612ee5565b6109cf9190612f53565b9050610a123330867360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b610a1a610567565b5f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a689190612d49565b602060405180830381865afa158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190612d76565b905081811015610c015773960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190612d76565b8385610b6e9190612f83565b670de0b6b3a7640000610b819190612ee5565b610b8b9190612f53565b6040518263ffffffff1660e01b8152600401610ba79190612a16565b6020604051808303815f875af1158015610bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be79190612d76565b81610bf29190612dce565b905081811015610c00578091505b5b83821015610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90613000565b60405180910390fd5b610c83338373d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b610c8b610776565b3373ffffffffffffffffffffffffffffffffffffffff167f5e7f5411ff6af2491af6242f82e8c8954e3b9041ba793d1bc1dadbacf73cf8338684610ccd610ff8565b604051610cdc9392919061301e565b60405180910390a2509392505050565b5f42821015610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790612ec7565b60405180910390fd5b610d3861102b565b84610d439190612dce565b610d4b61128e565b85610d569190612ee5565b610d609190612f53565b905082811015610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c9061309d565b60405180910390fd5b610de633308673d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e349190612d49565b602060405180830381865afa158015610e4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e739190612d76565b905081811015610f03577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16639af5d0ab8284610eb99190612f83565b6040518263ffffffff1660e01b8152600401610ed59190612a16565b5f604051808303815f87803b158015610eec575f80fd5b505af1158015610efe573d5f803e3d5ffd5b505050505b610f4233837360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b610f4a610567565b610f52610776565b3373ffffffffffffffffffffffffffffffffffffffff167fd50bf5a2f80fc8a712120cb1a86e90034651fb452e72ee8bf726afeec20653588684610f94610ff8565b604051610fa39392919061301e565b60405180910390a2509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f61100161128e565b61100961102b565b670de0b6b3a764000061101c9190612ee5565b6110269190612f53565b905090565b5f807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663dc01f60d306040518263ffffffff1660e01b815260040161107a9190612d49565b606060405180830381865afa158015611095573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b991906130bb565b92505050670de0b6b3a764000073960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611123573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111479190612d76565b73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111949190612d49565b602060405180830381865afa1580156111af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d39190612d76565b6111dd9190612ee5565b6111e79190612f53565b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112349190612d49565b602060405180830381865afa15801561124f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112739190612d76565b8261127e9190612dce565b6112889190612dce565b91505090565b5f807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166343b0215f306040518263ffffffff1660e01b81526004016112dd9190612d49565b606060405180830381865afa1580156112f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131c91906130bb565b505090507360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161136d9190612d49565b602060405180830381865afa158015611388573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ac9190612d76565b816113b79190612dce565b91505090565b6060600480546113cc90612d0a565b80601f01602080910402602001604051908101604052809291908181526020018280546113f890612d0a565b80156114435780601f1061141a57610100808354040283529160200191611443565b820191905f5260205f20905b81548152906001019060200180831161142657829003601f168201915b5050505050905090565b5f80611457611ce6565b90505f6114648286611749565b9050838110156114a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a09061317b565b60405180910390fd5b6114b68286868403611ced565b60019250505092915050565b5f806114cc611ce6565b90506114d9818585611f3b565b600191505092915050565b5f42821015611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90612ec7565b60405180910390fd5b5f60028561153461102b565b61153e9190612dce565b86670de0b6b3a76400006115529190612ee5565b61155c9190612f53565b8761156561128e565b61156f9190612dce565b88670de0b6b3a76400006115839190612ee5565b61158d9190612f53565b6115979190612dce565b6115a19190612f53565b905080670de0b6b3a76400006115b79190612f83565b6115bf61067c565b826115ca9190612ee5565b6115d49190612f53565b915083821015611619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611610906131e3565b60405180910390fd5b61165a3330887360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b61169b33308773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166121a7909392919063ffffffff16565b6116a533836122b6565b6116ad610567565b6116b5610776565b3373ffffffffffffffffffffffffffffffffffffffff167fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e502396098787856116f8610ff8565b6040516117089493929190613201565b60405180910390a250949350505050565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af281565b73d125443f38a69d776177c2b9c041f462936f821881565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f8042831015611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790612ec7565b60405180910390fd5b61181861067c565b8661182161128e565b61182b9190612ee5565b6118359190612f53565b91508482101561187a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118719061309d565b60405180910390fd5b5f7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118c89190612d49565b602060405180830381865afa1580156118e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119079190612d76565b905082811015611997577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16639af5d0ab828561194d9190612f83565b6040518263ffffffff1660e01b81526004016119699190612a16565b5f604051808303815f87803b158015611980575f80fd5b505af1158015611992573d5f803e3d5ffd5b505050505b61199f61067c565b876119a861102b565b6119b29190612ee5565b6119bc9190612f53565b91505f73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a0c9190612d49565b602060405180830381865afa158015611a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b9190612d76565b905082811015611ba55773960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d73960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff1663583d26236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b069190612d76565b8386611b129190612f83565b670de0b6b3a7640000611b259190612ee5565b611b2f9190612f53565b6040518263ffffffff1660e01b8152600401611b4b9190612a16565b6020604051808303815f875af1158015611b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8b9190612d76565b81611b969190612dce565b905082811015611ba4578092505b5b85831015611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf90613000565b60405180910390fd5b611bf23389612404565b611c3133857360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b611c70338473d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166122309092919063ffffffff16565b611c78610567565b611c80610776565b3373ffffffffffffffffffffffffffffffffffffffff167f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb779385858b611cc3610ff8565b604051611cd39493929190613201565b60405180910390a2505094509492505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906132b4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc090613342565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ea39190612a16565b60405180910390a3505050565b5f611ebb8484611749565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f355781811015611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906133aa565b60405180910390fd5b611f348484848403611ced565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613438565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e906134c6565b60405180910390fd5b6120228383836125c7565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90613554565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161218e9190612a16565b60405180910390a36121a18484846125cc565b50505050565b61222a846323b872dd60e01b8585856040516024016121c893929190613572565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506125d1565b50505050565b6122b18363a9059cbb60e01b848460405160240161224f929190612e01565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506125d1565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b906135f1565b60405180910390fd5b61232f5f83836125c7565b8060025f8282546123409190612dce565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123ed9190612a16565b60405180910390a36124005f83836125cc565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124699061367f565b60405180910390fd5b61247d825f836125c7565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f79061370d565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125af9190612a16565b60405180910390a36125c2835f846125cc565b505050565b505050565b505050565b5f612632826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126969092919063ffffffff16565b90505f8151111561269157808060200190518101906126519190612e52565b612690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126879061379b565b60405180910390fd5b5b505050565b60606126a484845f856126ad565b90509392505050565b6060824710156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990613829565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161271a919061388b565b5f6040518083038185875af1925050503d805f8114612754576040519150601f19603f3d011682016040523d82523d5f602084013e612759565b606091505b509150915061276a87838387612776565b92505050949350505050565b606083156127d7575f8351036127cf5761278f856127ea565b6127ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c5906138eb565b60405180910390fd5b5b8290506127e2565b6127e1838361280c565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8251111561281e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285291906128e5565b60405180910390fd5b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612892578082015181840152602081019050612877565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128b78261285b565b6128c18185612865565b93506128d1818560208601612875565b6128da8161289d565b840191505092915050565b5f6020820190508181035f8301526128fd81846128ad565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61293282612909565b9050919050565b61294281612928565b811461294c575f80fd5b50565b5f8135905061295d81612939565b92915050565b5f819050919050565b61297581612963565b811461297f575f80fd5b50565b5f813590506129908161296c565b92915050565b5f80604083850312156129ac576129ab612905565b5b5f6129b98582860161294f565b92505060206129ca85828601612982565b9150509250929050565b5f8115159050919050565b6129e8816129d4565b82525050565b5f602082019050612a015f8301846129df565b92915050565b612a1081612963565b82525050565b5f602082019050612a295f830184612a07565b92915050565b5f805f60608486031215612a4657612a45612905565b5b5f612a538682870161294f565b9350506020612a648682870161294f565b9250506040612a7586828701612982565b9150509250925092565b5f60ff82169050919050565b612a9481612a7f565b82525050565b5f602082019050612aad5f830184612a8b565b92915050565b5f819050919050565b5f612ad6612ad1612acc84612909565b612ab3565b612909565b9050919050565b5f612ae782612abc565b9050919050565b5f612af882612add565b9050919050565b612b0881612aee565b82525050565b5f602082019050612b215f830184612aff565b92915050565b5f805f60608486031215612b3e57612b3d612905565b5b5f612b4b86828701612982565b9350506020612b5c86828701612982565b9250506040612b6d86828701612982565b9150509250925092565b5f60208284031215612b8c57612b8b612905565b5b5f612b998482850161294f565b91505092915050565b5f805f8060808587031215612bba57612bb9612905565b5b5f612bc787828801612982565b9450506020612bd887828801612982565b9350506040612be987828801612982565b9250506060612bfa87828801612982565b91505092959194509250565b5f612c1082612add565b9050919050565b612c2081612c06565b82525050565b5f602082019050612c395f830184612c17565b92915050565b5f612c4982612add565b9050919050565b612c5981612c3f565b82525050565b5f602082019050612c725f830184612c50565b92915050565b5f8060408385031215612c8e57612c8d612905565b5b5f612c9b8582860161294f565b9250506020612cac8582860161294f565b9150509250929050565b5f604082019050612cc95f830185612a07565b612cd66020830184612a07565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d2157607f821691505b602082108103612d3457612d33612cdd565b5b50919050565b612d4381612928565b82525050565b5f602082019050612d5c5f830184612d3a565b92915050565b5f81519050612d708161296c565b92915050565b5f60208284031215612d8b57612d8a612905565b5b5f612d9884828501612d62565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dd882612963565b9150612de383612963565b9250828201905080821115612dfb57612dfa612da1565b5b92915050565b5f604082019050612e145f830185612d3a565b612e216020830184612a07565b9392505050565b612e31816129d4565b8114612e3b575f80fd5b50565b5f81519050612e4c81612e28565b92915050565b5f60208284031215612e6757612e66612905565b5b5f612e7484828501612e3e565b91505092915050565b7f4f726465722065787069726564000000000000000000000000000000000000005f82015250565b5f612eb1600d83612865565b9150612ebc82612e7d565b602082019050919050565b5f6020820190508181035f830152612ede81612ea5565b9050919050565b5f612eef82612963565b9150612efa83612963565b9250828202612f0881612963565b91508282048414831517612f1f57612f1e612da1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f5d82612963565b9150612f6883612963565b925082612f7857612f77612f26565b5b828204905092915050565b5f612f8d82612963565b9150612f9883612963565b9250828203905081811115612fb057612faf612da1565b5b92915050565b7f536c697070616765206f6e2046425820746f6f206c6f770000000000000000005f82015250565b5f612fea601783612865565b9150612ff582612fb6565b602082019050919050565b5f6020820190508181035f83015261301781612fde565b9050919050565b5f6060820190506130315f830186612a07565b61303e6020830185612a07565b61304b6040830184612a07565b949350505050565b7f536c697070616765206f6e20455020746f6f206c6f77000000000000000000005f82015250565b5f613087601683612865565b915061309282613053565b602082019050919050565b5f6020820190508181035f8301526130b48161307b565b9050919050565b5f805f606084860312156130d2576130d1612905565b5b5f6130df86828701612d62565b93505060206130f086828701612d62565b925050604061310186828701612d62565b9150509250925092565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613165602583612865565b91506131708261310b565b604082019050919050565b5f6020820190508181035f83015261319281613159565b9050919050565b7f536c697070616765206f6e2046505420746f6f206c6f770000000000000000005f82015250565b5f6131cd601783612865565b91506131d882613199565b602082019050919050565b5f6020820190508181035f8301526131fa816131c1565b9050919050565b5f6080820190506132145f830187612a07565b6132216020830186612a07565b61322e6040830185612a07565b61323b6060830184612a07565b95945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61329e602483612865565b91506132a982613244565b604082019050919050565b5f6020820190508181035f8301526132cb81613292565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61332c602283612865565b9150613337826132d2565b604082019050919050565b5f6020820190508181035f83015261335981613320565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613394601d83612865565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613422602583612865565b915061342d826133c8565b604082019050919050565b5f6020820190508181035f83015261344f81613416565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6134b0602383612865565b91506134bb82613456565b604082019050919050565b5f6020820190508181035f8301526134dd816134a4565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61353e602683612865565b9150613549826134e4565b604082019050919050565b5f6020820190508181035f83015261356b81613532565b9050919050565b5f6060820190506135855f830186612d3a565b6135926020830185612d3a565b61359f6040830184612a07565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6135db601f83612865565b91506135e6826135a7565b602082019050919050565b5f6020820190508181035f830152613608816135cf565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613669602183612865565b91506136748261360f565b604082019050919050565b5f6020820190508181035f8301526136968161365d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6136f7602283612865565b91506137028261369d565b604082019050919050565b5f6020820190508181035f830152613724816136eb565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613785602a83612865565b91506137908261372b565b604082019050919050565b5f6020820190508181035f8301526137b281613779565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f613813602683612865565b915061381e826137b9565b604082019050919050565b5f6020820190508181035f83015261384081613807565b9050919050565b5f81519050919050565b5f81905092915050565b5f61386582613847565b61386f8185613851565b935061387f818560208601612875565b80840191505092915050565b5f613896828461385b565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6138d5601d83612865565b91506138e0826138a1565b602082019050919050565b5f6020820190508181035f830152613902816138c9565b905091905056fea26469706673582212205ba51f86265d6561257ea2f65dab7c626415ccb4c661be91f1942e8faed7c64f64736f6c63430008170033
Deployed Bytecode Sourcemap
42233:6157:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29989:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32340:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44021:173;;;:::i;:::-;;31109:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33121:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30951:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43946:67;;;:::i;:::-;;33825:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44202:241;;;:::i;:::-;;42503:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47429:958;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46631:790;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31280:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43825:109;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43381:252;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43641:176;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30208:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34566:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31613:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44451:843;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42424:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42338:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31869:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45302:1321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29989:100;30043:13;30076:5;30069:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29989:100;:::o;32340:201::-;32423:4;32440:13;32456:12;:10;:12::i;:::-;32440:28;;32479:32;32488:5;32495:7;32504:6;32479:8;:32::i;:::-;32529:4;32522:11;;;32340:201;;;;:::o;44021:173::-;44062:17;42453:42;44082:12;;;44103:4;44082:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44062:47;;44136:1;44124:9;:13;44120:67;;;42453:42;44154:10;;;44165:9;44154:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44120:67;44051:143;44021:173::o;31109:108::-;31170:7;31197:12;;31190:19;;31109:108;:::o;33121:295::-;33252:4;33269:15;33287:12;:10;:12::i;:::-;33269:30;;33310:38;33326:4;33332:7;33341:6;33310:15;:38::i;:::-;33359:27;33369:4;33375:2;33379:6;33359:9;:27::i;:::-;33404:4;33397:11;;;33121:295;;;;;:::o;30951:93::-;31009:5;31034:2;31027:9;;30951:93;:::o;43946:67::-;42453:42;43988:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43946:67::o;33825:238::-;33913:4;33930:13;33946:12;:10;:12::i;:::-;33930:28;;33969:64;33978:5;33985:7;34022:10;33994:25;34004:5;34011:7;33994:9;:25::i;:::-;:38;;;;:::i;:::-;33969:8;:64::i;:::-;34051:4;34044:11;;;33825:238;;;;:::o;44202:241::-;44246:18;42374:42;44267:13;;;44289:4;44267:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44246:49;;44323:1;44310:10;:14;44306:130;;;42374:42;44341:11;;;42547:42;44371:10;44341:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42547:42;44397:15;;;44413:10;44397:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44306:130;44235:208;44202:241::o;42503:87::-;42547:42;42503:87;:::o;47429:958::-;47537:20;47590:15;47578:8;:27;;47570:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47701:11;:9;:11::i;:::-;47688:10;:24;;;;:::i;:::-;47672:12;:10;:12::i;:::-;47659:10;:25;;;;:::i;:::-;:54;;;;:::i;:::-;47644:69;;47724:58;47744:10;47764:4;47771:10;42453:42;47724:19;;;;:58;;;;;;:::i;:::-;47793:13;:11;:13::i;:::-;47819:18;42374:42;47840:13;;;47862:4;47840:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47819:49;;47896:12;47883:10;:25;47879:256;;;42547:42;47939:16;;;42547:42;47993:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47979:10;47964:12;:25;;;;:::i;:::-;47956:4;:34;;;;:::i;:::-;:61;;;;:::i;:::-;47939:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47925:93;;;;;:::i;:::-;;;48050:12;48037:10;:25;48033:91;;;48098:10;48083:25;;48033:91;47879:256;48169:15;48153:12;:31;;48145:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48225:42;48242:10;48254:12;42374:42;48225:16;;;;:42;;;;;:::i;:::-;48278:16;:14;:16::i;:::-;48330:10;48312:67;;;48342:10;48354:12;48368:10;:8;:10::i;:::-;48312:67;;;;;;;;:::i;:::-;;;;;;;;47559:828;47429:958;;;;;:::o;46631:790::-;46739:19;46791:15;46779:8;:27;;46771:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46894:12;:10;:12::i;:::-;46880:11;:26;;;;:::i;:::-;46865:11;:9;:11::i;:::-;46851;:25;;;;:::i;:::-;:56;;;;:::i;:::-;46837:70;;46941:14;46926:11;:29;;46918:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46993:60;47014:10;47034:4;47041:11;42374:42;46993:20;;;;:60;;;;;;:::i;:::-;47074:17;42453:42;47094:12;;;47115:4;47094:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47074:47;;47148:11;47136:9;:23;47132:93;;;42453:42;47176:12;;;47203:9;47189:11;:23;;;;:::i;:::-;47176:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47132:93;47235:40;47251:10;47263:11;42453:42;47235:15;;;;:40;;;;;:::i;:::-;47288:13;:11;:13::i;:::-;47312:16;:14;:16::i;:::-;47364:10;47346:67;;;47376:11;47389;47402:10;:8;:10::i;:::-;47346:67;;;;;;;;:::i;:::-;;;;;;;;46760:661;46631:790;;;;;:::o;31280:127::-;31354:7;31381:9;:18;31391:7;31381:18;;;;;;;;;;;;;;;;31374:25;;31280:127;;;:::o;43825:109::-;43866:7;43915:11;:9;:11::i;:::-;43900:12;:10;:12::i;:::-;43893:4;:19;;;;:::i;:::-;:33;;;;:::i;:::-;43886:40;;43825:109;:::o;43381:252::-;43424:7;43447:15;42453:42;43466:19;;;43494:4;43466:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43444:56;;;;43621:4;42547:42;43594:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42547:42;43559:17;;;43585:4;43559:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:66;;;;:::i;:::-;42374:42;43528:13;;;43550:4;43528:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43518:7;:38;;;;:::i;:::-;:107;;;;:::i;:::-;43511:114;;;43381:252;:::o;43641:176::-;43683:7;43704:16;42453:42;43726:12;;;43747:4;43726:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43703:50;;;;42453:42;43782:12;;;43803:4;43782:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43771:8;:38;;;;:::i;:::-;43764:45;;;43641:176;:::o;30208:104::-;30264:13;30297:7;30290:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30208:104;:::o;34566:436::-;34659:4;34676:13;34692:12;:10;:12::i;:::-;34676:28;;34715:24;34742:25;34752:5;34759:7;34742:9;:25::i;:::-;34715:52;;34806:15;34786:16;:35;;34778:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34899:60;34908:5;34915:7;34943:15;34924:16;:34;34899:8;:60::i;:::-;34990:4;34983:11;;;;34566:436;;;;:::o;31613:193::-;31692:4;31709:13;31725:12;:10;:12::i;:::-;31709:28;;31748;31758:5;31765:2;31769:6;31748:9;:28::i;:::-;31794:4;31787:11;;;31613:193;;;;:::o;44451:843::-;44575:20;44628:15;44616:8;:27;;44608:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44674:17;44797:1;44781:11;44766:12;:10;:12::i;:::-;:26;;;;:::i;:::-;44751:11;44744:4;:18;;;;:::i;:::-;:49;;;;:::i;:::-;44730:10;44716:11;:9;:11::i;:::-;:24;;;;:::i;:::-;44702:10;44695:4;:17;;;;:::i;:::-;:46;;;;:::i;:::-;:98;;;;:::i;:::-;44694:104;;;;:::i;:::-;44674:124;;44860:9;44853:4;:16;;;;:::i;:::-;44836:13;:11;:13::i;:::-;44824:9;:25;;;;:::i;:::-;:46;;;;:::i;:::-;44809:61;;44905:15;44889:12;:31;;44881:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44961:58;44981:10;45001:4;45008:10;42453:42;44961:19;;;;:58;;;;;;:::i;:::-;45030:60;45051:10;45071:4;45078:11;42374:42;45030:20;;;;:60;;;;;;:::i;:::-;45101:31;45107:10;45119:12;45101:5;:31::i;:::-;45153:13;:11;:13::i;:::-;45177:16;:14;:16::i;:::-;45224:10;45211:75;;;45236:10;45248:11;45261:12;45275:10;:8;:10::i;:::-;45211:75;;;;;;;;;:::i;:::-;;;;;;;;44597:697;44451:843;;;;;;:::o;42424:72::-;42453:42;42424:72;:::o;42338:79::-;42374:42;42338:79;:::o;31869:151::-;31958:7;31985:11;:18;31997:5;31985:18;;;;;;;;;;;;;;;:27;32004:7;31985:27;;;;;;;;;;;;;;;;31978:34;;31869:151;;;;:::o;45302:1321::-;45433:19;45454:20;45507:15;45495:8;:27;;45487:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45595:13;:11;:13::i;:::-;45581:11;45567;:9;:11::i;:::-;:25;;;;:::i;:::-;:41;;;;:::i;:::-;45553:55;;45642:14;45627:11;:29;;45619:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45694:17;42453:42;45714:12;;;45735:4;45714:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45694:47;;45768:11;45756:9;:23;45752:93;;;42453:42;45796:12;;;45823:9;45809:11;:23;;;;:::i;:::-;45796:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45752:93;45901:13;:11;:13::i;:::-;45887:11;45872:12;:10;:12::i;:::-;:26;;;;:::i;:::-;:42;;;;:::i;:::-;45857:57;;45925:18;42374:42;45946:13;;;45968:4;45946:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45925:49;;46002:12;45989:10;:25;45985:256;;;42547:42;46045:16;;;42547:42;46099:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46085:10;46070:12;:25;;;;:::i;:::-;46062:4;:34;;;;:::i;:::-;:61;;;;:::i;:::-;46045:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46031:93;;;;;:::i;:::-;;;46156:12;46143:10;:25;46139:91;;;46204:10;46189:25;;46139:91;45985:256;46275:15;46259:12;:31;;46251:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46331:30;46337:10;46349:11;46331:5;:30::i;:::-;46372:40;46388:10;46400:11;42453:42;46372:15;;;;:40;;;;;:::i;:::-;46423:42;46440:10;46452:12;42374:42;46423:16;;;;:42;;;;;:::i;:::-;46478:13;:11;:13::i;:::-;46502:16;:14;:16::i;:::-;46552:10;46536:79;;;46564:11;46577:12;46591:11;46604:10;:8;:10::i;:::-;46536:79;;;;;;;;;:::i;:::-;;;;;;;;45476:1147;;45302:1321;;;;;;;:::o;19513:98::-;19566:7;19593:10;19586:17;;19513:98;:::o;38593:380::-;38746:1;38729:19;;:5;:19;;;38721:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38827:1;38808:21;;:7;:21;;;38800:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38911:6;38881:11;:18;38893:5;38881:18;;;;;;;;;;;;;;;:27;38900:7;38881:27;;;;;;;;;;;;;;;:36;;;;38949:7;38933:32;;38942:5;38933:32;;;38958:6;38933:32;;;;;;:::i;:::-;;;;;;;;38593:380;;;:::o;39264:453::-;39399:24;39426:25;39436:5;39443:7;39426:9;:25::i;:::-;39399:52;;39486:17;39466:16;:37;39462:248;;39548:6;39528:16;:26;;39520:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39632:51;39641:5;39648:7;39676:6;39657:16;:25;39632:8;:51::i;:::-;39462:248;39388:329;39264:453;;;:::o;35472:840::-;35619:1;35603:18;;:4;:18;;;35595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35696:1;35682:16;;:2;:16;;;35674:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35751:38;35772:4;35778:2;35782:6;35751:20;:38::i;:::-;35802:19;35824:9;:15;35834:4;35824:15;;;;;;;;;;;;;;;;35802:37;;35873:6;35858:11;:21;;35850:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35990:6;35976:11;:20;35958:9;:15;35968:4;35958:15;;;;;;;;;;;;;;;:38;;;;36193:6;36176:9;:13;36186:2;36176:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;36243:2;36228:26;;36237:4;36228:26;;;36247:6;36228:26;;;;;;:::i;:::-;;;;;;;;36267:37;36287:4;36293:2;36297:6;36267:19;:37::i;:::-;35584:728;35472:840;;;:::o;23539:248::-;23683:96;23703:5;23733:27;;;23762:4;23768:2;23772:5;23710:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23683:19;:96::i;:::-;23539:248;;;;:::o;23320:211::-;23437:86;23457:5;23487:23;;;23512:2;23516:5;23464:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23437:19;:86::i;:::-;23320:211;;;:::o;36599:548::-;36702:1;36683:21;;:7;:21;;;36675:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36753:49;36782:1;36786:7;36795:6;36753:20;:49::i;:::-;36831:6;36815:12;;:22;;;;;;;:::i;:::-;;;;;;;;37008:6;36986:9;:18;36996:7;36986:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;37062:7;37041:37;;37058:1;37041:37;;;37071:6;37041:37;;;;;;:::i;:::-;;;;;;;;37091:48;37119:1;37123:7;37132:6;37091:19;:48::i;:::-;36599:548;;:::o;37480:675::-;37583:1;37564:21;;:7;:21;;;37556:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37636:49;37657:7;37674:1;37678:6;37636:20;:49::i;:::-;37698:22;37723:9;:18;37733:7;37723:18;;;;;;;;;;;;;;;;37698:43;;37778:6;37760:14;:24;;37752:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37897:6;37880:14;:23;37859:9;:18;37869:7;37859:18;;;;;;;;;;;;;;;:44;;;;38014:6;37998:12;;:22;;;;;;;;;;;38075:1;38049:37;;38058:7;38049:37;;;38079:6;38049:37;;;;;;:::i;:::-;;;;;;;;38099:48;38119:7;38136:1;38140:6;38099:19;:48::i;:::-;37545:610;37480:675;;:::o;40317:125::-;;;;:::o;41046:124::-;;;;:::o;26387:716::-;26811:23;26837:69;26865:4;26837:69;;;;;;;;;;;;;;;;;26845:5;26837:27;;;;:69;;;;;:::i;:::-;26811:95;;26941:1;26921:10;:17;:21;26917:179;;;27018:10;27007:30;;;;;;;;;;;;:::i;:::-;26999:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26917:179;26457:646;26387:716;;:::o;11031:229::-;11168:12;11200:52;11222:6;11230:4;11236:1;11239:12;11200:21;:52::i;:::-;11193:59;;11031:229;;;;;:::o;12151:455::-;12321:12;12379:5;12354:21;:30;;12346:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;12439:12;12453:23;12480:6;:11;;12499:5;12506:4;12480:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:73;;;;12529:69;12556:6;12564:7;12573:10;12585:12;12529:26;:69::i;:::-;12522:76;;;;12151:455;;;;;;:::o;14724:644::-;14909:12;14938:7;14934:427;;;14987:1;14966:10;:17;:22;14962:290;;15184:18;15195:6;15184:10;:18::i;:::-;15176:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14962:290;15273:10;15266:17;;;;14934:427;15316:33;15324:10;15336:12;15316:7;:33::i;:::-;14724:644;;;;;;;:::o;8274:326::-;8334:4;8591:1;8569:7;:19;;;:23;8562:30;;8274:326;;;:::o;15910:552::-;16091:1;16071:10;:17;:21;16067:388;;;16303:10;16297:17;16360:15;16347:10;16343:2;16339:19;16332:44;16067:388;16430:12;16423:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:99:1;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:60::-;4881:3;4902:5;4895:12;;4853:60;;;:::o;4919:142::-;4969:9;5002:53;5020:34;5029:24;5047:5;5029:24;:::i;:::-;5020:34;:::i;:::-;5002:53;:::i;:::-;4989:66;;4919:142;;;:::o;5067:126::-;5117:9;5150:37;5181:5;5150:37;:::i;:::-;5137:50;;5067:126;;;:::o;5199:143::-;5266:9;5299:37;5330:5;5299:37;:::i;:::-;5286:50;;5199:143;;;:::o;5348:165::-;5452:54;5500:5;5452:54;:::i;:::-;5447:3;5440:67;5348:165;;:::o;5519:256::-;5629:4;5667:2;5656:9;5652:18;5644:26;;5680:88;5765:1;5754:9;5750:17;5741:6;5680:88;:::i;:::-;5519:256;;;;:::o;5781:619::-;5858:6;5866;5874;5923:2;5911:9;5902:7;5898:23;5894:32;5891:119;;;5929:79;;:::i;:::-;5891:119;6049:1;6074:53;6119:7;6110:6;6099:9;6095:22;6074:53;:::i;:::-;6064:63;;6020:117;6176:2;6202:53;6247:7;6238:6;6227:9;6223:22;6202:53;:::i;:::-;6192:63;;6147:118;6304:2;6330:53;6375:7;6366:6;6355:9;6351:22;6330:53;:::i;:::-;6320:63;;6275:118;5781:619;;;;;:::o;6406:329::-;6465:6;6514:2;6502:9;6493:7;6489:23;6485:32;6482:119;;;6520:79;;:::i;:::-;6482:119;6640:1;6665:53;6710:7;6701:6;6690:9;6686:22;6665:53;:::i;:::-;6655:63;;6611:117;6406:329;;;;:::o;6741:765::-;6827:6;6835;6843;6851;6900:3;6888:9;6879:7;6875:23;6871:33;6868:120;;;6907:79;;:::i;:::-;6868:120;7027:1;7052:53;7097:7;7088:6;7077:9;7073:22;7052:53;:::i;:::-;7042:63;;6998:117;7154:2;7180:53;7225:7;7216:6;7205:9;7201:22;7180:53;:::i;:::-;7170:63;;7125:118;7282:2;7308:53;7353:7;7344:6;7333:9;7329:22;7308:53;:::i;:::-;7298:63;;7253:118;7410:2;7436:53;7481:7;7472:6;7461:9;7457:22;7436:53;:::i;:::-;7426:63;;7381:118;6741:765;;;;;;;:::o;7512:138::-;7574:9;7607:37;7638:5;7607:37;:::i;:::-;7594:50;;7512:138;;;:::o;7656:155::-;7755:49;7798:5;7755:49;:::i;:::-;7750:3;7743:62;7656:155;;:::o;7817:246::-;7922:4;7960:2;7949:9;7945:18;7937:26;;7973:83;8053:1;8042:9;8038:17;8029:6;7973:83;:::i;:::-;7817:246;;;;:::o;8069:140::-;8133:9;8166:37;8197:5;8166:37;:::i;:::-;8153:50;;8069:140;;;:::o;8215:159::-;8316:51;8361:5;8316:51;:::i;:::-;8311:3;8304:64;8215:159;;:::o;8380:250::-;8487:4;8525:2;8514:9;8510:18;8502:26;;8538:85;8620:1;8609:9;8605:17;8596:6;8538:85;:::i;:::-;8380:250;;;;:::o;8636:474::-;8704:6;8712;8761:2;8749:9;8740:7;8736:23;8732:32;8729:119;;;8767:79;;:::i;:::-;8729:119;8887:1;8912:53;8957:7;8948:6;8937:9;8933:22;8912:53;:::i;:::-;8902:63;;8858:117;9014:2;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8985:118;8636:474;;;;;:::o;9116:332::-;9237:4;9275:2;9264:9;9260:18;9252:26;;9288:71;9356:1;9345:9;9341:17;9332:6;9288:71;:::i;:::-;9369:72;9437:2;9426:9;9422:18;9413:6;9369:72;:::i;:::-;9116:332;;;;;:::o;9454:180::-;9502:77;9499:1;9492:88;9599:4;9596:1;9589:15;9623:4;9620:1;9613:15;9640:320;9684:6;9721:1;9715:4;9711:12;9701:22;;9768:1;9762:4;9758:12;9789:18;9779:81;;9845:4;9837:6;9833:17;9823:27;;9779:81;9907:2;9899:6;9896:14;9876:18;9873:38;9870:84;;9926:18;;:::i;:::-;9870:84;9691:269;9640:320;;;:::o;9966:118::-;10053:24;10071:5;10053:24;:::i;:::-;10048:3;10041:37;9966:118;;:::o;10090:222::-;10183:4;10221:2;10210:9;10206:18;10198:26;;10234:71;10302:1;10291:9;10287:17;10278:6;10234:71;:::i;:::-;10090:222;;;;:::o;10318:143::-;10375:5;10406:6;10400:13;10391:22;;10422:33;10449:5;10422:33;:::i;:::-;10318:143;;;;:::o;10467:351::-;10537:6;10586:2;10574:9;10565:7;10561:23;10557:32;10554:119;;;10592:79;;:::i;:::-;10554:119;10712:1;10737:64;10793:7;10784:6;10773:9;10769:22;10737:64;:::i;:::-;10727:74;;10683:128;10467:351;;;;:::o;10824:180::-;10872:77;10869:1;10862:88;10969:4;10966:1;10959:15;10993:4;10990:1;10983:15;11010:191;11050:3;11069:20;11087:1;11069:20;:::i;:::-;11064:25;;11103:20;11121:1;11103:20;:::i;:::-;11098:25;;11146:1;11143;11139:9;11132:16;;11167:3;11164:1;11161:10;11158:36;;;11174:18;;:::i;:::-;11158:36;11010:191;;;;:::o;11207:332::-;11328:4;11366:2;11355:9;11351:18;11343:26;;11379:71;11447:1;11436:9;11432:17;11423:6;11379:71;:::i;:::-;11460:72;11528:2;11517:9;11513:18;11504:6;11460:72;:::i;:::-;11207:332;;;;;:::o;11545:116::-;11615:21;11630:5;11615:21;:::i;:::-;11608:5;11605:32;11595:60;;11651:1;11648;11641:12;11595:60;11545:116;:::o;11667:137::-;11721:5;11752:6;11746:13;11737:22;;11768:30;11792:5;11768:30;:::i;:::-;11667:137;;;;:::o;11810:345::-;11877:6;11926:2;11914:9;11905:7;11901:23;11897:32;11894:119;;;11932:79;;:::i;:::-;11894:119;12052:1;12077:61;12130:7;12121:6;12110:9;12106:22;12077:61;:::i;:::-;12067:71;;12023:125;11810:345;;;;:::o;12161:163::-;12301:15;12297:1;12289:6;12285:14;12278:39;12161:163;:::o;12330:366::-;12472:3;12493:67;12557:2;12552:3;12493:67;:::i;:::-;12486:74;;12569:93;12658:3;12569:93;:::i;:::-;12687:2;12682:3;12678:12;12671:19;;12330:366;;;:::o;12702:419::-;12868:4;12906:2;12895:9;12891:18;12883:26;;12955:9;12949:4;12945:20;12941:1;12930:9;12926:17;12919:47;12983:131;13109:4;12983:131;:::i;:::-;12975:139;;12702:419;;;:::o;13127:410::-;13167:7;13190:20;13208:1;13190:20;:::i;:::-;13185:25;;13224:20;13242:1;13224:20;:::i;:::-;13219:25;;13279:1;13276;13272:9;13301:30;13319:11;13301:30;:::i;:::-;13290:41;;13480:1;13471:7;13467:15;13464:1;13461:22;13441:1;13434:9;13414:83;13391:139;;13510:18;;:::i;:::-;13391:139;13175:362;13127:410;;;;:::o;13543:180::-;13591:77;13588:1;13581:88;13688:4;13685:1;13678:15;13712:4;13709:1;13702:15;13729:185;13769:1;13786:20;13804:1;13786:20;:::i;:::-;13781:25;;13820:20;13838:1;13820:20;:::i;:::-;13815:25;;13859:1;13849:35;;13864:18;;:::i;:::-;13849:35;13906:1;13903;13899:9;13894:14;;13729:185;;;;:::o;13920:194::-;13960:4;13980:20;13998:1;13980:20;:::i;:::-;13975:25;;14014:20;14032:1;14014:20;:::i;:::-;14009:25;;14058:1;14055;14051:9;14043:17;;14082:1;14076:4;14073:11;14070:37;;;14087:18;;:::i;:::-;14070:37;13920:194;;;;:::o;14120:173::-;14260:25;14256:1;14248:6;14244:14;14237:49;14120:173;:::o;14299:366::-;14441:3;14462:67;14526:2;14521:3;14462:67;:::i;:::-;14455:74;;14538:93;14627:3;14538:93;:::i;:::-;14656:2;14651:3;14647:12;14640:19;;14299:366;;;:::o;14671:419::-;14837:4;14875:2;14864:9;14860:18;14852:26;;14924:9;14918:4;14914:20;14910:1;14899:9;14895:17;14888:47;14952:131;15078:4;14952:131;:::i;:::-;14944:139;;14671:419;;;:::o;15096:442::-;15245:4;15283:2;15272:9;15268:18;15260:26;;15296:71;15364:1;15353:9;15349:17;15340:6;15296:71;:::i;:::-;15377:72;15445:2;15434:9;15430:18;15421:6;15377:72;:::i;:::-;15459;15527:2;15516:9;15512:18;15503:6;15459:72;:::i;:::-;15096:442;;;;;;:::o;15544:172::-;15684:24;15680:1;15672:6;15668:14;15661:48;15544:172;:::o;15722:366::-;15864:3;15885:67;15949:2;15944:3;15885:67;:::i;:::-;15878:74;;15961:93;16050:3;15961:93;:::i;:::-;16079:2;16074:3;16070:12;16063:19;;15722:366;;;:::o;16094:419::-;16260:4;16298:2;16287:9;16283:18;16275:26;;16347:9;16341:4;16337:20;16333:1;16322:9;16318:17;16311:47;16375:131;16501:4;16375:131;:::i;:::-;16367:139;;16094:419;;;:::o;16519:663::-;16607:6;16615;16623;16672:2;16660:9;16651:7;16647:23;16643:32;16640:119;;;16678:79;;:::i;:::-;16640:119;16798:1;16823:64;16879:7;16870:6;16859:9;16855:22;16823:64;:::i;:::-;16813:74;;16769:128;16936:2;16962:64;17018:7;17009:6;16998:9;16994:22;16962:64;:::i;:::-;16952:74;;16907:129;17075:2;17101:64;17157:7;17148:6;17137:9;17133:22;17101:64;:::i;:::-;17091:74;;17046:129;16519:663;;;;;:::o;17188:224::-;17328:34;17324:1;17316:6;17312:14;17305:58;17397:7;17392:2;17384:6;17380:15;17373:32;17188:224;:::o;17418:366::-;17560:3;17581:67;17645:2;17640:3;17581:67;:::i;:::-;17574:74;;17657:93;17746:3;17657:93;:::i;:::-;17775:2;17770:3;17766:12;17759:19;;17418:366;;;:::o;17790:419::-;17956:4;17994:2;17983:9;17979:18;17971:26;;18043:9;18037:4;18033:20;18029:1;18018:9;18014:17;18007:47;18071:131;18197:4;18071:131;:::i;:::-;18063:139;;17790:419;;;:::o;18215:173::-;18355:25;18351:1;18343:6;18339:14;18332:49;18215:173;:::o;18394:366::-;18536:3;18557:67;18621:2;18616:3;18557:67;:::i;:::-;18550:74;;18633:93;18722:3;18633:93;:::i;:::-;18751:2;18746:3;18742:12;18735:19;;18394:366;;;:::o;18766:419::-;18932:4;18970:2;18959:9;18955:18;18947:26;;19019:9;19013:4;19009:20;19005:1;18994:9;18990:17;18983:47;19047:131;19173:4;19047:131;:::i;:::-;19039:139;;18766:419;;;:::o;19191:553::-;19368:4;19406:3;19395:9;19391:19;19383:27;;19420:71;19488:1;19477:9;19473:17;19464:6;19420:71;:::i;:::-;19501:72;19569:2;19558:9;19554:18;19545:6;19501:72;:::i;:::-;19583;19651:2;19640:9;19636:18;19627:6;19583:72;:::i;:::-;19665;19733:2;19722:9;19718:18;19709:6;19665:72;:::i;:::-;19191:553;;;;;;;:::o;19750:223::-;19890:34;19886:1;19878:6;19874:14;19867:58;19959:6;19954:2;19946:6;19942:15;19935:31;19750:223;:::o;19979:366::-;20121:3;20142:67;20206:2;20201:3;20142:67;:::i;:::-;20135:74;;20218:93;20307:3;20218:93;:::i;:::-;20336:2;20331:3;20327:12;20320:19;;19979:366;;;:::o;20351:419::-;20517:4;20555:2;20544:9;20540:18;20532:26;;20604:9;20598:4;20594:20;20590:1;20579:9;20575:17;20568:47;20632:131;20758:4;20632:131;:::i;:::-;20624:139;;20351:419;;;:::o;20776:221::-;20916:34;20912:1;20904:6;20900:14;20893:58;20985:4;20980:2;20972:6;20968:15;20961:29;20776:221;:::o;21003:366::-;21145:3;21166:67;21230:2;21225:3;21166:67;:::i;:::-;21159:74;;21242:93;21331:3;21242:93;:::i;:::-;21360:2;21355:3;21351:12;21344:19;;21003:366;;;:::o;21375:419::-;21541:4;21579:2;21568:9;21564:18;21556:26;;21628:9;21622:4;21618:20;21614:1;21603:9;21599:17;21592:47;21656:131;21782:4;21656:131;:::i;:::-;21648:139;;21375:419;;;:::o;21800:179::-;21940:31;21936:1;21928:6;21924:14;21917:55;21800:179;:::o;21985:366::-;22127:3;22148:67;22212:2;22207:3;22148:67;:::i;:::-;22141:74;;22224:93;22313:3;22224:93;:::i;:::-;22342:2;22337:3;22333:12;22326:19;;21985:366;;;:::o;22357:419::-;22523:4;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:131;22764:4;22638:131;:::i;:::-;22630:139;;22357:419;;;:::o;22782:224::-;22922:34;22918:1;22910:6;22906:14;22899:58;22991:7;22986:2;22978:6;22974:15;22967:32;22782:224;:::o;23012:366::-;23154:3;23175:67;23239:2;23234:3;23175:67;:::i;:::-;23168:74;;23251:93;23340:3;23251:93;:::i;:::-;23369:2;23364:3;23360:12;23353:19;;23012:366;;;:::o;23384:419::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:131;23791:4;23665:131;:::i;:::-;23657:139;;23384:419;;;:::o;23809:222::-;23949:34;23945:1;23937:6;23933:14;23926:58;24018:5;24013:2;24005:6;24001:15;23994:30;23809:222;:::o;24037:366::-;24179:3;24200:67;24264:2;24259:3;24200:67;:::i;:::-;24193:74;;24276:93;24365:3;24276:93;:::i;:::-;24394:2;24389:3;24385:12;24378:19;;24037:366;;;:::o;24409:419::-;24575:4;24613:2;24602:9;24598:18;24590:26;;24662:9;24656:4;24652:20;24648:1;24637:9;24633:17;24626:47;24690:131;24816:4;24690:131;:::i;:::-;24682:139;;24409:419;;;:::o;24834:225::-;24974:34;24970:1;24962:6;24958:14;24951:58;25043:8;25038:2;25030:6;25026:15;25019:33;24834:225;:::o;25065:366::-;25207:3;25228:67;25292:2;25287:3;25228:67;:::i;:::-;25221:74;;25304:93;25393:3;25304:93;:::i;:::-;25422:2;25417:3;25413:12;25406:19;;25065:366;;;:::o;25437:419::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25690:9;25684:4;25680:20;25676:1;25665:9;25661:17;25654:47;25718:131;25844:4;25718:131;:::i;:::-;25710:139;;25437:419;;;:::o;25862:442::-;26011:4;26049:2;26038:9;26034:18;26026:26;;26062:71;26130:1;26119:9;26115:17;26106:6;26062:71;:::i;:::-;26143:72;26211:2;26200:9;26196:18;26187:6;26143:72;:::i;:::-;26225;26293:2;26282:9;26278:18;26269:6;26225:72;:::i;:::-;25862:442;;;;;;:::o;26310:181::-;26450:33;26446:1;26438:6;26434:14;26427:57;26310:181;:::o;26497:366::-;26639:3;26660:67;26724:2;26719:3;26660:67;:::i;:::-;26653:74;;26736:93;26825:3;26736:93;:::i;:::-;26854:2;26849:3;26845:12;26838:19;;26497:366;;;:::o;26869:419::-;27035:4;27073:2;27062:9;27058:18;27050:26;;27122:9;27116:4;27112:20;27108:1;27097:9;27093:17;27086:47;27150:131;27276:4;27150:131;:::i;:::-;27142:139;;26869:419;;;:::o;27294:220::-;27434:34;27430:1;27422:6;27418:14;27411:58;27503:3;27498:2;27490:6;27486:15;27479:28;27294:220;:::o;27520:366::-;27662:3;27683:67;27747:2;27742:3;27683:67;:::i;:::-;27676:74;;27759:93;27848:3;27759:93;:::i;:::-;27877:2;27872:3;27868:12;27861:19;;27520:366;;;:::o;27892:419::-;28058:4;28096:2;28085:9;28081:18;28073:26;;28145:9;28139:4;28135:20;28131:1;28120:9;28116:17;28109:47;28173:131;28299:4;28173:131;:::i;:::-;28165:139;;27892:419;;;:::o;28317:221::-;28457:34;28453:1;28445:6;28441:14;28434:58;28526:4;28521:2;28513:6;28509:15;28502:29;28317:221;:::o;28544:366::-;28686:3;28707:67;28771:2;28766:3;28707:67;:::i;:::-;28700:74;;28783:93;28872:3;28783:93;:::i;:::-;28901:2;28896:3;28892:12;28885:19;;28544:366;;;:::o;28916:419::-;29082:4;29120:2;29109:9;29105:18;29097:26;;29169:9;29163:4;29159:20;29155:1;29144:9;29140:17;29133:47;29197:131;29323:4;29197:131;:::i;:::-;29189:139;;28916:419;;;:::o;29341:229::-;29481:34;29477:1;29469:6;29465:14;29458:58;29550:12;29545:2;29537:6;29533:15;29526:37;29341:229;:::o;29576:366::-;29718:3;29739:67;29803:2;29798:3;29739:67;:::i;:::-;29732:74;;29815:93;29904:3;29815:93;:::i;:::-;29933:2;29928:3;29924:12;29917:19;;29576:366;;;:::o;29948:419::-;30114:4;30152:2;30141:9;30137:18;30129:26;;30201:9;30195:4;30191:20;30187:1;30176:9;30172:17;30165:47;30229:131;30355:4;30229:131;:::i;:::-;30221:139;;29948:419;;;:::o;30373:225::-;30513:34;30509:1;30501:6;30497:14;30490:58;30582:8;30577:2;30569:6;30565:15;30558:33;30373:225;:::o;30604:366::-;30746:3;30767:67;30831:2;30826:3;30767:67;:::i;:::-;30760:74;;30843:93;30932:3;30843:93;:::i;:::-;30961:2;30956:3;30952:12;30945:19;;30604:366;;;:::o;30976:419::-;31142:4;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;30976:419;;;:::o;31401:98::-;31452:6;31486:5;31480:12;31470:22;;31401:98;;;:::o;31505:147::-;31606:11;31643:3;31628:18;;31505:147;;;;:::o;31658:386::-;31762:3;31790:38;31822:5;31790:38;:::i;:::-;31844:88;31925:6;31920:3;31844:88;:::i;:::-;31837:95;;31941:65;31999:6;31994:3;31987:4;31980:5;31976:16;31941:65;:::i;:::-;32031:6;32026:3;32022:16;32015:23;;31766:278;31658:386;;;;:::o;32050:271::-;32180:3;32202:93;32291:3;32282:6;32202:93;:::i;:::-;32195:100;;32312:3;32305:10;;32050:271;;;;:::o;32327:179::-;32467:31;32463:1;32455:6;32451:14;32444:55;32327:179;:::o;32512:366::-;32654:3;32675:67;32739:2;32734:3;32675:67;:::i;:::-;32668:74;;32751:93;32840:3;32751:93;:::i;:::-;32869:2;32864:3;32860:12;32853:19;;32512:366;;;:::o;32884:419::-;33050:4;33088:2;33077:9;33073:18;33065:26;;33137:9;33131:4;33127:20;33123:1;33112:9;33108:17;33101:47;33165:131;33291:4;33165:131;:::i;:::-;33157:139;;32884:419;;;:::o
Swarm Source
ipfs://5ba51f86265d6561257ea2f65dab7c626415ccb4c661be91f1942e8faed7c64f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.